Содержание
Наши компоненты Razor так или иначе базируются на стандартных HTML-элементах — кнопках, полях ввода, переключателях и т.д. И нам необходимо уметь обрабатывать события этих элементов в наших компонентах.
Пример обработчика события
Самый первый пример обработчика события мы видим в компоненте Counter
шаблонного приложения Blazor Hybrid
<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>
Здесь для кнопки добавлен обработчик события click
с использованием атрибута директивы @onclick
. Различные HTML-элементы могут предоставлять нам различные события, поэтому, как мы уже знаем, в Razor для обработки событий используется один синтаксис атрибутов директив:
@on[EVENT]=[Delegate]
где EVENT
— название события, а Delegate
— делегат, соответствующий событию.
Аргументы событий
Обработчики событий могут принимать различные аргументы. Например, обработчик @onclick
может принимать аргумент, представленный классом Mouse
. Этот класс предоставляет нам следующие свойства:
Alt |
Определяет была ли нажата клавиша ALT |
Button |
Номер кнопки, нажатой при срабатывании события мыши:
|
Buttons |
Кнопки, нажатые при срабатывании события мыши:
При нажатии двух или более кнопок возвращает логическую сумму значений. |
ClientX |
Координата X указателя мыши в локальных координатах |
ClientY |
Координата Y указателя мыши в локальных координатах |
Ctrl |
Определяет была ли нажата клавиша Ctrl |
Detail |
Количество последовательных щелчков, которые произошли за короткий промежуток времени, с увеличением на единицу. |
Meta |
если возвращает true , то нажата метаклавиша |
MovementX |
Координата X указателя мыши относительно позиции последнего события mousemove . |
MovementY |
Координата Y указателя мыши относительно позиции последнего события mousemove . |
OffsetX |
Координата X указателя мыши в относительных координатах (целевого элемента). |
OffsetY |
Координата Y указателя мыши в относительных координатах (целевого элемента). |
PageX |
Координата X указателя мыши относительно всего документа. |
PageY |
Координата Y указателя мыши относительно всего документа. |
ScreenX |
Координата X указателя мыши в глобальных координатах (экран). |
ScreenY |
Координата Y указателя мыши в глобальных координатах (экран). |
Shift |
Определяет была ли нажата клавиша Shift |
Type |
Возвращает или задает тип события. |
Например, создадим новое приложение Blazor Hybrid и перепишем компонент Counter
следующим образом:
@page "/counter" <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.CtrlKey == false) { currentCount++; } else { currentCount--; } } }
здесь мы использовали аргумент события в обработчике и проверили была ли зажата клавиша Ctrl при клике и в зависимости от этого либо наращиваем счётчик на 1, либо наоборот — уменьшаем. При этом, в разметке компонента ничего не изменилось:
<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>
Можно запустить приложение и убедиться, что при зажатой клавише Ctrl значение счётчика уменьшается на 1:
Blazor предоставляет нам различные встроенные аргументы событий, которые содержатся в пространстве имен Microsoft.
.
Событие | Класс | События в модели DOM |
---|---|---|
Буфер обмена | ClipboardEventArgs |
oncut , oncopy , onpaste |
Перетаскивание | DragEventArgs |
ondrag , ondragstart , ondragenter , ondragleave , ondragover , ondrop , ondragend |
Error | ErrorEventArgs |
onerror |
Событие | EventArgs |
Общие сведенияonactivate , onbeforeactivate , onbeforedeactivate , ondeactivate , onfullscreenchange , onfullscreenerror ,
Ввод
|
Фокус | 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 ,
|
Колесико мыши | WheelEventArgs |
onwheel , onmousewheel |
Ход выполнения | ProgressEventArgs |
onabort , onload , onloadend , onloadstart , onprogress , ontimeout |
Сенсорные технологии | TouchEventArgs |
ontouchstart , ontouchend , ontouchmove , ontouchenter , ontouchleave , ontouchcancel TouchPoint представляет одну точку касания на устройстве с сенсорным вводом. |
Асинхронная обработка событий
Blazor поддерживает асинхронную обработку событий. Асинхронная обработка событий может быть полезна, например, в случае, если в обработчике события идёт обращение к сетевым ресурсам, работа с базой данных и так далее. Например, перепишем код обработки события в компоненте Counter
, добавив асинхронную обработку:
@page "/counter" <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 async Task IncrementCount(MouseEventArgs args) { await Task.Delay(1000); if (args.CtrlKey == false) { currentCount++; } else { currentCount--; } } }
Здесь метод IncrementCount()
асинхронный. Можно запустить приложение и убедиться, что счётчик изменяет свое значение через секунду после клика по кнопке.
Использование лямбда-выражений
Для обработки событий необязательно создавать отдельный метод — мы можем также использовать лямбда-выражения. Например так:
@page "/counter" <h1>Counter</h1> <p role="status">Current count: @currentCount</p> <button class="btn btn-primary" @onclick="@((args)=> { if (args.CtrlKey) currentCount--; else currentCount++; })">Click me</button> @code { private int currentCount = 0; }
здесь args
— это объект класса MouseEventArgs
. Можно запустить приложение и убедиться, что оно работает точно также, как и раньше.
Используя лямбда-выражения, мы также можем передавать в обработчики событий произвольные аргументы. Например, так:
@page "/counter" <h1>Counter</h1> <p role="status">Current count: @currentCount</p> <button class="btn btn-primary" @onclick="(e=>Click(e, 10))">Click me</button> @code { private int currentCount = 0; private void Click(MouseEventArgs args, int data) { if (args.CtrlKey) currentCount -= data; else currentCount += data; } }
Запустите приложение и убедитесь, что теперь счётчик наращивается сразу на 10:
Итого
Обработка событий в html-элементах осуществляется с использованием директив атрибутов @on[Event]
. В обработчиках событий могут использоваться аргументы событий. Blazor содержит ряд предопределенных аргументов событий. Также, для определения обработчика события не обязательно использовать отдельные методы — мы можем использовать для этих целей лямбда-выражения.