在Blazor中将方法作为参数传递时,“@MethodName”和“MethodName”的区别是什么?

5
我在 Blazor 中有一个组件,可以接受方法作为参数。
<SuppliersTable Loader="@LoadS" LoaderO="@LoadO" Adder="@Add" Updater="@Update" Remover="@Remove" />

@code {
    async Task<List<Supplier>> LoadS() => (await ModelServiceS.GetAllAsync()).ToList();
    async Task<List<Operator>> LoadO() => (await ModelServiceO.GetAllAsync()).ToList();
    async Task<bool> Add(Supplier model) => await ModelServiceS.AddAsync(model);
    async Task<bool> Update(Supplier model) => await ModelServiceS.UpdateAsync(model);
    async Task<bool> Remove(Supplier model) => await ModelServiceS.RemoveAsync(model);
}

但如果您在方法名称前面不加 "@",它是否会执行完全不同的操作?编译器接受两种方式,这就是我在问的原因。我有这样的感觉,用 "@" 执行该方法并将返回值作为参数传递,而不带 "@" 则只是引用要由父组件调用的方法(这正是我想要的)。是否有人能够提供更多有关 "@" 的使用细节?

SuppliersTable 组件的参数类型如下:

[Parameter] public Func<Task<List<Supplier>>> Loader { get; set; }
[Parameter] public Func<Task<List<Operator>>> LoaderO { get; set; }
[Parameter] public Func<Supplier, Task<bool>> Adder { get; set; }
[Parameter] public Func<Supplier, Task<bool>> Updater { get; set; }
[Parameter] public Func<Supplier, Task<bool>> Remover { get; set; }
2个回答

9
这涉及到新旧语法的问题。在Blazor预览版中有很多更改,其中一个主要的清理工作是在第6个预览版中进行的:

在这个Blazor版本中,我们统一了指令属性的通用语法。

  • 现在,@onclick="IncrementCount" 是事件处理程序的标准形式。

  • @onclick="@IncrementCount" 也可以正常工作,但你应该只考虑它来保持向后兼容性。

  • @onclick="() => IncrementCount(step)" 也可以使用,用于传递参数。否则它只是一个不必要的额外步骤。

  • onclick="aJsFunction" 用于调用JavaScript函数。

对于你的[Parameter]属性的值也是一样的,但它们不需要(或允许)@前缀。


5
在两种方式都可以工作的情况下,结果是相同的。你没有解除方法(即()),因此它不会执行该方法;你仍然传递引用。
简而言之,@ 明确地将 Razor 解析混合在一起。在某些情况下,Razor 无法解释它需要或应该执行某些操作,您通常可以通过智能感知突出显示来查看。在这些情况下,您必须添加@符号。但是,如果 Razor 已经找到了,添加 @ 实际上什么也没做。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接