为什么 @foreach 和 @onclick 不起作用?

问题描述 投票:0回答:1

我正在尝试使用

@foreach
循环在 Blazor 组件中动态生成按钮。每个按钮都应该触发一个以相应项目作为参数的方法

@foreach (var item in items)
{
    <button @onclick="() => HandleClick(item)">Click Me</button>
}


void HandleClick(object item)
{
    Console.WriteLine(item);
}
c# blazor
1个回答
0
投票

需要创建本地副本

(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>
}
© www.soinside.com 2019 - 2024. All rights reserved.