Содержание
В 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]"
. В обработчик события можно передавать свои параметры, используя лямбда-выражения.