我在.NET Core 3.0上使用Blazor Preview 9服务器端,还使用nuget包Blazored.LocalStorage在浏览器的本地存储中加载和保存数据。
现在,我希望在加载应用程序时按需加载一次。
为此,我需要使用OnFirstRenderer,因为它必须完全位于客户端才能访问其浏览器缓存。现在我使用页面“ /”(Index.razor),但是我不确定这是否是正确的锚点或执行方法:
[Parameter]
public string Test { get; set; }
protected async override Task OnAfterRenderAsync(bool firstRender)
{
try
{
if (firstRender)
{
await localStorage.SetItemAsync("TEST", "Hallo Welt");
}
if (Test == null)
{
Test = await localStorage.GetItemAsync<string>("TEST");
StateHasChanged();
}
}
catch (Exception ex)
{
throw;
}
}
我也不知道如何将其用于所有组件:
使用全局变量制作服务并将其注入每个组件或通过CascadingValue方法进行操作的最佳方法是吗?
谢谢!
答案 0 :(得分:3)
OnAfterRender
,并且您可以执行JS互操作(此后每次重新渲染组件时都会调用JS互操作-但firstRender将为false)。因此,如果您只想从本地存储加载一次值,则可以在firstRender
期间按照以下示例进行操作。
[Parameter]
public string Test { get; set; }
protected async override Task OnAfterRenderAsync(bool firstRender)
{
if (firstRender)
{
Test = await localStorage.GetItemAsync<string>("TEST");
}
}
在使值可用于所有组件方面,您可以使用全局状态类,也可以通过级联参数提供它。两种方法都可以使用,但我并没有真正认为它比另一种更好,我要说的是,如果您需要将其他位保持在状态中,请使用状态类,如果您不希望使用级联参数,
根据Magoo先生的评论-最好在App.razor组件中执行此操作,这样即使在深度链接的情况下也可以加载它。