Параметры компонентов Razor

Компоненты Razor могут содержать различные параметры, которые в разметке будут выглядеть как обычные атрибуты html-элементов или вложенные теги. Рассмотрим как мы можем использовать параметры компонентов Razor в наших приложениях Blazor Hybrid

Первый компонент

Для создания своего первого компонента воспользуемся шаблонным приложением Blazor Hybrid. Добавим в папку Components новый компонент. Для этого нажмем правую кнопку мыши на папке и выберем пункт «Компонент Razor»

В открывшемся окне зададим название «SmartCounter» и нажмем кнопку «Добавить»:

Откроется файл содержащий «скелет» нового компонента:

<h3>SmartCounter</h3>

@code {

}

Здесь у нас уже определена директива @code где мы можем размещать логику нашего компонента. В принципе, уже сейчас мы можем воспользоваться нашим компонентом на любой странице нашего компонента. Как мы уже знаем, компоненты Razor добавляются в разметку также, как и обычные html-теги. Например, откроем файл Home.razor и добавим на неё наш компонент:

@page "/"

<h1>Hello, world!</h1>

Welcome to your new app.

<SmartCounter></SmartCounter>

Так как для нашего компонента не требуется никаких вложенных тегов, то мы можем воспользоваться сокращенной записью вот так:

@page "/"

<h1>Hello, world!</h1>

Welcome to your new app.

<SmartCounter/>

В любом случае, компонент будет отображаться на главной странице приложения вот так:

Теперь воспользуемся эти компонентам для изучения темы «Параметры компонентов Razor».

Параметры компонента Razor

Параметры компонента Razor — это обычные публичные свойства C# с автосвойствами у которых определен специальный атрибут [Parameter]. Например, создадим для нашего компонента свойство, которое будет отвечать за заголовок:

<h3>@Title</h3>

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

Здесь мы добавили параметр компонента с именем Title и, затем, в разметке компонента используем неявное выражение Razor, чтобы вывести значение параметра.

Параметры компонента определяются в разметке Razor как обычные атрибуты html-компонента. Определим значение Title на странице Home.razor:

@page "/"

<h1>Hello, world!</h1>

Welcome to your new app.

<SmartCounter Title="Smart-счётчик"/>

Теперь запустим приложение и посмотрим на результат:

Обязательные параметры

Сейчас для параметра Title не назначается никакого значения. При необходимости, мы можем сделать параметр обязательным, добавив к нему атрибут [EditorRequired].

<h3>@Title</h3>

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

Стоит отметить, что атрибут [EditorRequired] не гарантирует, что параметр не будет содержать null, но в редакторе кода мы будем видеть следующее предупреждение:

Мы можем немного сократить определение обязательного параметра и записать атрибуты [Parameter] и [EditorRequired] в одну строку вот так:

[Parameter, EditorRequired]
public string Title { get; set; }

Доработка компонента

Добавим в наш компонент так, чтобы можно было и прибавлять и отнимать значения счётчика, а также задавать его начальное значение. Для этого нам потребуется ещё один параметр и пара методов:

<h3>@Title</h3>
<br />
<p>Значение: @Count</p>
<button @onclick="IncrementCounter">Прибавить 1</button>
<button @onclick="DecrementCounter">Отнять 1</button>

@code {
    [Parameter, EditorRequired]
    public string Title { get; set; }

    [Parameter]
    public int Count { get; set; }

    private void IncrementCounter()
    {
        Count++;  
    }

    private void DecrementCounter()
    {
        Count--;
    }
}

Здесь мы определили новый параметр Count, а также два метода — IncrementCounter() и IncrementCounter(). В разметке компонента мы добавили строку в которой будем выводить значение счётчика:

<p>Значение: @Count</p>

а также две кнопки, которым назначили в качестве обработчиков события onclick наши методы:

<button @onclick="IncrementCounter">Прибавить 1</button>
<button @onclick="DecrementCounter">Отнять 1</button>

Теперь мы можем задать для компонента начальное значение и проверить его работу:

@page "/"

<h1>Hello, world!</h1>

Welcome to your new app.

<SmartCounter Title="Smart-счётчик" Count="10"/>

После запуска приложения мы увидим начальное значение счётчика:

а нажимая кнопки «Прибавить 1» и «Отнять 1» мы будем регулировать его значение.

Передача содержимого из родительского в дочерний компонент

Используя специальный делегат RenderFragment, мы можем передавать содержимое из родительского в дочерний компонент. При этом, в разметке компонента такая передача будет выглядеть как содержимое тега компонента. Делегат RenderFragment выглядит следующим образом:

public delegate void RenderFragment(RenderTreeBuilder builder);

Согласно условностям, свойству, принимающему содержимое RenderFragment, по соглашению необходимо присвоить имя ChildContent. Например, пусть наш счётчик из родительского компонента Home.razor принимает произвольную строку текста:

<h3>@Title</h3>
<p>@ChildContent</p>
<br />
<p>Значение: @Count</p>
<button @onclick="IncrementCounter">Прибавить 1</button>
<button @onclick="DecrementCounter">Отнять 1</button>

@code {
    [Parameter, EditorRequired]
    public string Title { get; set; }

    [Parameter]
    public int Count { get; set; }

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

    private void IncrementCounter()
    {
        Count++;  
    }

    private void DecrementCounter()
    {
        Count--;
    }
}

Параметр ChildContent в разметке компонента мы используем точно также, как и прочие параметры:

<p>@ChildContent</p>

Теперь добавим дочернее содержимое. Перейдем на страницу Home.razor и изменим добавление компонента SmartCounter следующим образом:

@page "/"

<h1>Hello, world!</h1>

Welcome to your new app.

<SmartCounter Title="Smart-счётчик" Count="10">
    <b>Это текст для смарт-счётчика</b>
</SmartCounter>

Запустим приложение и убедимся, что наш компонент выводит дополнительный текст, определенный в его параметре ChildContent:

Как можно видеть по рисунку, в качестве дочернего содержимого мы можем передавать не только строки, но и более сложные элементы, как например в нашем случае — html-код или другие компоненты Razor. Например, создадим ещё один компонент в папке Components с названием CounterFooter:

<h3>CounterFooter</h3>

@code {

}

Выведем содержимое CounterFooter в нашем компоненте счётчика:

@page "/"

<h1>Hello, world!</h1>

Welcome to your new app.

<SmartCounter Title="Smart-счётчик" Count="10">
    <b>Это текст для смарт-счётчика</b>
    <CounterFooter></CounterFooter>
</SmartCounter>

Результат:

Итого

Параметры компонентов Razor — это публичные автосвойства C# для которых определен атрибут [Parameter]. Компоненты Razor могут быть вложенными, например, мы использовали наш компонент SmartCounter как вложенный для другого компонента — страницы Home. Также в компоненты Razor может передаваться содержимое из родительского компонента. Для этого используется специальный параметр с типом RenderFragment и именем ChildContent.

Подписаться
Уведомить о
guest
0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии