Hello Blazor:(11)全局截获事件执行

前言

在Blazor中,我们使用@on{DOM EVENT}="{DELEGATE}"这样的Razor语法在组件标记中指定委托事件处理程序:

<button @onclick="IncrementCount">Click me</button>

但是没有提供解除委托的方法。

比如,我们需要在某种条件下才执行事件处理:

有不有阻止事件触发的方案呢?

常规解决方案

我们可以在委托事件处理程序中加上判断:

<button @onclick="()=> { if (!checkedValue) { IncrementCount(); } }">Click me</button>

但是,如果有多个组件都需要加上这个判断,这样写感觉比较繁琐。

有不有更简化的方法?

深入分析

在前面的文章中,我们已经知道Blazor组件实际上会编译成C#语句。

在obj\Debug\net5.0\Razor\Pages目录下,可以看到@onclick="IncrementCount"对应的代码如下:

__builder.AddAttribute(13, "onclick",Microsoft.AspNetCore.Components.EventCallback.Factory.Create<Microsoft.AspNetCore.Components.Web.MouseEventArgs>(this, IncrementCount));

原来是创建了一个EventCallback事件回调。

在github上查找到EventCallback.Factory.Create的实现源码[1]

private EventCallback CreateCore(object receiver, MulticastDelegate callback)
{return new EventCallback(callback?.Target as IHandleEvent ?? receiver as IHandleEvent, callback);
}

上面代码的意思,如果callback的来源是IHandleEvent,则实际回调的是IHandleEvent实现。

也就是说,只需要组件继承IHandleEvent,那么就可以控制组件上所有的事件回调了。

实现

修改代码如下:

@implements IHandleEventTask IHandleEvent.HandleEventAsync(EventCallbackWorkItem callback, object arg)
{System.Console.WriteLine("HandleEven");return callback.InvokeAsync(arg);
}private void IncrementCount()
{System.Console.WriteLine("Clicked...");currentCount++;
}

运行后可以看到,确实先执行的HandleEventAsync,再执行的@onclick实现:

结论

通过本文,我们可以了解到,只要在组件上继承IHandleEvent,就可以实现全局截获事件回调。

但是,你会发现有一个问题,Current count没有发生变化!

这是为什么呢?请听下回分解!

参考资料

[1]

实现源码: https://github.com/dotnet/aspnetcore/blob/main/src/Components/Components/src/EventCallbackFactory.cs

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/298764.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ActionEnglish Notes

ActionEnglish 1 1. sound engineer 录音师2. Rumor has it that * 人们都说… 据说… * Rumor has it that Andy is a nice guy. * Rumar has it that he is a rather difficult sound engineer. * 类似的还有&#xff1a;It is said that… * 类似的还有&#xff1a;it is …

Hashtable, ArrayList, List, Dictionary学习

Hashtable用法 在.NET Framework中&#xff0c;Hashtable是System.Collections命名空间提供的一个容器&#xff0c;用于处理和表现类似key/value的键值对&#xff0c;其中key通常可用来快速查找&#xff0c;同时key是区分大小写&#xff1b;value用于存储对应于key的值。Hashta…

深度学习会不会被取代?深度学习必看发展史

近年来&#xff0c;随着人工智能时代的来临&#xff0c;数据科学、计算机科学迎来飞速发展&#xff0c;多次引发讨论的人机对战也正是人工智能与人类的对决。从无人驾驶汽车到AlphaGo战胜人类&#xff0c;机器学习成为了当下最热门的技术。而机器学习中一种重要的方法就是深度学…

Xcode6中如何对scrollview进行自动布局(autolayout)

本文转载至 http://www.cocoachina.com/ios/20141011/9871.html XCodeAutolayoutscrollView Xcode6中极大的增强了IB中自动布局的能力&#xff0c;下面就通过对刺儿头scrollview进行一次自动布局实战&#xff0c;看看自动布局在Xcode6中到底值不值得使用。 说 UIScrollView是个…

linux文件读保护,Linux Rootkit实现文件保护

一个非常基础的rootkit&#xff0c;禁止读取指定文件编译系统:CentOS 7uname -r3.10.0-957.21.3-el7.x86_64#include #include #include asmlinkage long(*real_open)(const char __user *filename, int flags, unsigned short mode);unsigned long **syscall_table NULL;char…

react: useEffect

可以吧useEffect看作是componentDidMount componentDidUpdate componentWillUnmount 三个函数的组合 在https://ant.design/components/button-cn 打开一个codesanbox&#xff0c; 替换下面代码 import React, { useEffect, useState } from "react"; import ReactD…

python的网页解析器_python 之网页解析器

一、什么是网页解析器 1、网页解析器名词解释 首先让我们来了解下&#xff0c;什么是网页解析器&#xff0c;简单的说就是用来解析html网页的工具&#xff0c;准确的说&#xff1a;它是一个HTML网页信息提取工具&#xff0c;就是从html网页中解析提取出“我们需要的有价值的数据…

JWT:我应该使用哪种签名算法?

JWT&#xff1a;我应该使用哪种签名算法&#xff1f;JSON Web Token (JWT) 可以使用许多不同的算法进行签名&#xff1a;RS256、PS512、ES384、HS1&#xff1b;当被问及他们想使用哪一个时&#xff0c;您就会明白为什么有些开发人员会挠头。根据我的经验&#xff0c;许多主流身…

