Blazor:内置@on{EVENT} 和自定义 EventCallback 之间的区别

标签 blazor

如果这个问题看起来很愚蠢,请原谅;但我对 @ 前缀的用法感到困惑。

将鼠标悬停在 onclick 等内置事件上时,Visual Studio 中的 IntelliSense 会显示事件类型(在本例中为 onclick)是 Microsoft。 AspNetCore.Components.EventCallback 并且在组件中实现 EventCallback 时,类型显然又是 Microsoft.AspNetCore.Components.EventCallback;

但是为什么像 onclick 这样的内置事件应该以 @ 为前缀,而 EventCallback(s) 应该像属性一样声明(没有@ 作为前缀)?

using an <code>EventCallback</code>

using a builtin event

最佳答案

Excuse me if this question seems silly; but I have confusion over the usage of @ prefix.

一点也不...这是一个非常重要的问题,Blazor 中的所有开发人员不仅应该能够回答,而且还应该能够采取行动。

属性“@onclick”是指示编译器创建 EventCallback“委托(delegate)”的编译器指令。 EventCallback 是一个存储对委托(delegate)的引用的结构;这是一个方法,它实际上是您分配给属性“@onclick”的值,例如:

<button type="button" @onclick="ClickMe">Click me</button>

@code
{
     private void ClickMe()
    {
       Console.WriteLine("You clicked me...");
    }
}

如您所见,ClickMe 是一种在您单击按钮时调用的方法。

您也可以使用不带@ 符号的Html 元素属性“onclick”。这当然不是编译器指令而是 Html 元素属性,对吧? 并且它的值只能是一个 JavaScript 函数,例如:

<button type="button" onclick="window.ClickMe()">Click me</button>

现在,当您单击该按钮时,将调用在窗口对象上定义的名为 ClickMe 的 JavaScript 函数...请注意圆括号。

当然,有多种方法可以完成上述操作。

在您发布的照片​​中,Modal 组件有一个名为 onOK 的属性,其类型为 EventCallback,因此它的值应该是一个合适的方法,ModalOnOK 。以下代码片段说明了这一点:

Modal.razor(Modal的定义)

@code{
    [Parameter]
    public EventCallBack onOK {get; set;}
}

可以看到onOK是一个类型为EventCallBack的参数属性。因此,在使用 Modal 组件的父组件中,您应该为 property 属性分配 EventCallBack 可以封装的方法的值。

抱歉,要说的很多很多,这只是 Material 的一小部分。但该分开了。

希望这有助于...

关于Blazor:内置@on{EVENT} 和自定义 EventCallback 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62413652/

相关文章:

C# Blazor客户端从url中读取hash参数

windows-authentication - 服务器端 Blazor + Kestrel + Windows Auth = 崩溃

c# - Blazor WebAssembly 应用程序 - 来自浏览器的 API 调用 - 抱歉,此地址没有任何内容

interop - 如何从 Blazor 调用 JS 异步方法

c# - Asp.Net Core 3(Blazor 客户端)构建失败

asp.net-core - 无法将路由添加到 Blazor 服务器端

.net-core - 无法访问 Blazor Server 3.0 中已处置的对象

c# - 如何在Blazor中实现路由动画?

dependency-injection - 缺少方法异常 : No parameterless constructor defined for type

.net - 使用 Azure 应用程序配置 -> 希望允许本地配置覆盖开发人员