Blazor子组件获取父组件更新参数为空问题求助(ASP.NET Core 6)
问题原因
你在父组件更新AppException后直接调用子组件的Open()方法,此时Blazor尚未完成组件渲染流程——Blazor的参数传递是在渲染阶段同步的,而非属性赋值后即时生效,所以子组件的AppException还是初始的null值。
解决方案
提供两种可行的解决方式:
方式一:先同步参数再调用方法
在父组件更新AppException后,先触发组件渲染等待子组件同步参数,再调用Open()方法:
- 父组件中给子组件添加引用并修改方法:
<MyModal @ref="MyModal" AppException="@AppException" /> @code { private Exception AppException { get; set; } private MyModal MyModal { get; set; } public async Task ThrowSampleError() { try { throw new Exception("I crashed"); } catch (Exception ex) { AppException = ex; // 触发渲染,等待子组件同步参数 await InvokeAsync(StateHasChanged); MyModal.Open(); } } }
- 子组件保持原有
[Parameter]定义和Open()逻辑即可。
方式二:直接传递异常到子组件方法
绕开参数同步的渲染依赖,调用Open()时直接传入异常数据:
- 父组件修改方法:
<MyModal @ref="MyModal" /> @code { private MyModal MyModal { get; set; } public void ThrowSampleError() { try { throw new Exception("I crashed"); } catch (Exception ex) { MyModal.Open(ex); } } }
- 子组件修改
Open()方法接收参数:
<div class="modal @ModalClass">modal content</div> @code { public string ModalClass = ""; public void Open(Exception appException) { NLog.Logger _logger = NLog.LogManager.GetCurrentClassLogger(); _logger.Log(NLog.LogLevel.Error, $"{appException.Message} ---- {appException.StackTrace}"); ModalClass = "Show"; StateHasChanged(); } }
补充说明
你之前尝试的CascadingValue无效,本质也是因为级联值更新后需要组件重新渲染才能同步到子组件,而你直接调用方法时渲染流程还没走完。方式二更推荐,逻辑更直接,无需依赖组件渲染周期。
内容的提问来源于stack exchange,提问作者T3.0
相关产品推荐
相关产品推荐

