Blazor OnInitializedAsync中await后更新AppBarState共享状态失效问题
问题根因
这个问题和await执行上下文没有关系,核心原因是你使用的共享状态类AppBarState没有实现状态变更通知机制,Blazor组件无法感知到共享属性的修改,自然不会触发重渲染更新UI。
第一次给Title赋值"Analyses"能生效,是因为这次赋值发生在OnInitializedAsync的首个await节点之前,此时顶部应用栏组件还未完成首次渲染,读取到的初始状态就是你设置的默认值。等await异步操作完成后你第二次修改Title时,没有任何机制通知应用栏组件“状态已更新,需要重新渲染”,哪怕控制台能打印出正确的新值、哪怕你给Title赋值固定纯字符串,UI都会一直停留在首次渲染拿到的旧值上。
修复步骤
- 第一步:改造
AppBarState类,增加状态变更事件,在Title属性修改时主动通知所有订阅方
public class AppBarState { // 状态变更事件,供组件订阅 public event Action? OnStateChanged; private string _title = string.Empty; public string Title { get => _title; set { _title = value; // 值修改后触发变更通知 OnStateChanged?.Invoke(); } } }
- 第二步:在显示标题的顶部应用栏组件中,订阅
AppBarState的变更事件,收到通知时触发自身重渲染,同时记得在组件销毁时取消订阅避免内存泄漏
@implements IDisposable @inject AppBarState AppBarState <!-- 组件原有标题渲染位置,直接绑定共享状态的Title属性即可 --> <div class="app-bar-title">@AppBarState.Title</div> @code { protected override void OnInitialized() { // 订阅状态变更事件,收到通知时调用组件自身的StateHasChanged触发重绘 AppBarState.OnStateChanged += StateHasChanged; } public void Dispose() { // 组件销毁时取消订阅,防止内存泄漏 AppBarState.OnStateChanged -= StateHasChanged; } }
你原来业务页面里写的OnInitializedAsync逻辑不需要做任何修改,改造完成后异步获取完项目数据再修改appBarState.Title时,就会自动触发应用栏重渲染,新的带项目名的标题就能正常显示了。
内容的提问来源于stack exchange,提问作者Samuel Carswell
相关产品推荐
相关产品推荐

