Содержание
Компоненты 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.




