Как добавить HTML-атрибуты (класс и т.д.) к компонентам Blazor?

#blazor #blazor-server-side #blazor-webassembly

#blazor #blazor-на стороне сервера #blazor-webassembly

Вопрос:

Это кажется очень простым вопросом, но мне еще предстоит найти ответ, который я ищу.

Допустим, у вас есть вызываемый компонент Blazor <Button> , у этого компонента есть такие параметры, как Label , и т.д. Эти параметры принимаются как атрибуты HTML при использовании компонента:

 <Button Label="Sign Up" />
 

Но как вы устанавливаете фактические атрибуты HTML для компонента ?! Например, допустим, вы хотите присвоить дополнительные классы элементу, который представляет компонент, или атрибуту заголовка, или роли, или типу и т.д. Очевидно, что следующее не сработает, поскольку ожидается, что все атрибуты тега компонента будут параметрами этого компонента:

 <Button Label="Sign Up" class="foo" type="submit" id="bar" />
 

Итак, единственный способ, который я могу придумать, — это объявить параметр (общедоступное свойство) для каждого из этих атрибутов внутри этого компонента.

 <button type="@Type" class="button @Class" id="@Id">@Label</button>

@code {
    [Parameter]
    public string Class { get; set; }

    [Parameter]
    public string Type { get; set; }

    [Parameter]
    public string Role { get; set; }

    [Parameter]
    public string Id { get; set; }

    // And others
}
 

И затем при использовании компонента вы делаете это:

 <Button Label="Sign Up" Class="foo" Id="bar" Type="Submit" />
 

Но это, очевидно, не кажется идеальным. Это неудобно, и кажется ненужным слоем абстракции.

Итак, мой вопрос таков: как это должно быть сделано? Каков «стандартный» способ сделать это, если есть такая вещь. Разве нет более удобного способа сделать это, чем объявление параметров для каждого атрибута?

Я новичок в SPA-фреймворках в целом, поэтому я также хотел бы знать, как это обычно делается и в других SPA-фреймворках (например, React, Angular, Vue и т. Д.)

Спасибо.

Комментарии:

1. Посмотрите на разбиение атрибутов. docs.microsoft.com/en-us/aspnet/core/blazor/components /…

2. @BrianParker Ах, спасибо! Вы можете опубликовать ответ, и я отмечу его как принятый ответ.

Ответ №1:

Вы после разбиения атрибутов :

 <button @attributes="@InputAttributes">@ChildContent</button>

@code {
    [Parameter(CaptureUnmatchedValues = true)]
    public Dictionary<string, object> InputAttributes { get; set; }

    [Parameter]
    public RenderFragment ChildContent { get; set; }
}