#c# #.net #blazor
#c# #.net #блейзор
Вопрос:
У меня есть небольшая вещь, которую мне нужно сделать. Вот в чем моя проблема. Я открываю компонент, а затем я могу нажать «редактировать», а затем мне нужно 3-4 секунды, пока на странице отображается нужный html / css. Что я пытаюсь сделать, так это то, что когда я нажимаю «редактировать», я устанавливаю «загрузка = истина», а когда компонент завершает рендеринг этого нового html / css, я устанавливаю «загрузка = ложь». Вот пример того, чего я пытаюсь достичь:
if (!edit) {
<h2>test</h2>
@foreach (var item in items) {
<p>Test item</p>
}
}
else {
<button @onclick = "() => { edit = true; }">
<h2>test other </h2>
<input />
<input />
}
Вот как я настроил счетчик загрузки для отображения на странице:
await InvokeAsync(() => { loading = true; });
await InvokeAsync(() => { loading = false; });
Итак, мой вопрос в том, как я могу сделать так, чтобы, когда человек нажимает «Редактировать», счетчик автоматически начинал вращаться на экране. Я знаю, как это сделать при OnInitializedAsync, но в данной конкретной ситуации он не инициализируется, он просто показывает другую часть компонента (но это занимает 5 секунд, огромный код). Есть ли способ?
Комментарии:
1. Вызываете ли вы ‘StateHasChanged ()’ после установки свойства / поля загрузки?
2. нет, не устанавливайте его. «await InvokeAsync(() => { loading = true; });» автоматически выполняет эту работу. Но проблема не в этом. Проблема в том, что я не понимаю жизненный цикл компонентов blazor. Так что не знаю, куда поместить эти «loading = true» и «loading = false». Это в OnAfterRenderAsync? Как мне использовать логику для этой работы
3. @PovilasDirse обычно вы размещаете его до и после вызова для загрузки данных. Иногда мне приходилось использовать
Thread.Sleep(1)
для обновления экрана после каждого установки флага загрузки.4. итак, у меня было бы так: @onclick = «() => {await logic(); }». Внутри метода «logic» я бы перевел поток в спящий режим и установил для edit значение true?
5. @PovilasDirse да, до и после обработки данных или чего-то еще, что отнимает время. Внутри «логики» edit = true; ThreadSleep(1); StateHasChanged(); Выполняйте свой медленный код ….; edit = false; StateHasChanged();
Ответ №1:
Для промежуточных обновлений требуется StateHasChanged. Blazor применяет его до и после события, но здесь это вам не поможет.
<button @onclick="@DoLogic">Load</button>
async Task DoLogic()
{
edit = false; // means loading == true
StateHasChanged(); // to be sure, probably not needed
await Task.Delay(1); // allow time for the rendering
// do the actual loading
edit = true; // means loading == false
}
Хитрость здесь await Task.Delay(1);
в том, что ваш метод на некоторое время приостанавливается, и Blazor может обновить DOM.
Здесь нет причин для InvokeAsync.
Комментарии:
1. Спасибо. Только что увидел ваше сообщение. То, что я сделал, было именно этим, и да, это сработало. Спасибо
2. спасибо, это сработало и для меня. определенно была задача ожидания. Задержка (1); что сделало свое дело, хотя и необычно.