You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用父组件方法无法填充Blazor组件,求排查原因

Blazor Repository组件调用Load()不渲染数据的问题排查

问题原因

当通过父组件的@ref调用子组件的Load()方法时,Elements已成功赋值,但Blazor未收到组件状态变更通知,因此不会重新渲染UI。这是因为Task.Run执行的代码脱离了Blazor的同步上下文,数据更新后组件无法自动感知变化。

解决方案

在Load()方法完成数据赋值后,手动调用StateHasChanged()方法,通知Blazor组件状态已变更,触发重新渲染。

修改后的Repository组件代码

<h3>Repository</h3>

@if(Elements == null)
{
    <span>加载中...</span>
}
else
{
    <span>@Elements.Count elements</span>
    <ul class="list-group">
        @foreach (var element in Elements)
        {
            <li class="list-group-item">@element</li>
        }
    </ul>
}

@code {
    protected List<string>? Elements { get; set; }

    public async Task Load()
    {
        Elements = await Task<List<string>>.Run(() =>
        {
            List<string> liste = new();
            liste.Add("a1");
            liste.Add("b1");
            liste.Add("c1");        
            return liste;
        });
        // 通知组件状态变更,触发重新渲染
        StateHasChanged();
    }
}

补充说明

  • 若Load()方法在Blazor同步上下文内执行(不使用Task.Run),可能无需手动调用StateHasChanged(),但使用Task.Run时必须手动触发,因为后台线程操作不会自动同步到UI线程的状态变更。
  • 父组件调用repo.Load()时,建议使用await repo.Load()确保异步操作完成,避免竞态问题。

内容的提问来源于stack exchange,提问作者b210205

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 03:40:56