上一篇写到了创建Blazor全局页面对象供各页面级组件使用,有没有办法创建App 级联对象供各页面级组件使用呢?先看CascadingAuthenticationState.razor的源码:
@implements IDisposable
@inject AuthenticationStateProvider AuthenticationStateProvider
<CascadingValue TValue="System.Threading.Tasks.Task<AuthenticationState>" Value="@_currentAuthenticationStateTask" ChildContent="@ChildContent" />
@code {
private Task<AuthenticationState>? _currentAuthenticationStateTask;
/// <summary>
/// The content to which the authentication state should be provided.
/// </summary>
[Parameter]
public RenderFragment? ChildContent { get; set; }
protected override void OnInitialized()
{
AuthenticationStateProvider.AuthenticationStateChanged += OnAuthenticationStateChanged;
_currentAuthenticationStateTask = AuthenticationStateProvider
.GetAuthenticationStateAsync();
}
private void OnAuthenticationStateChanged(Task<AuthenticationState> newAuthStateTask)
{
_ = InvokeAsync(() =>
{
_currentAuthenticationStateTask = newAuthStateTask;
StateHasChanged();
});
}
void IDisposable.Dispose()
{
AuthenticationStateProvider.AuthenticationStateChanged -= OnAuthenticationStateChanged;
}
}
源码地址:aspnetcore/CascadingAuthenticationState.razor at main · dotnet/aspnetcore · GitHub
根据它我们就可以编写自己的App全局级联对象了:CascadingValueWithCallback.razor
@implements IDisposable
<CascadingValue TValue="CascadingValueForPage" Value="@ValueForPage" ChildContent="@ChildContent" Name="CascadingValueForPage" IsFixed="false" />
@code {
[Parameter, System.Diagnostics.CodeAnalysis.AllowNull]
public RenderFragment ChildContent { get; set; }
private CascadingValueForPage ValueForPage { get; set; } = new CascadingValueForPage() { Id = 188, SId = "原值" };//初始值测试用
private void ChangeIdHandle(int id)
{
ValueForPage.Id = id;
}
private void ChangeSIdHandle(string sid)
{
ValueForPage.SId = sid;
}
protected override void OnInitialized()
{
base.OnInitialized();
ValueForPage.OnIdValueChanged = new EventCallback<int>(this, @ChangeIdHandle);
ValueForPage.OnSIdValueChanged = new EventCallback<string>(this, @ChangeSIdHandle);
}
void IDisposable.Dispose()
{
ValueForPage = null;
GC.SuppressFinalize(this);
}
}
CascadingAuthenticationState 怎么用不用我多嘴了吧,CascadingValueWithCallback用法也是同样的,经测试效果与上篇一样: