为什么需要 Lambda 函数将值传递给 @onclick 调用的方法?

2023-12-01

我是 Blazor(以及一般的 Web 开发人员)的新手。我跟着Microsoft 的 Blazor Web 应用程序待办事项列表教程,在完成上述教程后,我想进一步在每个列表元素旁边添加按钮以将它们从列表中删除。这是我为实现这一目标而编写的代码:

@page "/todo"

<h1>Todo (@todos.Count(todo => !todo.IsDone))</h1>

<ul>
    @foreach (var todo in todos)
    {
        <li>
            <input type="checkbox" @bind="todo.IsDone" />
            <input @bind="todo.Title" />
            <button @onclick="RemoveTodo(todo)">Remove</button>
        </li>
    }
</ul>

<input placeholder="Something to do" @bind="newTodo" />
<button @onclick="AddTodo">Add todo</button>

@code {
    private List<TodoItem> todos = new();
    private string newTodo;
    
    private void AddTodo()
    {
        if (!string.IsNullOrWhiteSpace(newTodo))
        {
            todos.Add(new TodoItem { Title = newTodo });
            newTodo = string.Empty;
        }
    }
    
    private void RemoveTodo(TodoItem item)
    {
        if (item != null)
        {
            todos.Remove(item);
        }
    }
}

我想我可以复制语法<button @onclick="AddTodo">Add todo</button>添加此按钮,但这会引入一个错误。正如我通过发现这个堆栈溢出答案,为了修复这个错误(并允许应用程序构建),我必须更改:

<button @onclick="RemoveTodo(todo)">Remove</button>

包含一个 lambda 函数,如下所示:

<button @onclick="() => RemoveTodo(todo)">Remove</button>

我知道这个更改是有效的,因为我测试了它并且应用程序的行为符合我的预期!但是我要why这个改变有效。

我找到了这个额外的堆栈溢出问题,其中所选答案解释了为了以上述方式将值传递给 @onclick 调用的方法,必须使用 lambda 表达式。答案说使用@onclick将导致编译器创建一个 EventCallback 对象来处理我提供给的代码@onclick.

但是,我仍然不明白为什么我的原始代码不起作用。我假设当将值传递给正在执行的函数时,由 EventCallback 对象生成的委托无法正确执行。第二个问题表明,通过 lambda 函数调用会产生一种不同类型的委托,它could解析传递给函数的值。

我对正在发生的事情的理解是否接近事实?为什么我需要以这种方式将函数封装在 lambda 函数中,但仅当所述函数被传递值时才需要?


这是关于 C# 语法的。事件处理程序必须是委托(对方法的引用)。

显示错误的最短方法:

<button @onclick="AddTodo">Add todo</button>         // ok
<button @onclick="AddTodo()">Add todo</button>       // error
<button @onclick="() => AddTodo()">Add todo</button> // ok

因为,用简单的 C# 来说:

delegate x = AddTodo;    // ok, a methodname w/o () means "address off"
delegate x = AddTodo();  // error, void is not a delegate
delegate x = () => AddTodo();  // ok, a lambda is a delegate

