Серверная часть Blazor .Net, куда загружать данные LocalStorage - PullRequest
1 голос
/ 26 сентября 2019

Я использую серверную часть Blazor Preview 9 в .NET Core 3.0, а также пакет 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?

Thx!

1 Ответ

3 голосов
/ 26 сентября 2019

OnAfterRender теперь вызывается только тогда, когда компонент инициализирован, и вы можете выполнять взаимодействие 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");
    }         
}

С точки зрения обеспечения доступности значения для всех компонентов, вы можетелибо используйте глобальный класс состояний, либо предоставьте его через каскадный параметр.Любой из вариантов сработает, и я на самом деле не вижу один лучше другого, я бы сказал, что если вам нужно, чтобы другие биты оставались в состоянии, тогда используйте класс состояния, если нет, то, вероятно, используйте параметр каскадирования..

Согласно комментарию Мистера Магу, было бы лучше сделать это в компоненте App.razor, чтобы он загружался даже в сценариях с глубокими ссылками.

...