【问题标题】:How does the Blazor WeatherForecast sample work?Blazor WeatherForecast 示例如何工作?
【发布时间】:2019-05-20 14:10:19
【问题描述】:

Blazor 的 Hello World 项目模板包括一个天气预报示例(除了计数器增量示例)。

我玩弄了这个来看看幕后发生了什么。我好像搞不懂。

基本上,如果我注释掉获取天气 .json 数据的代码行,那么我会无限期地看到“正在加载...”。到目前为止是有道理的。但是当我以原始状态运行它时,我看到“正在加载...”,然后很快呈现数据网格。我的困惑是“正在加载...”与数据网格的呈现是在 if-else 语句中。所以这让我相信这个 if-else 以某种方式被评估了两次(加载时一次,加载数据后第二次)。

问题

我想知道这里的幕后情况:

  • if-else 语句是否被多次评估?
  • 如果网格异步不为空,它如何评估 null 然后渲染网格?

已解决

我找到了我的答案here我的怀疑是正确的——页面确实被渲染了两次。关键在于组件的生命周期。

首先调用 OnInit,然后调用 OnInitAsync。任何异步操作, 需要组件在完成后重新渲染,应该是 放在 OnInitAsync 方法中。

(请注意,在 FetchData.cshtml 中,数据是从 OnInitAsync() 覆盖加载的。)

【问题讨论】:

    标签: asp.net blazor


    【解决方案1】:

    当您等待一个方法 ( OnInitAsync ) 时,您将控制权交给调用代码,调用代码继续执行其余代码,并使用文本“正在加载...”呈现您的组件。当异步方法返回时,即任务完成,并且要设置新参数时,您的控件必须重新呈现以反映新的更改。当然 if-else 语句会再次运行,产生不同的结果。

    这实际上与 Blazor 无关。这就是异步编程在 C# 中的工作方式。但是,ComponentBase 类中的代码会检查这些条件并通过调用 StateHasChanged 方法决定何时重新渲染组件。

    请参阅 ComponentBase.SetParameters 和 ComponentBase.ContinueAfterLifecycleTask 以更好地理解它:https://github.com/aspnet/AspNetCore/blob/343208331d9ebbb3a67880133f4139bee2cb1c71/src/Components/src/Microsoft.AspNetCore.Components/ComponentBase.cs

    希望对你有帮助……

    【讨论】:

      【解决方案2】:

      if 检查是否为空:

      @if (forecasts == null)
      {
          <p><em>Loading...</em></p>
      }
      else
      {
           //table here
      }
      

      并且数据的加载是异步的。因此,当页面启动时,预测为空。现在加载开始(异步),完成后它将填充预测数组。这将使其非空并显示表格。

      我猜异步是这里的关键..

      【讨论】:

      • 我明白这一点。但也许我不明白异步魔法是如何工作的。 if-else 条件是否被多次评估?
      • 我相信完成后的异步调用在内部会引发一种 StateHasChanged() 事件,这将使页面重新评估内容。所以,是的。
      • async 基本上意味着代码执行在另一个线程上,并且可以与正在执行的其他代码同时发生。据我了解
      猜你喜欢
      • 1970-01-01
      • 2021-12-27
      • 1970-01-01
      • 2021-05-10
      • 2023-03-26
      • 2014-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多