网站建设实习小结,动画设计专业就业前景,中国铁道建筑集团有限公司,企业软件开发公司原文链接#xff1a;https://blazor-university.com/components/component-events/组件事件源代码[1]EventCallbackT 类是一个特殊的 Blazor 类#xff0c;可以作为参数公开#xff0c;以便组件可以在发生感兴趣的事情时轻松通知使用者。一旦声明了 EventCallbackhttps://blazor-university.com/components/component-events/组件事件源代码[1]EventCallbackT 类是一个特殊的 Blazor 类可以作为参数公开以便组件可以在发生感兴趣的事情时轻松通知使用者。一旦声明了 EventCallbackT 类型的公共属性并使用 [Parameter] 属性进行了修饰使用组件就可以在 Razor 标记中指定触发事件时要调用的方法。向 Counter 组件添加事件在新的 Blazor 应用中编辑 /Pages/Counter.razor 文件并添加新的回调参数。[Parameter]
public EventCallbackint OnMultipleOfThree { get; set; }这声明了一个名为 OnMultipleOfThree 的新 EventCallback任何使用组件都可以注册它。int 指定事件回调发出的值将是 System.Int32。现在如果我们编辑 IncrementCount 方法我们可以在计数器增加到 3 的倍数时发出此事件。private async Task IncrementCount()
{currentCount;if (currentCount % 3 0)await OnMultipleOfThree.InvokeAsync(currentCount);
}订阅 EventCallback编辑 /Pages/Index.razor 页面以便我们嵌入 Counter 组件并订阅其 OnMultipleOfThree 事件。将其标记更改为以下内容。page /Last multiple of three LastMultipleOfThreeCounter OnMultipleOfThreeUpdateLastMultipleOfThreeValue/code
{int LastMultipleOfThree 0;private void UpdateLastMultipleOfThreeValue(int value){LastMultipleOfThree value;}
}第 9 行声明一个 int 类型的类成员它存储 3 值的最后一个倍数。第 3 行显示 LastMultipleOfThree 的值第 5 行嵌入 Counter 组件并设置其 OnMultipleOfThree 事件以在发出事件时执行 UpdateLastMultipleOfThreeValue 方法。第 11 行从事件接收到的值用于更新 LastMultipleOfThree 的值。EventCallback和 .NET 事件之间的区别单播与多播最显着的区别是 EventCallbackT 是单播事件处理程序而 .NET 事件是多播。Blazor EventCallbackT 旨在分配单个值并且只能回调单个方法。// Setting a Blazor EventCallback
MyComponent SomeEventMyMethodToCall/// Setting a .NET event
MyComponent.SomeEvent MyMethodToCall;
// Unscrubscribing from the event
MyComponent.SomeEvent - MyMethodToCall;类与结构.NET 事件委托是类而 Blazor EventCallbackT 是只读结构。与 .NET 委托不同EventCallbackT 不能为 null因此在发出事件时无需进行任何 null 检查。// Invoking a .NET event
MyNetEvent?.Invoke(this, someValue);// Invoking a CallbackEventT
MyEventCallback.InvokeAsync(someValue);等待回调标准 .NET 事件是同步的而 Blazor EventCallbackT 是异步的。正如我们在前面的示例代码中看到的EventCallbackT.InvokeAsync 返回一个可以等待的 Task。Razor 标记兼容性无法使用 [Parameter] 装饰标准 .NET 事件并通过 Razor 标记设置它而使用 EventCallbackT 可以。这使我们能够在视图标记本身中表达事件回调这使得开发人员的意图更容易看到。自动状态变化检测每当从 EventCallbackT 调用方法时在方法执行后Blazor 将在使用组件上执行 StateHasChanged()以便在方法调用更改状态时重新渲染它。如果使用者的方法是通过标准 .NET 事件、Action或不是由 EventCallbackT 发起的任何其他方法回调的则不会发生这种情况。例如如果我们将一个新的 [Parameter] 添加到 Actionint 类型的 Counter 组件中并在当前计数是 2 的倍数时调用它我们可以看到使用组件的渲染行为是如何受到影响的。更改 Counter 组件以匹配以下代码page /counterh1Counter/h1pCurrent count: currentCount/pbutton classbtn btn-primary onclickIncrementCountClick me/buttoncode {private int currentCount 0;[Parameter]public Actionint OnMultipleOfTwoAction { get; set; }[Parameter]public EventCallbackint OnMultipleOfThree { get; set; }private async Task IncrementCount(){currentCount;if (currentCount % 2 0)OnMultipleOfTwoAction?.Invoke(currentCount);if (currentCount % 3 0)await OnMultipleOfThree.InvokeAsync(currentCount);}
}第 13 行添加了 Actionint 类型的 [Parameter]第 21-22 行如果当前计数是 2 的倍数则调用 OnMultipleOfTwoAction现在更改 Index 组件使其在值为 2 的倍数时设置回调方法因此它也会存储并显示从 OnMultipleOfTwoAction 接收到的最后一个数字在使用的组件上。page /ulliLast multiple of two LastMultipleOfTwo/liliLast multiple of three LastMultipleOfThree/li
/ulCounter OnMultipleOfThreeUpdateLastMultipleOfThreeValue OnMultipleOfTwoActionUpdateLastMultipleOfTwoValue /code
{int LastMultipleOfTwo 0;int LastMultipleOfThree 0;private Task UpdateLastMultipleOfThreeValue(int value){LastMultipleOfThree value;return Task.CompletedTask;}private void UpdateLastMultipleOfTwoValue(int value){LastMultipleOfTwo value;}
}第 13 行定义一个新成员来存储从使用组件传递的最新“二的倍数”值第 4 行在用户界面中显示 LastMultipleOfTwo 的值第 9 行在使用的组件上设置 OnMultipleOfTwo 以便在当前值是 2 的倍数时通知我们的组件第 24 行记录使用组件通知我们的最后 2 的倍数当我们现在运行应用程序并多次单击按钮时我们会看到当通过 Actionint 回调 UpdateLastMultipleOfTwoValue 时视图没有更新但是当下一次单击通过 EventCallbackint 回调 UpdateLastMultipleOfThreeValue 时视图更新并显示两者的最新值。事件顺序点击计数回调执行使用者重新渲染1无N/A2ActionintNo3Actionint EventCallbackintYes4ActionintNo5NoneN/A6Actionint EventCallbackintYesEventCallbackT 通常回调带有签名 private Task SomeName(T value)的方法——其中方法的暴露级别并不重要。但是Blazor 将允许我们设置一个 EventCallbackT 来回调具有几个变体的方法。如果我们的方法不执行任何异步操作那么下面的实现可能会开始变得乏味public Task SomethingHappenedInChildComponent(string value)
{// Do something with valuereturn Task.CompletedTask;
}因此Blazor 将允许我们设置 EventCallbackT 以回调具有 void 返回类型的方法。public void SomethingHappenedInChildComponent(string value)
{// Do something with value
}有时我们只想知道一个事件何时发生而不是对它传递的值感兴趣。Blazor 还将回调一个排除 value 参数的方法。// Either
public void SomethingHappenedInChildComponent()
{// Do something that doesnt need the value
}// Or
public Task SomethingHappenedInChildComponent()
{// Do some asynchronous work that doesnt need the valuereturn SomeTask;
}浏览器 DOM 事件呈现任何标记时可以在呈现的 HTML 元素上分配标准 JavaScript 事件以便执行我们自己的 Blazor C# 方法。例如我们在其他地方的许多示例中使用了 onclick 指令button onclickButtonClickedClick me/button这些事件指令在 Visual Studio 编辑器中具有完整的 IntelliSense 支持因此开始键入 符号应该会为我们提供可用指令的完整列表以及标识事件在我们的事件处理程序中传递给我们的参数类类型的描述。DOM 事件以 on 开头。将“onabort”属性设置为提供的字符串或委托值。委托值应为“Microsoft.AspNetCore.Components.Web.ProgressEventArgs”类型警告在编写完全在服务器上运行的 Blazor 应用程序时Blazor 将 hook 浏览器中的事件并将它们发送到服务器以便可以调用我们的 C# 方法。这可能会导致频繁触发的事件例如 onmousemove明显变慢。注意 因为 C# 方法的 JavaScript 调用是异步的这意味着在 C# 方法中我们不能像在 JavaScript 中那样取消事件。这是因为取消浏览器 DOM 事件是一个同步操作当我们的 C# 被异步调用时取消事件已经太迟了。可用的 DOM 事件及其参数类型包括一般事件DOM 事件参数类型onactivateEventArgsonbeforeactivateEventArgsonbeforedeactivateEventArgsondeactivateEventArgsonendedEventArgsonfullscreenchangeEventArgsonfullscreenerrorEventArgsonloadeddataEventArgsonloadedmetadataEventArgsonpointerlockchangeEventArgsonpointerlockerrorEventArgsonreadystatechangeEventArgsonscrollEventArgs焦点事件DOM 事件参数类型onfocusFocusEventArgsonblurFocusEventArgsonfocusinFocusEventArgsonfocusoutFocusEventArgs鼠标事件DOM 事件参数类型onmouseoverMouseEventArgsonmouseoutMouseEventArgsonmousemoveMouseEventArgsonmousedownMouseEventArgsonmouseupMouseEventArgsonclickMouseEventArgsondblclickMouseEventArgsoncontextmenuMouseEventArgsonwheelWheelEventArgsonmousewheelWheelEventArgs拖动事件DOM 事件参数类型ondragDragEventArgsondragendDragEventArgsondragenterDragEventArgsondragleaveDragEventArgsondragoverDragEventArgsondragstartDragEventArgsondropDragEventArgs键盘事件DOM 事件参数类型onkeydownKeyboardEventArgsonkeyupKeyboardEventArgsonkeypressKeyboardEventArgs输入事件DOM 事件参数类型onchangeChangeEventArgsoninputChangeEventArgsoninvalidEventArgsonresetEventArgsonselectEventArgsonselectstartEventArgsonselectionchangeEventArgsonsubmitEventArgs剪贴板事件DOM 事件参数类型onbeforecopyEventArgsonbeforecutEventArgsonbeforepasteEventArgsoncopyClipboardEventArgsoncutClipboardEventArgsonpasteClipboardEventArgs触摸事件DOM 事件参数类型ontouchcancelTouchEventArgsontouchendTouchEventArgsontouchmoveTouchEventArgsontouchstartTouchEventArgsontouchenterTouchEventArgsontouchleaveTouchEventArgs指针事件DOM 事件参数类型ongotpointercapturePointerEventArgsonlostpointercapturePointerEventArgsonpointercancelPointerEventArgsonpointerdownPointerEventArgsonpointerenterPointerEventArgsonpointerleavePointerEventArgsonpointermovePointerEventArgsonpointeroutPointerEventArgsonpointeroverPointerEventArgsonpointerupPointerEventArgs多媒体事件DOM 事件参数类型oncanplayEventArgsoncanplaythroughEventArgsoncuechangeEventArgsondurationchangeEventArgsonemptiedEventArgsonpauseEventArgsonplayEventArgsonplayingEventArgsonratechangeEventArgsonseekedEventArgsonseekingEventArgsonstalledEventArgsonstopEventArgsonsuspendEventArgsontimeupdateEventArgsonvolumechangeEventArgsonwaitingEventArgs进度事件DOM 事件参数类型onloadstartProgressEventArgsontimeoutProgressEventArgsonabortProgressEventArgsonloadProgressEventArgsonloadendProgressEventArgsonprogressProgressEventArgsonerrorErrorEventArgs参考资料[1]源代码: https://github.com/mrpmorris/blazor-university/tree/master/src/Components/EventCallbacks