我们通常更喜欢第一个较短的版本。但一旦你有争论,你就需要长形式。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么需要 Lambda 函数将值传递给 @onclick 调用的方法? 的相关文章

  • NUnit 测试运行顺序

    默认情况下 nunit 测试按字母顺序运行 有谁知道有什么方法可以设置执行顺序吗 是否存在这样的属性 我只是想指出 虽然大多数受访者认为这些是单元测试 但问题并没有具体说明它们是 nUnit 是一个很棒的工具 可用于各种测试情况 我可以看到
  • 更改导航栏悬停时 div 的背景图像

    我正在开发一个项目 我对 Javascript 很陌生 所以我想知道是否有 Jquery 代码或只是一个关于如何使背景图像在导航菜单悬停时更改的过程 例如将鼠标悬停在链接一上会将 div 的背景图像更改为图像 1 将鼠标悬停在链接二上会将
  • 在 C 中声明和初始化数组

    C 有没有办法先声明然后初始化数组 到目前为止 我一直在初始化一个这样的数组 int myArray SIZE 1 2 3 4 但我需要做这样的事情 int myArray SIZE myArray 1 2 3 4 在 C99 中 您可以使
  • 使用 boost::iterator_facade<>

    我有一个链表结构 struct SomeLinkedList const char bar int lots of interesting stuff in here DWORD foo SomeLinkedList pNext 它是现有
  • CMake - 未定义参考

    我正在尝试将 gtest 包含到我的项目中 问题是我在 GTest 中收到未定义的引用错误 我正在尝试在 Gtest 中测试 Node 类 在节点的构造函数中 我使用类记录器 尽管我已将库记录器添加到 gtest target 中 但我仍然
  • F# 内联如何工作?

    对于 F 我的理解是您可以使用 inline 关键字在调用站点执行类型专门化 那是 val inline a gt b gt c when a or b static member a b gt c 约束条件是 a or b必须有一个静态成
  • 按位非运算符

    为什么要按位运算 0 打印 1 在二进制中 不是0应该是1 为什么 你实际上很接近 在二进制中 不是0应该是1 是的 当我们谈论一位时 这是绝对正确的 然而 一个int其值为0的实际上是32位全零 将所有 32 个 0 反转为 32 个 1
  • 有哪些 API 可在 Windows 中使用 C# 配置扬声器设置?

    我环顾了很多不同的地方 但似乎找不到一个简单的方法来做到这一点 我在 Windows 7 中有多个声卡 并使用 HDMI 将声音输出到我的 AVR 放大器 我遇到的问题是 当放大器关闭时 它会导致窗口丢失扬声器配置 所以我想做的是编写一个小
  • 使用 MapViewOfFile 有什么限制吗?

    我正在尝试将内存映射文件用作 hFile CreateFile State Path GENERIC READ FILE SHARE READ FILE SHARE WRITE 0 OPEN EXISTING FILE FLAG SEQUE
  • 在标准库中静态链接时如何支持动态插件?

    假设一个应用程序myapp exe是使用构建的g 它使用标志 static libstdc 这样就可以安装在没有环境的情况下libstdc so myapp exe还添加了对某些功能的插件支持plugf可以通过动态加载dlopen来自共享库
  • 锁定文件的一个块

    我有一个大小为 192k 的文件 我想锁定文件的中间部分 例如 我想用 c 锁定文件的 64k 128k 知道如何锁定文件的那部分吗 你需要使用锁定文件Ex http msdn microsoft com en us library win
  • C# Linq 可以做组合数学吗?

    我有这个数据结构 class Product public string Name get set public int Count get set var list new List
  • Global.asax 错误处理程序或自定义 IHttpModule 错误处理程序未捕获未处理的异常

    我有一个类 DPCal EventMove 的一种方法 我想限制使用角色的访问 我有一个 Global asax cs 错误处理程序和一个自定义 IHttpModule 错误处理程序 旨在捕获未处理的异常 并将它们 Server Trans
  • 派生类的聚合初始化

    以下代码无法使用 Visual Studio2017 或在线 GDB 进行编译 我期望它能够编译 因为迭代器只是一个具有类型的类 并且它是从公共继承的 这是不允许的还是在 VS2017 中不起作用 template
  • C# 记录类型:记录子类之间的相等比较

    给定父记录类型 public record Foo string Value 和两个记录子类Bar and Bee我想知道是否可以实施Equals在基类中 因此 Foo Bar 或 Bee 的实例都被考虑equal基于Value 两者都与E
  • RabbitMQ + Windows + LDAP 无需发送密码

    我正在尝试在 Windows 7 上使用 RabbitMQ 3 6 2 进行 LDAP 身份验证 授权 我已经在应用程序发送用户名 密码的情况下进行了基本身份验证 但密码位于我需要弄清楚如何进行的代码中避免 有没有人在不提供密码的情况下成功
  • Azure Function App Azure 服务总线触发器触发两次

    我使用带有服务总线触发器的 Azure Function Apps 来读取服务总线并对服务总线消息的内容执行操作 服务总线接收 JSON 序列化对象 然后将 JSON 消息反序列化回 Function App 中的对象 然而 由于某种原因
  • Selenium WebDriver 在按钮单击事件上无法正常工作。这里有什么问题呢?

    I am using following code to scrape data from a website I have following interface 这是 HTML div class es content div
  • 为什么 32 位 .NET 进程的引用类型的最小大小为 12 字节

    我正在读专业 Net 性能 https rads stackoverflow com amzn click com 1430244585本书有关参考类型内部结构的部分 它提到 对于 32 位 net 进程 引用类型具有 4 字节的对象头和
  • 如何使用字符串的值将字符串转换为 wstring?

    我是 C 新手 我有这个问题 我有一个名为 DATA DIR 的字符串 需要将其格式化为 wstring string str DATA DIR std wstring temp L s str Visual Studio 告诉我没有与参数

