我正在尝试使用
@foreach
循环在 Blazor 组件中动态生成按钮。每个按钮都应该触发一个以相应项目作为参数的方法
@foreach (var item in items)
{
<button @onclick="() => HandleClick(item)">Click Me</button>
}
void HandleClick(object item)
{
Console.WriteLine(item);
}
需要创建本地副本
(like var currentItem = item)
与闭包在 C# 循环中的工作方式(尤其是 lambda 表达式)相关
在
@foreach
循环中,如果直接在 lambda (like () => HandleClick(item))
中使用循环变量,您将创建一个捕获循环变量本身而不是其当前值的闭包。因为 lambda 是在循环完成后创建的,所以它将始终引用循环变量的最后一个值。
// This WON'T work as expected
@foreach (var item in items)
{
<button @onclick="() => HandleClick(item)">Click Me</button>
}
// This WILL work correctly
@foreach (var item in items)
{
var currentItem = item; // Create a local copy
<button @onclick="() => HandleClick(currentItem)">Click Me</button>
}