翻译自 Waqas Anwar 2021年3月25日的文章 《A Developer’s Guide To Blazor Event Handling》 [1]

如果您正在开发交互式 Web 应用程序,根据不同的应用程序事件和用户操作动态更新用户界面是十分常见的做法。这些操作会触发事件,而作为开发人员,我们的工作是使用一些事件处理技术来处理这些事件。Blazor 内置支持处理多种事件,比如 onclick、onchange 和 onmousemove 等,并为开发者提供了处理这些事件的多种方式。我将在本教程中概述 Blazor 事件处理。此外,我还将介绍如何在 Blazor 中使用事件参数和 Lambda 表达式,以及如何将附加参数传递给事件处理程序。

Blazor 事件处理入门

Blazor 中处理事件的基本语法如下所示:

@on[DOM EVENT]="[DELEGATE]"

在上面的语法中

  • [DOM EVENT] 是 DOM 事件的占位符,例如 click、mouseup 等。

  • [DELEGATE] 是 C# 委托事件处理程序的占位符。

假设您要处理按钮单击事件,您可以按如下方式使用上述语法:

<button @onclick="Update" />

让我们通过一些实际的例子来更详细地介绍一下事件处理。在 Visual Studio 2019 中创建一个新的 Blazor Server 应用程序,然后添加一个新的 Blazor 组件 Calculator.razor

@page "/calculator"<h3>Calculator</h3><div class="form-group"><label for="number1">Number 1</label><input type="number" class="form-control" id="number1" @bind="number1">
</div>
<div class="form-group"><label for="number2">Number 2</label><input type="number" class="form-control" id="number2" @bind="number2">
</div>
<div class="form-group"><label><b>Total: </b>@total</label>
</div><button class="btn btn-primary" @onclick="Calculate">Calculate</button>
<button class="btn btn-secondary" @onclick="Clear">Clear</button>@code {private int number1 = 0;private int number2 = 0;private int total = 0;private void Calculate(){total = number1 + number2;}private void Clear(){number1 = 0;number2 = 0;total = 0;}
}

上面的组件中有两个按钮:Calculate 和 Clear,它们都处理了 onclick 事件,并调用了上面的 @code 代码块中编写的 Calculate 和 Clear 方法。

<button class="btn btn-primary" @onclick="Calculate">Calculate</button>
<button class="btn btn-secondary" @onclick="Clear">Clear</button>

如果您运行这个简单的示例,将看到类似于以下内容的页面。在文本框中输入一些数字,然后按下按钮查看事件处理的效果。

如下面的代码片段所示,Blazor 还支持异步委托事件处理程序。这些处理程序类型会返回一个 Task,在其内部我们可以使用 await 关键字调用异步方法。

private async Task Clear()
{await Task.Delay(10);number1 = 0;number2 = 0;total = 0;
}

理解 Blazor 事件参数

大部分 Blazor 事件支持事件参数,这些参数是携带触发事件的相关信息的对象。例如,KeyboardEventArgs 可以为我们提供用户按下的按键的详细信息。

让我们创建一个带有标准的 HTML div 元素的基本组件,如下所示。

@page "/mouseevents"<h3>Mouse Events</h3><div style="width: 400px; height: 400px; background: lightblue" @onmousemove="Move"></div>
<label><b>Coordinates: </b>@coordinates</label>@code {private string coordinates = "";private void Move(MouseEventArgs e){coordinates = $"{e.ScreenX}:{e.ScreenY}";}
}

上面的 div 元素处理 onmousemove 事件并将 MouseEventArgs 传递给方法名为 Move 的事件处理程序。然后,Move 事件处理程序使用 MouseEventArgs 类中提供的 ScreenX 和 ScreenY 属性,用鼠标的 X 和 Y 位置更新本地字段 coordinates。运行应用程序,并尝试在 div 中移动鼠标,您将看到坐标会实时更新。

Blazor 支持大量的 EventArgs 对象,但最常用的 EventArgs 如下表所示:

您可以在微软 Blazor 文档页面[2]上看到 EventArgs 的完整列表。