随机推荐

  • Java重载规则

    我最近遇到了两个重载问题 我找不到答案 并且没有 java 环境来运行一些测试代码 我希望有人可以帮助我整理 java 编译器在重载时遵循的所有规则的列表 或者交替地向我指出一个已经存在的列表 首先 当两个方法仅因最终 varargs 参数
  • 从导入同时保留按模块的访问权限

    标题有点难以理解 但我的问题很简单 我有一个程序需要采取sqrt 某事 但这是我唯一需要的math 为了获取单个功能而导入整个模块似乎有点浪费 我可以说from math import sqrt 但是之后sqrt 将被添加到我的程序的主命名
  • Excel:如何将包含某些文本的行复制到另一个工作表(VBA)

    我希望使用一个能够搜索所述工作表中的列的宏 如果找到某些文本 在我的例子中是 失败 一词 复制整个行数据 格式并将其粘贴到另一个工作表中 工作表就我而言 为 4 以及包含该特定文本的任何其他行 我一直在使用这段代码 但它只复制粘贴一行然后停
  • 使用 imshow 在 pyqt4 中嵌入 matplotlib

    我正在尝试做一些非常类似的事情this 不同之处在于我想使用 imshow 而不是plot 上面代码的相关部分 class MyMplCanvas FigureCanvas Ultimately this is a QWidget as w
  • 第一个列表项的 css 选择器

    我有以下 html 结构 ul li class arrow boundElement style height 40px test li ul
  • get_dummies 并一起数

    我有一个数据框 其中包含不同的 案例 作为行 其中有一个 id 和一个类别 df DataFrame id 1122 3344 5566 5566 3344 5566 1122 3344 category health transport
  • 使用 SolidColorBrush 画笔填充列表

    我正在尝试使用 WP7 1 中可用的所有预定义 SolidColorBrush 填充列表 但我在通过代码执行此操作时遇到困难 我已经使用一个简短的测试颜色列表手动完成了此操作 效果很好 但是有一百多种不同的预定义颜色 我知道必须有一个正确的
  • 未指定端点的永久重定向 s3

    我正在尝试 s3 但遇到了权限问题 我认为 Output AWS S3 PermanentRedirect in CkeditorController create The bucket you are attempting to acce
  • 推力计数发生[重复]

    这个问题在这里已经有答案了 可能的重复 计算cuda数组中数字的出现次数 有没有办法使用 Thrust 或 CUDA 来计算数组中重复项的出现次数 例如 如果我有一个设备向量 11 11 9 1 3 11 1 2 9 1 11 我应该得到
  • jquery ui 以模式方式弹出 YouTube 视频

    有没有办法使用 jQueryUI 以模式方式弹出 YouTube 视频 这是我的 YouTube 代码
  • 目录枚举以跳过文件夹

    我有一段可爱的代码 它对我来说非常出色 只需获取多次搜索等所需的所有文件 public static IEnumerable
  • MIFARE Classic:如何找到良好的访问字节值

    我的目标是仅进行 KEY A 身份验证并禁用 Key B 用于存储数据的空间 我阅读了这些文档 http www nxp com documents data sheet MF1S503x pdf http dangerousthings
  • GetContentHeight() 无法正常工作

    我正在尝试检索网络视图内容的高度 它包含一个 html 字符串 问题是 getContentHeight 总是返回相同的值 392 无论 html 字符串有多长 这个问题已经让我抓狂了 让我猜测一下 您的内容不是从网络或文件系统加载的 而是
  • 从字符串获取 DbSet

    ADO NET 用户首次尝试 EF 我正在尝试从表名字符串中获取一个表 比我想象的还要难 基本上我在这里 var tableName Name Entities Measure measureType var table Activator
  • 如何将 JSON api 日期与 FSCalendar 进行比较并在表格视图中显示事件?

    我在日历中显示了事件点 但无法根据表格视图中的月份显示相同的事件 我想显示这些事件 例如如果我们更改月份并且表格视图数据事件应该更改 我很困惑如何做到这一点 我正在使用 FSCalendar 来显示 dot 和 tableview 等事件
  • 如何重新安装 NetBeans?所有可用组件(包和运行时)都已安装,如何继续?

    NetBeans 重新安装出现问题 第一个工作正常 所有可用组件均已安装 单击 取消 退出安装程序 没办法继续下去了 之前 我使用 全部 完整下载选项 215 MB 下载并安装了 NetBeans IDE 8 1 的窗口版本 其中包含 Ne
  • iText - 可点击的图像应该打开 MS Word 附件

    如何使图像可点击以便打开附加的 ms word 文档 我这里有一些 PDF 其中有一些图像 ms word 图标 图标下方有 ms word 文件名 通过单击图像打开附加的 ms word 文档 我想知道如何使用 iText 库执行此操作
  • 为什么有些人在循环宏的子句中使用关键字?

    它能解决任何问题吗 根据 PCL 的第一个脚注 如果不是关键字 它会将符号保留在当前包中 由于所有关键字都被保留在关键字包中 因此可以防止多个符号被保留在不同的包中 但还有其他优点吗 它会产生什么问题 我猜一定有问题 因为这不是普遍的惯例
  • 极坐标图中的箭头

    我试图绘制串联 R L C 电路中电阻器 电容器和电感器两端电压的相量 我已经完成了所有的计算 我可以用正常的方式得到一个像样的图ax plot theta r 我想让相量向量看起来像箭头 我一直在尝试使用ax arrow 0 0 thet
  • 为什么需要 Lambda 函数将值传递给 @onclick 调用的方法?

    我是 Blazor 以及一般的 Web 开发人员 的新手 我跟着Microsoft 的 Blazor Web 应用程序待办事项列表教程 在完成上述教程后 我想进一步在每个列表元素旁边添加按钮以将它们从列表中删除 这是我为实现这一目标而编写的