首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >blazor组件什么时候呈现?

blazor组件什么时候呈现?
EN

Stack Overflow用户
提问于 2022-07-19 18:38:59
回答 2查看 449关注 0票数 2

在下面来自此页的图表中,它显示了当调用OnInitializedAsync返回一个不完整的任务时,它将等待任务,然后呈现组件。

但是,返回不完整任务时实际发生的情况似乎是立即呈现组件,然后在不完整任务完成后再次呈现。

页面后面的一个例子似乎证实了这一点。如果组件没有在调用OnInitializedAsync之后立即呈现,而是在任务返回完成后第一次呈现,那么您将永远不会看到“加载.”。消息。

OnParametersSetAsync行为显示为相同。它在返回不完整的任务时立即呈现一次,然后在该任务完成后再呈现一次。

我是误解了呈现生命周期,还是文档中的错误?

谢谢

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@page "/fetchdata"
@using BlazorSample.Data
@inject WeatherForecastService ForecastService

<h1>Weather forecast</h1>

<p>This component demonstrates fetching data from a service.</p>

@if (forecasts == null)
{
    <p><em>Loading...</em></p>
}
else
{
    <table class="table">
        <!-- forecast data in table element content -->
    </table>
}

@code {
    private WeatherForecast[]? forecasts;

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

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-07-20 01:42:58

要完全回答您的问题,我们需要深入研究ComponentBase代码。

您的代码正在异步世界中运行,在这个世界中,代码块可以产生并将控制权还给调用者--您的“不完整任务被返回”。

当组件第一次呈现时,当任何参数发生更改时,渲染器都会调用SetParametersAsync

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public virtual Task SetParametersAsync(ParameterView parameters)
{
    parameters.SetParameterProperties(this);
    if (!_initialized)
    {
        _initialized = true;
        return RunInitAndSetParametersAsync();
    }
    else
        return CallOnParametersSetAsync();
}

RunInitAndSetParametersAsync负责初始化。我留下了comments的评论,其中解释了StateHasChanged调用。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private async Task RunInitAndSetParametersAsync()
{
    OnInitialized();
    var task = OnInitializedAsync();

    if (task.Status != TaskStatus.RanToCompletion && task.Status != TaskStatus.Canceled)
    {
        // Call state has changed here so that we render after the sync part of OnInitAsync has run
        // and wait for it to finish before we continue. If no async work has been done yet, we want
        // to defer calling StateHasChanged up until the first bit of async code happens or until
        // the end. Additionally, we want to avoid calling StateHasChanged if no
        // async work is to be performed.
        StateHasChanged();
        try
        {
            await task;
        }
        catch // avoiding exception filters for AOT runtime support
        {
            if (!task.IsCanceled)
                throw;
        }
        // Don't call StateHasChanged here. CallOnParametersSetAsync should handle that for us.
    }
    await CallOnParametersSetAsync();
}

每次参数更改都会调用CallOnParametersSetAsync

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private Task CallOnParametersSetAsync()
{
    OnParametersSet();
    var task = OnParametersSetAsync();
    // If no async work is to be performed, i.e. the task has already ran to completion
    // or was canceled by the time we got to inspect it, avoid going async and re-invoking
    // StateHasChanged at the culmination of the async work.
    var shouldAwaitTask = task.Status != TaskStatus.RanToCompletion &&
        task.Status != TaskStatus.Canceled;

    // We always call StateHasChanged here as we want to trigger a rerender after OnParametersSet and
    // the synchronous part of OnParametersSetAsync has run.
    StateHasChanged();

    return shouldAwaitTask ?
        CallStateHasChangedOnAsyncCompletion(task) :
        Task.CompletedTask;
}

在图中,在上面的代码中用“StateHasChanged”代替“呈现”。

该图表使用工作“呈现”,这有点误导。这意味着当实际发生的是呈现片段(构建组件UI标记的代码块)时,UI重新呈现在Renderer的呈现队列中。它应该说“请求呈现”或类似的东西。

如果触发呈现事件或调用StateHasChanged的组件代码都是同步代码,则渲染程序只在代码完成时获得线程时间。代码块需要为Renderer“屈服”,以便在进程中获得线程时间。

同样重要的是要理解,并不是所有基于任务的方法都能产生结果。许多代码只是任务包装器中的同步代码。

因此,如果OnInitializedAsyncOnParametersSetAsync中的代码产生一个呈现事件,则在第一个结果上,然后在完成时。

在同步代码块中“屈服”的一个常见做法是添加这一行代码,以使渲染器呈现。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
await Task.Delay(1);

你可以在这里看到ComponentBase - https://github.com/dotnet/aspnetcore/blob/main/src/Components/Components/src/ComponentBase.cs

票数 3
EN

Stack Overflow用户

发布于 2022-07-19 21:49:49

短总结

  • Blazor在每个生命周期事件和UI事件之前和之后添加两个“免费”StateHasChanged调用。
  • StateHasChanged只请求html更新,而不执行更新。
  • 只有在事件发生后才能满足更新请求。 或者当主线程由await 释放时
    • 不是每个await都会释放线程。

因此,当您想确保屏幕得到更新时,请使用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
StateHasChanged();
await Task.Delay(1);

旧答案

当返回不完整的任务时,它会立即呈现组件,然后在不完整的任务完成后再次呈现。

是的,这是一个可能的顺序。

流程图显示了显示组件的步骤。从图片中不太清楚的是,实际呈现不是这个流的一部分,它发生在同步上下文上。当您的代码await是某物时,可能会发生这种情况。

所以我们有一个非异步序列:

  • OninitialzedAsync
  • OnParametersSetAsync
  • 渲染
  • OnAfterRenderAsync

但是,当这个代码路径中有什么异步时,那么在await期间可以有一个额外的呈现。当您在此流中调用StateHasChanged时,可以进行更多的呈现。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73045404

复制
相关文章
分层 Blazor 组件
作为加入单页应用程序 (SPA) 队伍的最新框架,Blazor 有机会在其他框架(如 Angular 和 React)的最佳特性基础之上构建而成。尽管 Blazor 背后的核心概念是利用 C# 和 Razor 来生成 SPA 应用程序,但明显受到其他框架启发的一个方面是使用组件。
AI.NET 极客圈
2019/08/23
8.4K0
分层 Blazor 组件
创建 SpreadJS Blazor 组件
数据(包括股票、天气和体育比分)在不断更新为新信息时最为有用。比较通用的 JavaScript 电子表格组件,可以轻松地使用、显示并通过数据绑定提供实时数据更新。
葡萄城控件
2023/05/23
2K0
创建 SpreadJS Blazor 组件
Blazor创建TabControl组件
请先创建一个Blazor项目(Blazor Client或者Server皆可,我们以Blazor Server为例),
沙漠尽头的狼
2021/12/08
1.8K0
Blazor创建TabControl组件
Blzor Bootstrap Blazor 组件库
WTM 快速开发框架,设计的核心理念就是”尽一切可能提高开发效率“。WTM框架把常规编码结构化,重复编码自动化,它不仅是一个框架,它是强有力的生产力工具!目前 WTM 快速开发框架已深度集成 Blazor 欢迎大家使用 传送门
JusterZhu
2022/12/07
1.7K0
Blzor Bootstrap Blazor 组件库
MAUI使用Masa blazor组件库
上一篇(点击阅读)我们实现了UI在Web端(Blazor Server/Wasm)和客户端(Windows/macOS/Android/iOS)共享,这篇我加上 Masa Blazor[2]组件库的引用,并把前几个月写的时间戳转换[3]工具加上。
独立观察员
2022/12/06
2.1K0
MAUI使用Masa blazor组件库
值得推荐的Blazor UI组件库
  本文主要是推荐一些开源、免费、实用、美观的Blazor UI组件库,提供给广大C#/.NET开发者们学习和使用(注意:排名不分先后,都是十分优秀的开源框架和项目💖)。本文中的所有框架都已经收录到适合后端程序员的前端框架GitHub Issues知识库中,假如大家有更好组件库推荐欢迎到以下GitHub项目地址留言或者在文末留言。
追逐时光者
2023/06/10
1.1K0
值得推荐的Blazor UI组件库
[C#] Blazor练习 定时刷新组件数据2
吐槽一把:现在变态这么多吗???天天投诉个锤子。不感兴趣取消关注不就行了。又不强求。。。。
科控物联
2022/12/01
2K0
React组件到底什么时候render啊
今天我们React源码交流群里有个小伙伴提出个有趣的问题,觉得自己对React运行流程理解很到位的同学,可以来看看。
公众号@魔术师卡颂
2020/11/02
6590
Blazor入门:ASP.NET Core Razor 组件
目录 关于组件 组件类 静态资产 路由与路由参数 组件参数 请勿创建会写入其自己的组参数属性的组件 子内容 属性展开 任意参数 捕获对组件的引用 在外部调用组件方法以更新状态 使用 @ 键控制是否保留
痴者工良
2021/04/26
2.8K0
ASP.NET Core Blazor Webassembly 之 组件
现在前端几大轮子全面组件化。组件让我们可以对常用的功能进行封装,以便复用。组件这东西对于搞.NET的同学其实并不陌生,以前ASP.NET WebForm的用户控件其实也是一种组件。它封装html代码,封装业务逻辑,对外提供属性事件等信息,它完完全全就是个组件,只是用户控件跑在服务端,而现在的组件大多数直接跑在前端。现在Blazor Webassembly微软正式把组件带到前端,让我们看看它是怎么玩的。
MJ.Zhou
2020/06/19
1.6K0
Blazor学习之旅(8)MudBlazor组件库介绍
为了实现一个Web应用系统,需要有个看起来不丑的UI,而对于.NET程序员来说要做全栈开发还是有点难,而本篇介绍的这个UI组件库正好可以帮助我们解决这个问题!
Edison Zhou
2023/07/31
6260
Blazor学习之旅(8)MudBlazor组件库介绍
Blazor WebAssembly 修仙之途 - 组件与数据绑定
在第一篇文章中,有提到过组件(Component)这个概念。组件在 Blazor 中是必不可少的,UI 全靠它组装起来,和前端的 JS 组件是一个意思,比如:vue component、react component 等等。借用官方文档的描述:
晓晨
2020/06/02
2.3K0
Blazor入门_blazor视频教程
Blazor是一个基于C#, Razor和 HTML的新的Web UI框架。它通过WebAssembly运行在浏览器中。有利于使用C#而不是JavaScript构建交互式的Web UI。这篇文章演示了如何使用Blazor构建SPA应用。Blazor简化了可在任何浏览器中运行的快速且美观的SPA的任务。它通过使开发人员能够编写基于Dotnet的Web应用程序来实现此目的。这些应用程序可以在使用了开放Web标准的浏览器中运行。让我们开始使用Blazor吧。在这篇文章中,我们将讨论一下内容:
全栈程序员站长
2022/11/16
4.7K0
Blazor入门_blazor视频教程
.NET 8 Preview 6发布,支持新的了Blazor呈现方案 和 VS Code .NET MAUI 扩展
2023年7月11日 .NET 8 Preview 6,.NET 团队在官方博客发布了系列文章:
张善友
2023/07/24
5060
.NET 8 Preview 6发布,支持新的了Blazor呈现方案 和 VS Code .NET MAUI 扩展
Bootstrap Blazor 组件介绍 Table (一)自动生成列功能介绍
Bootstrap Blazor 是一套企业级 UI 组件库,适配移动端支持各种主流浏览器,已经在多个交付项目中使用。通过本套组件可以大大缩短开发周期,节约开发成本。目前已经开发、封装了 70 多个组件,欢迎有兴趣的同学试用。
huofo
2022/03/18
1.8K0
Bootstrap Blazor 组件介绍 Table (一)自动生成列功能介绍
Blazor 修仙之旅 - Ant Design of Blazor
这是《Blazor 修仙之旅》的第三篇,前面两分别是《初次尝试》、《组件与数据绑定》,直接到这里上 Ant Design 确实连不起来,跨度比较大,其实我也是在边学边写,看的是官方文档,我觉得中间这部分重复写博客的意义不大,所以我建议去看官方文档,传送门:点我。如果看过我的前两篇,我建议您从这里开始看:点我。不用每篇都深刻理解,但需要有一个基本概念。好了,下面进入正题。
晓晨
2020/06/04
1.2K0
Blazor 修仙之旅 - Ant Design of Blazor
基础 | React怎么判断什么时候该重新渲染组件?
前端爱好者的知识盛宴 React因为他的性能而著名。因为他有一个虚拟DOM层并且只有在需要时才更新真实DOM。即使是同样地信息这也比一直直接更新DOM要快很多。但是,React的智能仅此而已(目前为止),我们的任务是知道React的预期行为以及限制,这样我们才不会意外损失性能。 我们需要关注的一方面是React如何决定什么时候重新渲染组件。不是重新渲染DOM节点,只是调用render方法来改变虚拟DOM。我们可以通过告诉React什么时候需要渲染什么时候不需要渲染来帮助React。让我们依次来看看这些。
用户1097444
2022/06/29
2.9K0
基础 | React怎么判断什么时候该重新渲染组件?
Blazor学习之旅(1)初步了解Blazor
2022年9月以来在学习Blazor做全栈开发,因此根据老习惯,我会将我的学习过程记录下来,一来体系化整理,二来作为笔记供将来翻看。作为第一篇,我们先来了解一下这个Blazor到底是个什么鬼。
Edison Zhou
2023/07/09
9740
Blazor学习之旅(1)初步了解Blazor
Blazor资源大全,很棒的Blazor(2)
.NET Foundation提供的Blazor应用程序构建工作坊,Blazzing Pizza。
用户10786849
2023/10/13
8421
Blazor资源大全,很棒的Blazor(2)
Blazor学习之旅(6)路由系统
Blazor 的路由系统就和 ASP.NET MVC的路由系统一样,可以为我们提供灵活的选项,可用于确保用户请求到达可处理它们并返回用户想要的信息的组件。
Edison Zhou
2023/07/27
3340

相似问题

(Blazor )子组件未呈现

22

Blazor共享组件未呈现

134

呈现来自JavaScript的Blazor组件-如何在组件呈现后从JavaScript更新Blazor组件参数

17

Blazor:没有cshtml的呈现组件

13

如何强制Blazor重新呈现组件

233
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文