Как узнать, когда мне нужно вызвать StateHasChanged () в Blazor? - PullRequest
0 голосов
/ 01 апреля 2020

Как узнать, когда мне нужно вызвать StateHasChanged () в Blazor?

В типичном сценарии, скажем, я загружаю данные и хочу, чтобы кнопка «Загрузить» была отключена во время загрузки , Так что, возможно, у меня есть следующее. Поведение, которое я вижу, заключается в том, что кнопка будет отображаться включенной во время начальной загрузки, если я не вызову base.StateHasChanged() в строке 17; однако после этого, если я нажму «загрузить», кнопка будет отключена во время загрузки, а затем станет активной, как и ожидалось. Так почему же это не работает при вызове OnInitializedAsyn c? Есть ли альтернативный подход, который позволил бы мне опустить StateHasChanged ()?

@inject HttpClient Http
<div class="my-component">
    <button disabled="@(LoadingTask?.IsCompleted == false)" @onclick="LoadData">Load</button>
    ...
</div>

@code {
  protected override async Task OnInitializedAsync() => await LoadData();

  private Task<Thing[]>? LoadingTask { get; set; }
  private Thing[] Data { get; set; } = new Thing[0];

  private async Task LoadData()
  {
    LoadingTask = Http.GetJsonAsync<Thing[]>(url);

    // Line 17: I shouldn't need to call base.StateHasChanged() here, right?

    funds = await LoadingTask;
    HasLoaded = true;
  }

}

Ответы [ 3 ]

0 голосов
/ 02 апреля 2020

Вы находитесь во власти GetJsonAsyn c (), это зависит от того, насколько быстро получается поток.

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

  private bool isLoading = false;

  private async Task LoadData()
  {
    isLoading = true;
    await Task.Delay(1);  // Task.Yield() does not always work
    funds = await Http.GetJsonAsync<Fund[]>(url);   
    isLoading = false;
    HasLoaded = true;
  }

и, конечно,

<button disabled="@isLoading"  ...

Поскольку у вас есть только один асин c действие здесь, вам не нужно вызывать StateHasChanged (). Вы должны убедиться, что ваш код выдает поток в нужный момент. Пример с несколькими шагами см. { ссылка }

0 голосов
/ 23 апреля 2020

Кажется, что OnInitializedAsyn c не позволяет компоненту перерисовываться в ожидании, в отличие от пользовательских событий, таких как OnClick. Поэтому кажется, что вызов StateHasChanged внутри OnInitializedAsyn c необходим, если только Blazor не станет более изощренным, когда проверять изменения в будущих версиях.

0 голосов
/ 02 апреля 2020

Когда вы хотите обновить состояние ChileContent, вы должны вызвать StateHasChanged () в его родительском компоненте.

...