写一个聊天辅助程序

Codeprocedure TForm1.Button1Click(Sender: TObject);varhParent,hButton,hMemo: HWND;beginMemo1.SelectAll;//Memo内容全选Memo1.CopyToClipboard;//把Memo中选中的语句拷贝到剪贴板中try//找发送消息的QQ窗口hParent : FindWindow(nil, 发送消息);//然后找回话时用的编辑窗…

真是个狠人!开学第一天,这批小学生的造型刷爆朋友圈!

全世界只有3.14 % 的人关注了爆炸吧知识在史上最长的长假过后杭州一二三年级小学生回到学校忘记座位在哪里、老师姓什么各种有趣故事不断……而在养正小学门口&#xff0c;从入校门开始&#xff0c;大家笑声就不断&#xff0c;别样的开学礼一下刷屏了朋友圈&#xff1a;每个小朋…

Linux系统断电后起不来,centos/linux 断电后,开机光标闪现不能开启,重新引导

一台工作站在某次断电以后不能正常重启了。主板的文字结束后&#xff0c;就只剩下光标在闪。开机&#xff0c;观察还能进行bios设置&#xff0c;主板没有问题。用u盘能启动操作系统&#xff0c;可以查看硬盘。所以硬件没有问题。猜想是引导出问题了。阅读了以下文章&#xff1a…

SCM基础之过程描述

软件开发一般分为&#xff1a;计划阶段、开发阶段和维护阶段 计划阶段&#xff1a;总体研发计划 -> 配置管理计划&#xff1a; CCB确定开发计划中的里程碑和开发策略CMO&#xff08;配置管理员&#xff09;根据CCB规划&#xff0c;制定配置管理计划&#xff0c;交由CCB审核C…

开通博客,记录生活

2013年大学毕业后&#xff0c;我会到了家乡&#xff0c;在一家大的印刷厂找了一份工作。工作职责就是网管兼软件开发&#xff0c;拿2千多块的工资。后来有一次我打印文件时&#xff0c;发现了一份工资列表。估计是人力资源打错打印机了。我大概一看&#xff0c;原来最高层总经理…

C++中如何读取一个数的位数_C语言编写程序求水仙花数

C语言编写程序求水仙花数水仙花数是一个数学问题&#xff0c;其实质是一个三位数&#xff0c;个位数的立方加十位数的立方加百位数的立方之和等于这个三位数本身。例如153&#xff1d;1*1*15*5*53*3*3&#xff0c;即153&#xff1d;112527。这是一个相对较为简单的C程序&#x…

RabbitMQ简介和六种工作模式详解

一、RabbitMQ简介是一个开源的消息代理和队列服务器&#xff0c;用来通过普通协议在完全不同的应用之间共享数据&#xff0c;RabbitMQ是使用Erlang(高并发语言)语言来编写的&#xff0c;并且RabbitMQ是基于AMQP协议的。1.1 AMQP协议Advanced Message Queuing Protocol(高级消息…

为什么男性比女性死得更早,心疼一秒钟!

最近娱乐圈的那些大瓜大家都吃了吗&#xff1f;某明星的运动&#xff1f;黑眼圈&#xff1f;&#xff1f;不免让小编想起之前看的文章 男性为啥比女性“去”的早嗯&#xff0c;有可能是操劳过度 生活太累 咳咳咳咳咳以上均是不负责任猜想吃瓜要谨慎呦????不过这篇报道…

奥巴马访华:不建议过度审查 提倡加强互联网开放

新华网上海11月16日电 美国总统奥巴马16日在上海与中国青年对话。在回答互联网开放的问题时&#xff0c;奥巴马表示信息越是能够自由的流通&#xff0c;社会就变得越强&#xff0c;因为这样子&#xff0c;世界各地的公民能让自己的政府负责。 [奥巴马]好吧&#xff0c;我现在请…

linux脚本开机挂载,案例七:shell实现开机自动挂载本地YUM仓库程序

实现开机自动挂载本地YUM仓库自动化程序&#xff0c;可以在没有网络的情况下也可以使用yum安装程序。#!/bin/bash#自动搭建yum本地仓库#cdrom () {mount /dev/cdrom /media/cdrom &> /dev/null[ $? -eq 0 ] && echo "挂载成功"}[ -d /media/cdrom ] …

理中汤治疗口疮

理中汤治疗口疮 □ 高建忠 山西中医学院附属医院  口舌生疮疼痛&#xff0c;老百姓常说“上火了”&#xff0c;医者也常从实火或虚火论治&#xff0c;多用凉药。   《丹溪心法口齿》&#xff1a;“口疮服凉药不愈者&#xff0c;因中焦土虚&#xff0c;且不能食&#xff0c;…

(转)C#网络编程(基本概念和操作) - Part.1

源码下载&#xff1a;http://www.tracefact.net/SourceCode/Network-Part1-2.rar C#网络编程(基本概念和操作) - Part.1 引言 C#网络编程系列文章计划简单地讲述网络编程方面的基础知识&#xff0c;由于本人在这方面功力有限&#xff0c;所以只能提供一些初步的入门知识&#x…