Blazor组件传值异常:OnInitializedAsync无法获取正确ID值
问题原因
你的问题核心是组件生命周期执行时机与参数更新逻辑不匹配:
OnInitializedAsync仅在组件第一次初始化时执行一次。如果父组件中warehouseShipment.ShipId是异步加载(比如从数据库/API获取),组件初始化时id还是默认值0,此时test被设为"Fail"。- 后续父组件数据加载完成,
id更新为3,但OnInitializedAsync不会再次执行,test保持"Fail";而HTML部分会实时绑定最新的id值,因此出现"Fail3"的结果。
解决方案
方案1:改用OnParametersSetAsync处理参数更新
OnParametersSetAsync会在组件初始化以及每次参数变化时执行,适配参数动态更新的场景:
修改TestComponent的@code部分:
protected override async Task OnParametersSetAsync() { // 可选:添加判断避免重复执行数据库操作(仅在id有效且未加载过时执行) if (id != 0 && test != "Success") { test = "Success"; // 在这里执行数据库查询逻辑,例如: // var data = await _dbContext.Inventories.FindAsync(id); } else if (id == 0) { test = "Fail"; } }
方案2:确保父组件数据就绪后再渲染子组件
如果warehouseShipment是异步加载的,在父组件中先判断数据是否完成加载,再渲染TestComponent,这样组件初始化时就能拿到正确的id:
修改父页面代码:
<div> @if (warehouseShipment != null) { <TestComponent @ref="_windowComp" id="@warehouseShipment.ShipId" /> } <button @onclick="@(()=> _windowComp?.Show())" class="btn btn-success btn-label btn-sm waves-effect waves-light"> <i class="ri-briefcase-5-line label-icon align-middle fs-16 me-2"></i>Reserve Inventory </button> </div>
这种方式下,组件第一次初始化时id就是正确的有效值,OnInitializedAsync中能直接拿到目标值执行数据库操作。
补充说明
- 若数据库操作仅需执行一次,优先选择方案2,或在方案1中添加判断条件避免重复执行。
- 使用
@ref时,若子组件是条件渲染,调用组件方法(如Show())需加空引用判断(如_windowComp?.Show()),避免报错。
内容的提问来源于stack exchange,提问作者Big Cat
相关产品推荐
相关产品推荐