在 Blazor 事件中使用 Lambda 表达式

Blazor 还支持将 Lambda 表达式作为委托事件处理程序。您应当只在简单的用例中使用这些表达式,如果有很多的代码要执行,应避免使用 Lambda 表达式。让我们修改一下前面的 Calculator 示例,这次使用 Lambda 表达式替代上面的 Calculate 和 Clear 方法。

@page "/calculator"
<h3>Calculator</h3>
<div class="form-group"><label for="number1">Number 1</label><input type="number" class="form-control" id="number1" @bind="number1">
</div>
<div class="form-group"><label for="number2">Number 2</label><input type="number" class="form-control" id="number2" @bind="number2">
</div>
<div class="form-group"><label><b>Total: </b>@total</label>
</div><button class="btn btn-primary" @onclick="@(e => total = number1 + number2)">Calculate</button>
<button class="btn btn-secondary" @onclick="@(e => total = number1 = number2 = 0)">Clear</button>@code {private int number1 = 0;private int number2 = 0;private int total = 0;
}

向事件处理程序传递附加参数

有时,我们希望根据每个应用程序的需要向事件处理程序传递额外的参数。例如,在一个循环中,您可能希望将循环迭代索引号传递给事件参数,以便您知道此事件处理程序是针对循环中的哪一项执行的。另一个简单的例子是,从两个或多个控件调用相同的事件处理程序,并传递控件的引用以处理事件。让我们用一个基础的例子来介绍一下这个概念。依照下面的代码片段再次修改 Calculator 的代码。

<div class="form-group"><label for="number1">Number 1</label><input type="number" class="form-control" id="number1" @bind="number1">
</div><div class="form-group"><label for="number2">Number 2</label><input type="number" class="form-control" id="number2" @bind="number2">
</div><div class="form-group"><label><b>Total: </b>@total</label>
</div><button class="btn btn-primary" @onclick="@(e => Calculate(e, 1))">Add</button>
<button class="btn btn-primary" @onclick="@(e => Calculate(e, 2))">Subtract</button><button class="btn btn-secondary" @onclick="Clear">Clear</button>@code {private int number1 = 0;private int number2 = 0;private int total = 0;private void Calculate(MouseEventArgs e, int buttonType){switch (buttonType){case 1:total = number1 + number2;break;case 2:total = number1 - number2;break;}}private void Clear(){number1 = 0;number2 = 0;total = 0;}
}

在上面代码片段中,重要的两行如下,我将一个附加参数传递给了 Calculate 方法,其值分别为 1 和 2

<button class="btn btn-primary" @onclick="@(e => Calculate(e, 1))">Add</button>
<button class="btn btn-primary" @onclick="@(e => Calculate(e, 2))">Subtract</button>

方法 Calculate 的代码也略有修改,因为现在它接受一个额外的参数 buttonType。在此方法中,我们根据 buttonType 参数的值进行加法或减法运算。

private void Calculate(MouseEventArgs e, int buttonType)
{switch (buttonType){case 1:total = number1 + number2;breakcase 2:total = number1 - number2;break;}
}

再次运行应用程序,并尝试点击 Add 和 Subtract 方法,您会看到相同的 Calculate 方法给了我们不同的结果。

相关阅读:

  • Blazor Server 和 WebAssembly 应用程序入门指南

  • Blazor 组件入门指南

  • Blazor 数据绑定开发指南

  • Blazor 事件处理开发指南(本文)


相关链接:

  1. https://www.ezzylearning.net/tutorial/a-developers-guide-to-blazor-event-handling A Developer’s Guide To Blazor Event Handling ↩︎

  2. https://docs.microsoft.com/zh-cn/aspnet/core/blazor/components/event-handling ASP.NET Core Blazor 事件处理 ↩︎

