【问题标题】:How does an ASP.Net Core Blazor page know to refresh it's contents after an async data getter method returns?ASP.Net Core Blazor 页面如何知道在异步数据 getter 方法返回后刷新其内容?
【发布时间】:2020-02-10 01:09:59
【问题描述】:

问题不在于如何让它发挥作用,它是有效的。我只是感兴趣,但不知道在后台发生了什么使其工作。

主要示例是标准 Blazor 服务器 webapp 模板,它具有“counter”和“fetchdata”组件。 在 fetchdata 组件中,有 protected override async Task OnInitializedAsync() 被调用,并且该组件呈现自己。如果 OnInitializedAsync() 没有及时返回,渲染仍然发生,在示例中只是写出加载...然后当 OnInitializedAsync() 实际完成时,组件被神奇地重新渲染,但是是什么导致了重新渲染?它是如何连接在一起的?

框架是否经常查看类的内存以确定是否需要重新渲染?只是在 OnInitializedAsync() 调用之前和等待之后有一个页面渲染调用吗?

【问题讨论】:

  • 当时的想法完全一样,谷歌把我带到了这个问题,正如我所说的那样。

标签: asp.net blazor


【解决方案1】:

这都是基于异步编程...

protected override async Task OnInitializedAsync()
{        
    forecasts = await ForecastService.GetForecastAsync(DateTime.Now);
}

您提到的 OnInitializedAsync 方法有两部分:同步和异步。当 OnInitializedAsync 方法开始执行时,将调用可等待的 GetForecastAsync 方法,将控制权交给调用代码 Blazor 运行时,该代码会立即开始呈现 UI。这是您的组件第一次被渲染。这也是为什么您必须在代码中检查预测变量不为空的原因。当 GetForecastAsync 返回并填充预测变量时,将执行更多代码(如果存在)到方法的末尾,之后您的组件再次重​​新渲染,这次预测不为空,因此表格被渲染。当然,这是一个简单的解释。您可以通过查看执行此操作的代码逐步检查该过程:It all starts here。遵循应该不难。没有魔法

希望这会有所帮助...

【讨论】:

  • 没想到我可以直接查看源代码,但现在更清楚了,ComponentBase 类的行为方式。此外,对来源进行了非常彻底的评论!
  • 好的,上面的答案清楚地解释了事情,但看看这张图表docs.microsoft.com/en-us/aspnet/core/blazor/components/… 那里的渲染流程的第一印象表明它只会渲染一次。
  • @Frank,你不应该相信我,史蒂夫安德森或其他任何人都不应该相信我。你应该自己测试一下。这很简单。只需创建一个 Server Blazor 应用程序,覆盖生命周期方法并执行 Console.WriteLine("put Identification text here");几分钟后你就会知道真相。只是担心默认情况下会重新渲染 Blazor Server App 的默认模板;那就是一些代码被执行了两次。谢谢你的链接。是时候更新我的知识了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-30
  • 2020-05-21
  • 2020-07-09
  • 1970-01-01
  • 2012-01-30
  • 2021-01-21
  • 2023-03-28
相关资源
最近更新 更多