【问题标题】:Blazor difference between a lambda callback or a direct callback [closed]lambda 回调或直接回调之间的 Blazor 区别 [关闭]
【发布时间】:2021-04-16 11:45:51
【问题描述】:

所以我正在试验 Blazor,我想了解这两者之间的区别。

<p @onclick="OnClickCallback">Click me normal</p>

<p @onclick="async () => await OnClickCallback()">Click me lambda</p>

@code {

  private async Task OnClickCallback()
  {
    await Task.Delay(500);
  }

}

这两种方法有什么区别。幕后发生了什么。我发现 EF Core 存在一些问题(这是一个完全不同的主题),其中 lambda 方法没有抛出异常,而普通方法却抛出了异常。

【问题讨论】:

  • @Bennyboy1973 也不明白。感谢您的支持。我相信很多人根本不知道这一点。所以我想知道我的程序做了什么,而不仅仅是知道它是否有效。
  • 是的,我认为衡量标准是,“我无法立即回答这个问题,所以这是一个无关紧要的问题。拇指向下!”
  • @RoyBerris - 详细说明 Johnathan 的回答。重要的一点在这里:private async Task OnClickCallback() 返回一个任务。通过这样做,Blazor 事件处理程序可以等待 OnClickCallback 完成,然后再在组件上调用 StateHasChanged。太多人犯了这个错误,然后必须手动调用StateHasChanged 来让 UI 更新为最新的更改。
  • @RoyBerris。我对您的问题进行了一些小的编辑,以尝试重新打开它。您必须更改某些内容才能重新提交。

标签: c# lambda blazor blazor-server-side blazor-webassembly


【解决方案1】:

这两种方法有什么区别

它添加了另一个函数,这意味着它在堆栈上引入了另一个调用。

另外,因为这是一个async lambda,它分配了另一个Task 实例。

话虽如此,使用前者的性能优势可以忽略不计。


为了完整起见,还有第三种选择可以防止使用另一个Task,但仍会导致另一个函数调用:

() => OnClickCallback()

【讨论】:

    【解决方案2】:

    在 Blazor 中,这是一个非常好的问题。我真的不知道它们的编译方式是否不同,但我想提一些非常重要的事情:lambda 方法可以传递一个变量,而不是与事件一起出现的正常事件变量。这样做非常有用:

    @foreach (var item in SomeCustomList)
        {
            <p @onclick="async (e) => await OnClickCallback(e, item )">Click me lambda</p>
        }
    

    【讨论】:

    • 在这种情况下最好省略 async..await 关键字,否则每个 item 都会导致额外的 Task: e =&gt; OnClickCallback(e, item)
    猜你喜欢
    • 2010-09-26
    • 1970-01-01
    • 1970-01-01
    • 2020-05-02
    • 1970-01-01
    • 2018-01-23
    • 1970-01-01
    • 1970-01-01
    • 2016-10-16
    相关资源
    最近更新 更多