您可以采取一条非常迂回的路线,您的布局实现这样的接口并将自身作为级联参数发送。但是,它还有其他副作用。另一种选择是为组件之间的无缝通信创建服务。基本上,您可以使用:
public class SpinnerState
{
public string SpinnerClass {get;set;}
public Func<Task> OnSpinnerClassChanged {get;set;}
public async Task SetSpinnerClass(string newClass)
{
SpinnerClass = newClass;
await OnSpinnerClassChanged.Invoke();
}
}
将其作为会话服务注入:
services.AddScoped<SpinnerState>();
然后在布局中使用
@inject SpinnerState state
@implements IDisposable
// hook and unhook event listeners in OnInitialized and Dispose methods respectively
<div class="@state.SpinnerClass"></div>
@Body //etc
@code
{
protected override void OnInitialized()
{
state.OnSpinnerClassChanged += ChangeSpinner;
}
async Task ChangeSpinner()
{
StateHasChanged();
}
}
当子组件更新 SpinnerClass 时,布局会更新状态。
注意事项:
理想情况下,不要这样做。即不要更新 MainLayout 中的 UI。问题是每个布局级别刷新都会导致刷新主体。反过来,这可能会导致组件丢失其状态。相反,(在上面的示例中)让微调器组件监听事件。这样,对状态的任何更新都仅限于微调器组件。
我想更新 UI 以响应一些长期运行的请求是您真正感兴趣的事情。因此,与其传递 UI 属性更新,不如引发一些功能性事件(如 "UploadingFile" )并让各个组件响应它。