Асинхронное каскадное значение Blazor всегда равно null

Допустим, у меня есть следующий код в MainLayout.razor

<CascadingValue Value = "@(async () => await someclass.GetValueAsnyc())" Name = "asyncValue">
  <article class = "content px-4">
   @Body
  </article>
</CascadingValue>

И в Index.razor:

<h1>Hello!</h1>
@code{
     [CascadingParameter(Name = "asyncValue")] public string AsyncValue{ get; set; }


protected override async Task OnInitializedAsync()
{
   //do something with AsyncValue- it is always null
}
}

Я предполагаю, что объявление переменной в Index.razor не ожидает каскадного значения в Mainlayout.razor. Это работает, если я вызываю метод синхронно с .Result в конце, но это не то, что я хотел бы сделать, если это возможно.

Есть ли у кого-нибудь руководство или может указать мне правильное направление, чтобы каскадное значение загружалось асинхронно?

Если вы используете асинхронность, я боюсь, что фактический тип свойства может оказаться как Task<string>, а не string. Может, попробовать сопоставить этот тип и посмотреть? С другой стороны, вы можете «вычислить» значение в блоке @code в MainLayout, а затем просто передать свойство, содержащее значение

Krzysztof Skowronek 13.10.2022 14:17
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
73
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я думаю, это должно помочь.

Сначала потребительский компонент. Каскадное значение — это Task, которое может завершиться или не завершиться. Чтобы потреблять его, вы await его. Если это уже завершено, то ждать нечего. Он дает результат сразу.

<h3>@this.value</h3>
<button class = "btn btn-primary" @onclick=this.OnClick>Get Value Again</button>
@code {
    private string value = string.Empty;
    [CascadingParameter] private Task<string>? DataTask { get; set; }

    protected override async Task OnInitializedAsync()
    {
        if (this.DataTask is not null)
            this.value = await DataTask;
    }

    private async Task OnClick()
    {
        if (this.DataTask is not null)
            this.value = await DataTask;
    }
}

И тестовая страница. Я не помещал его в макет или приложение, так как проще увидеть, что происходит на тестовой странице. Каскадное значение — это поле Task<string>, которому вы назначаете метод.

@page "/Test"

<PageTitle>Test</PageTitle>

<CascadingValue Value = "this.DataTask">
    <MyComponent />
</CascadingValue>

@code {
    private Task<string>? DataTask;

    protected override Task OnInitializedAsync()
    {
        DataTask = GetSomeDateAsync();
        return Task.CompletedTask;
    }

    private async Task<string> GetSomeDateAsync()
    {
        await Task.Delay(5000);
        return DateTime.Now.ToLongTimeString();
    }
}

В основном так работает каскад AuthenticationState.

Очень интересно! Я очень ценю, что вы поделились этим, я попробую позже и отчитаюсь!

EyeSeeSharp 13.10.2022 15:13

Не обращайте внимания на мой предыдущий комментарий, это, кажется, сделало это, спасибо!

EyeSeeSharp 28.10.2022 14:27

Другие вопросы по теме