Blazor .Net服务器端在哪里加载LocalStorage数据

时间:2019-09-26 08:04:07

标签: .net-core storage blazor

我在.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方法进行操作的最佳方法是吗?

谢谢!

1 个答案:

答案 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组件中执行此操作,这样即使在深度链接的情况下也可以加载它。