Вот мое решение моей проблемы. Это работает, но это немного запутанно, я надеюсь, что кто-то найдет лучший способ ...
По сути, я обертываю область, которую нужно обновить изолированно, <Updatable>
:
<div class="main">
<Updatable Event="@statusEvent">
<div class="toolbar row bg-light">
<span style="width:100%;text-align:right"> Status: @status </span>
</div>
</Updatable>
:
</div>
Вы определяете и используете statusEvent
так:
@functions {
:
string status = "--";
UpdateEvent statusEvent = new UpdateEvent();
void HandleEvent(string anEvent) {
status = anEvent; // updates every 2 seconds
//StateHasChanged(); // renders MonstrouslyDeepApp--every second!
statusEvent.StateChanged(); // only renders status area--every second
}
:
}
В Updatable.razor:
@page "/Updatable"
@functions {
[Parameter] UpdateEvent Event { get; set; }
[Parameter] RenderFragment ChildContent { get; set; }
protected override void OnInit() {
Event.OnChange += (s, e) => {
StateHasChanged();
};
}
}
@ChildContent
И, наконец, UpdateEvent - это просто оболочка для события:
public class UpdateEvent {
public event EventHandler OnChange;
public void StateChanged() { OnChange?.Invoke(this, EventArgs.Empty); }
}