Blazor:NavigationLock的ConfirmExternalNavigation无法读取最新属性值怎么办?
解决方案
替代Task.Delay(100)的可靠方案
用await Task.Yield()替代固定延迟,代码调整如下:
HasUnsavedChanges = false; StateHasChanged(); await Task.Yield(); Navigation.NavigateTo(gotoUrl, true);
原理说明
StateHasChanged()仅标记组件需要重新渲染,但Blazor的渲染是异步执行的。直接调用NavigateTo时,NavigationLock的ConfirmExternalNavigation参数还没来得及更新为false,因此触发了浏览器确认框。
Task.Yield()会让出当前执行线程,让Blazor完成当前渲染周期,确保NavigationLock的绑定值已同步更新后,再执行导航操作,比固定延迟更稳定,不存在时间偏差的隐患。
另一种可选方案(更严谨)
如果需要更明确地等待组件状态更新完成,可以结合InvokeAsync使用,但Task.Yield()已经足够简洁解决问题:
HasUnsavedChanges = false; await InvokeAsync(() => StateHasChanged()); await Task.Yield(); Navigation.NavigateTo(gotoUrl, true);
内容的提问来源于stack exchange,提问作者David Thielen
相关产品推荐
相关产品推荐

