日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/4 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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

總結

以上是生活随笔為你收集整理的Hello Blazor:(11)全局截获事件执行的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。