如何避免Blazor SSR组件OnInitialized方法中业务逻辑重复执行?
Blazor预渲染时OnInitialized重复执行问题及后续疑问
原始问题
开启预渲染时,Blazor SSR组件的OnInitialized方法会执行两次。我将加载数据库产品列表这类业务逻辑写在该方法中,想知道如何避免其重复执行?是否必须用IsInitialized这类本地变量跟踪执行状态?Blazor有没有内置检测机制?或者是否需要将业务逻辑移至其他生命周期方法?
9/23 更新:补充代码说明问题
已尝试@Rena的第4种方案,但未达到预期效果。所有组件继承自BaseComponent,我需要在其中获取登录用户信息,因此在OnInitialized方法中调用获取用户上下文的方法,希望该逻辑仅执行一次。目前GetUserContextFromAuthenticationState和GetProductsListFromDatabase均执行两次,isInitialized始终为false。
应用配置:
- App.razor未指定渲染模式,以静态服务器渲染模式启动
BaseComponent指定为交互式服务器渲染模式
BaseComponent.razor
@rendermode InteractiveServer @code { private bool isInitialized = false; protected override async Task OnInitializedAsync() { if (!isInitialized) { var user = GetUserContextFromAuthenticationState(); isInitialized = true; } } }
Products.razor
@inherits BaseComponent @code { private bool isInitialized = false; protected override async Task OnInitializedAsync() { await base.OnInitializedAsync().ConfigureAwait(false); if (!isInitialized) { var products = GetProductsListFromDatabase(); isInitialized = true; } } }
9/24 更新:已解决部分问题
使用IHttpContextAccessor.HttpContext检测预渲染的方案可行(@Rena的第2种答案),已标记为正确答案。
后续疑问
但我想知道上述代码无效的原因:Blazor组件是否会被实例化两次?这是否是isInitialized始终为false的原因?是否需要单独提问?我花费了大量时间理解Blazor组件生命周期,但仍有困惑。
内容的提问来源于stack exchange,提问作者Shankar
相关产品推荐
相关产品推荐

