Blazor子组件按钮禁用:父组件回调完成后重新启用方案
解决Blazor子组件提交按钮禁用不生效的问题
问题根源
- 子组件的
OnSubmit是同步方法,设置_isFormDisabled = true后,未等待EventCallback执行完成就立刻将其设回false,导致UI没有足够时间更新按钮状态。 - 父组件的
GetCacheMemoryUsages是同步耗时方法,会阻塞UI线程,进一步阻止按钮状态的及时渲染。
修复步骤
1. 修改子组件代码,将OnSubmit改为异步方法
需要等待EventCallback执行完成后再恢复按钮状态,同时显式触发UI更新确保状态生效:
<RadzenTemplateForm TItem="SearchInputModel" Data=@_model Submit=@OnSubmit> <div class="col-sm-2 p-3"> <RadzenText TextStyle="TextStyle.Subtitle2" TagName="TagName.H3">Region Version</RadzenText> <RadzenTextBox @bind-Value=@_model.RegionVersion class="w-100" /> </div> <div class="col-sm-2 pt-5"> <RadzenButton Variant="Variant.Flat" Text="Search" ButtonType="ButtonType.Submit" ButtonStyle="ButtonStyle.Dark" Disabled="@_isFormDisabled" /> </div> </RadzenTemplateForm> @code { bool _isFormDisabled; SearchInputModel _model = new(); [Parameter] public EventCallback<SearchInputModel> OnSearchClickEventCallback { get; set; } async Task OnSubmit(SearchInputModel model) { _isFormDisabled = true; StateHasChanged(); try { await OnSearchClickEventCallback.InvokeAsync(model); } finally { _isFormDisabled = false; StateHasChanged(); } } }
2. 修改父组件的耗时方法为异步(推荐)
同步耗时方法会阻塞UI线程导致页面无响应,建议改为异步实现:
<ChildComponent OnSearchClickEventCallback="@GetCacheMemoryUsages"></ChildComponent> @code { IEnumerable<CacheKeyMemoryUsage> _cacheKeyMemoryUsages = new List<CacheKeyMemoryUsage>(); private async Task GetCacheMemoryUsages(SearchInputModel model) { // 把CPU密集型耗时操作放入后台线程 await Task.Run(() => { // 执行原耗时操作代码 // 若需更新组件状态,需通过InvokeAsync确保在UI线程执行 }); } }
若父组件方法无法改为异步的兼容方案
如果必须保留同步方法,可通过Task.Run将其放入后台线程,避免阻塞UI:
private async Task GetCacheMemoryUsages(SearchInputModel model) { await Task.Run(() => { // 原同步耗时操作代码 }); // 更新UI状态需调用InvokeAsync await InvokeAsync(StateHasChanged); }
内容的提问来源于stack exchange,提问作者J Nguyen
相关产品推荐
相关产品推荐

