[英]Why do I need to use a Lambda expression here?
网格.razor:
@foreach (var row in Rows)
{
<tr @onclick="@(() => OnRowClick(row))">
@GridBody(row)
</tr>
}
网格.razor.cs
namespace MyApp.Web.Components.Grid
{
public class GridRow<TItem>
{
public TItem Item { get; set; } = default!;
public int Id { get; set; } = default!;
public bool Active = false;
}
public partial class Grid<TItem>
{
[Parameter]
public int PageSize { get; set; } = 100;
[Parameter]
public RenderFragment GridHeader { get; set; } = default!;
[Parameter]
public RenderFragment<GridRow<TItem>> GridBody { get; set; } = default!;
public async Task OnRowClick(GridRow<TItem> row)
{
//...
}
}
}
一切都按预期工作。 但是我不清楚 Grid.razor 中的以下代码行:
<tr @onclick="@(() => OnRowClick(row))">
上面的工作,但最初我尝试了以下操作:
<tr @onclick="@(OnRowClick(row))">
如果没有 lambda 表达式,编译器会产生以下错误:
Argument 2: cannot convert from 'System.Threading.Tasks.Task' to 'Microsoft.AspNetCore.Components.EventCallback'
为什么这里需要 lamda function?
当您使用OnRowClick(row)
时,您直接调用OnRowClick
function 并将结果分配给onclick
。 使用() => OnRowClick(row)
将 lambda function 分配给onclick
,以便以后可以调用它(因此调用OnRowClick
)。
将onclick
视为变量,这是您在 C# 中看到的差异:
Task<SomeType> onclick = OnRowClick(row); // Invoked now, onclick contains the result
对比
Func<Task<SomeType>> onclick = () => OnRowClick(row); // Can be invoked later
如果row
不需要作为参数,您可以简写,例如@onclick=@OnRowClick
,因为您将传递一个 function 可以稍后调用而不是现在调用它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.