Содержание
В Blazor для обработки каких-либо событий элементов (например, клик по элементу, потеря фокуса и т.д.) используется следующий синтаксис: @on[EVENT]="[DELEGATE]", где EVENT — это какое-либо событие DOM, а DELEGATE — обработчик события делегата в компоненте Blazor.
Пример обработчика события в Blazor
Самый первый пример обработчика события в Blazor можно увидеть в компоненте Counter, который входит в шаблон приложения Blazor Server:
@page "/counter"
<PageTitle>Counter</PageTitle>
<h1>Counter</h1>
<p role="status">Current count: @currentCount</p>
<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>
@code {
private int currentCount = 0;
private void IncrementCount()
{
currentCount++;
}
}
Здесь у кнопки определен обработчик события click. Поддержка привязки событий в Blazor содержится в пространстве имен Microsoft.AspNetCore.Components.Web. Так, в этом пространстве имен определен класс EventHandlers, который содержит атрибуты для настройки сопоставлений между именами событий и типами аргументов событий. Так, например, в EventHandlers содержится следующий атрибут:
[Microsoft.AspNetCore.Components.EventHandler("onclick", typeof(Microsoft.AspNetCore.Components.Web.MouseEventArgs), true, true)]
что говорит нам о том, что обработчик события click может принимать аргумент типа MouseEventArgs. Рассмотрим как мы можем использовать аргументы событий.
Аргументы события
Перепишем код компонента Counter следующим образом:
@page "/counter"
<PageTitle>Counter</PageTitle>
<h1>Counter</h1>
<p role="status">Current count: @currentCount</p>
<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>
@code {
private int currentCount = 0;
private void IncrementCount(MouseEventArgs args)
{
if (args.AltKey)
currentCount *= 10;
else
currentCount++;
}
}
Здесь, в обработчике IncrementCount() мы принимаем агрумент MouseEventArgs и, в зависимости то того, была ли зажата кнопка Alt на клавиатуре либо наращиваем счётчик на единицу, либо умножаем значение счётчика на 10. У класса MouseEventArgs определены следующие свойства:
| Свойство | Описание |
Alt |
значение true , если при срабатывании события была нажата клавиша ALT. в противном случае — значение false . |
Button |
Номер кнопки, который был нажат при срабатывании события мыши: левая кнопка = 0, средняя кнопка = 1 (при наличии), правая кнопка = 2. Для мышей, настроенных для использования с левой стороны, в котором действия кнопки отменяются, значения считываются справа налево. |
Buttons |
Кнопки, которые нажимаются при возникновении события мыши: левая кнопка = 1, правая кнопка = 2, средняя (колесо) = 4, четвертая кнопка (обычно «кнопка браузера назад») = 8, 5-я кнопка (обычно «браузер вперед») = 16. При нажатии двух или более кнопок возвращает логическую сумму значений. Например, если нажата левая кнопка и правая кнопка, возвращает 3 (= 1 | 2). |
ClientX |
Координата X указателя мыши в локальных координатах (DOM-содержимом) |
ClientY |
Координата Y указателя мыши в локальных координатах (DOM-содержимом). |
Ctrl |
значение true , если при срабатывании события клавиша управления была нажата. в противном случае — значение false . |
Detail |
Число последовательных щелчков, произошедших за короткий промежуток времени, с увеличением на единицу. |
Meta |
значение true , если при срабатывании события был отключен ключ meta. в противном случае — значение false . |
OffsetX |
Координата X указателя мыши в относительных координатах (целевом элементе). |
OffsetY |
Координата Y указателя мыши в относительных координатах (целевом элементе). |
PageX |
Координата X указателя мыши относительно всего документа |
PageY |
Координата Y указателя мыши относительно всего документа |
ScreenX |
Координата X указателя мыши в глобальных (экранных) координатах |
ScreenY |
Координата Y указателя мыши в глобальных (экранных) координатах |
Shift |
значение true , если при срабатывании события была нажата клавиша SHIFT. в противном случае — значение false . |
Соответственно, у других классов, являющихся аргументами событий, будет другой набор свойств.
Как передать в обработчик события произвольный агрумент
Иногда бывает необходимым передать в обработчик события в Blazor какой-либо свой аргумент, например, по клику на кнопке мыши передать в обработчик события текст, который был введен пользователем в поле input. Следующий код приведет к ошибке:
<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>
@code {
private int currentCount = 0;
private void IncrementCount(string text)
{
currentCount++;
}
}
В этом случае, нам необходимо использовать лямбда-выражение. Например, так:
<button class="btn btn-primary" @onclick="(() => IncrementCount(тут_параметры_метода))">Click me</button>
Асинхронная обработка событий
Blazor поддерживает асинхронную обработку событий. Асинхронная обработка событий может быть полезна, например, в случае, если в обработчике события идёт обращение к сетевым ресурсам, работа с базой данных и так далее. Например, перепишем код обработки события в компоненте Counter, добавив асинхронную обработку:
private async Task IncrementCount(MouseEventArgs args)
{
@*Имитация бурной деятельности*@
await Task.Delay(1000);
currentCount++;
}
Теперь клик по кнопке будет обновлять счётчик не сразу, а по прошествии одной секунды.
Перечень поддерживаемых в Blazor событий
Ниже представлен перечень всех поддерживаемых в Blazor событий DOM:
| Событие | Класс | События в модели DOM |
|---|---|---|
| Буфер обмена | ClipboardEventArgs |
oncut, oncopy, onpaste |
| Перетаскивание | DragEventArgs |
ondrag, ondragstart, ondragenter, ondragleave, ondragover, ondrop, ondragend |
| Error | ErrorEventArgs |
onerror |
| Событие | EventArgs |
Общие сведенияonactivate, onbeforeactivate, onbeforedeactivate, ondeactivate, onfullscreenchange, onfullscreenerror, onloadeddata, onloadedmetadata, onpointerlockchange, onpointerlockerror, onreadystatechange, onscrollБуфер обменаonbeforecut, onbeforecopy, onbeforepasteВводoninvalid, onreset, onselect, onselectionchange, onselectstart, onsubmitНосительoncanplay, oncanplaythrough, oncuechange, ondurationchange, onemptied, onended, onpause, onplay, onplaying, onratechange, onseeked, onseeking, onstalled, onstop, onsuspend, ontimeupdate, ontoggle, onvolumechange, onwaiting |
| Фокус | FocusEventArgs |
onfocus, onblur, onfocusin, onfocusout
Не включает поддержку |
| Входные данные | ChangeEventArgs |
onchange, oninput |
| Клавиатура | KeyboardEventArgs |
onkeydown, onkeypress, onkeyup |
| Мышь | MouseEventArgs |
onclick, oncontextmenu, ondblclick, onmousedown, onmouseup, onmouseover, onmousemove, onmouseout |
| Указатель мыши | PointerEventArgs |
onpointerdown, onpointerup, onpointercancel, onpointermove, onpointerover, onpointerout, onpointerenter, onpointerleave, ongotpointercapture, onlostpointercapture |
| Колесико мыши | WheelEventArgs |
onwheel, onmousewheel |
| Ход выполнения | ProgressEventArgs |
onabort, onload, onloadend, onloadstart, onprogress, ontimeout |
| Сенсорные технологии | TouchEventArgs |
ontouchstart, ontouchend, ontouchmove, ontouchenter, ontouchleave, ontouchcancel
|
Итого
В Blazor для обработки каких-либо событий элементов используется синтаксис: @on[EVENT]="[DELEGATE]". В обработчик события можно передавать свои параметры, используя лямбда-выражения.