作者 :Waqas Anwar
译者 :技术译民
出品 :技术译站(https://ITTranslator.cn/)

Blazor 事件处理开发指南相关推荐

  1. Blazor 数据绑定开发指南

    翻译自 Waqas Anwar 2021年3月21日的文章 <A Developer's Guide to Blazor Data Binding> [1] 现如今,大多数 Web 应用程 ...

  2. Blazor 组件库开发指南

    翻译自 Waqas Anwar 2021年5月21日的文章 <A Developer's Guide To Blazor Component Libraries> [1] Blazor 的 ...

  3. Blazor 模板化组件开发指南

    翻译自 Waqas Anwar 2021年4月15日的文章 <A Developer's Guide To Blazor Templated Components> [1] 在我之前的一篇 ...

  4. Blazor 路由及导航开发指南

    翻译自 Waqas Anwar 2021年4月2日的文章 <A Developer's Guide To Blazor Routing and Navigation> [1] 检查传入的请 ...

  5. 积木Sketch插件进阶开发指南

    前段时间,美团外卖技术团队积木Sketch插件"意外走红".为了帮助更多的设计师小哥哥.小姐姐落地设计规范,提升产研效率,积木Sketch团队开始着手打造一个平台化的产品.本文介绍 ...

  6. FastReport开发指南

    <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> FastRep ...

  7. 关于《Swift开发指南》背后的那些事

    时间轴(倒叙) 2014年8月底 在图灵出版社的大力支持下,全球第一本全面.系统.科学的,包含本人多年经验的呕心沥血之作<Swift开发指南>(配有同步视频课程和同步练习)全线重磅推出 2 ...

  8. 开发指南5——Vue API 盲点解析

    开发指南篇 5:Vue API 盲点解析 在了解了一些实用的开发技巧和编码理念后,我们在项目的开发过程中难免也会遇到因为不熟悉 Vue API 而导致的技术问题,而往往就是这样的一些问题消耗了我们大量 ...

  9. 小程序标准化Demo及开发指南

    1用户指南 云视通小程序支持体验自有设备,试用云视通设备,根据提示填写账号信息和设备信息,单击立即体验,进入自有设备播放页,体验设备实时直播,实时截图保存至手机系统相册. 1.1 wx搜索" ...

最新文章

  1. 你面试稳了!通关LeetCode刷题完整攻略,省时又高效
  2. 紧随时代发展 安防消费也在悄然发生改变
  3. 【TFS】TFS2015链接TFS出现TF31002/TF400324问题解决方案
  4. CloudStack管理员文档 - 服务方案
  5. python 技术篇-使用logging日志模块自定义时间格式
  6. Hexo+github搭建个人博客-环境搭建篇
  7. C语言程序设计 | 指针(二):常量指针和指针常量、数组参数和指针参数、函数指针数组
  8. 云服务器文件打包,云服务器文件打包
  9. C 语言日期时间处理
  10. xp系统更新的服务器失败是怎么回事啊,xp系统显示“服务器错误500”的两种解决方法...
  11. 在metasploitable里面搭建ZVulDrill
  12. 解析json结构绘制canvas
  13. 凌云一周看点 | 什么是云原生数据库;因云而生的云原生网络;大型团队如何从0到1自建SRE体系;空间数据模型之从CAD到BIM...
  14. 华为游戏帧率测试的软件,华为手机怎么在游戏内显示帧率 | 手游网游页游攻略大全...
  15. android studio在夜神上打开_Android Studio 调用夜神模拟器
  16. linux 打开关闭CPU超线程和查看逻辑CPU的个数
  17. linux设置搜狗输入法,Ubuntu系统安装和使用搜狗输入法
  18. 如何查看自己是否被微信好友删除
  19. 谷歌黑客搜索看这些就够了!
  20. Python wxpy 操作微信 大全集

热门文章

  1. 几道web题简单总结
  2. Boosting(提升方法)之GBDT
  3. 通过用 .NET 生成自定义窗体设计器来定制应用程序
  4. java爬虫-简单爬取网页图片
  5. php扩展开发1--添加函数
  6. Cannot resolve the collation conflict between SQL_Latin1_General_CP1_CI_AS and Latin1_General_100...
  7. Android学习笔记(1)
  8. linux之拷贝文件/备份文件;按照原来的权限和日期拷贝.
  9. 使用Azure轻松实现Teams App的全球合规性
  10. ActiveMQ与spring整合