Deklariere eine Query, binde ihren Lade- und Fehlerzustand, und lass einen gemeinsamen, keybasierten Cache die Requests deduplizieren. Mutations invalidieren Keys, sodass jede Komponente, die diese Daten anzeigt, sich selbst neu lädt — und beim Wegnavigieren wird abgebrochen, was gerade läuft, bis hinunter zum Server. Blazor WebAssembly und Server, ohne Abhängigkeiten.
@page "/todos"
@inherits DejaComponentBase
@inject TodoApi Api
@if (_todos.IsLoading) { <Spinner/> }
@if (_todos.IsError) { <Alert>@_todos.ErrorMessage</Alert> }
<ul>
@foreach (var todo in _todos.Data ?? [])
{
<li>@todo.Title</li>
}
</ul>
@code {
private readonly Query<List<Todo>> _todos = new();
protected override Task OnInitializedAsync()
=> _todos.Execute("todos", Api.GetTodosAsync);
}Deklariere eine Query<T>, binde IsLoading, IsError
und Data im Markup. Keine Flags, kein try/catch, kein StateHasChanged.
Komponenten mit demselben Key rendern sofort aus dem Cache, teilen sich einen laufenden Request und revalidieren im Hintergrund, wenn die Daten stale sind.
Wegnavigieren bricht laufende Requests ab — bis hinunter zum Server. Ein neuerer Ladevorgang verdrängt und bricht einen älteren ab, veraltete Antworten gewinnen also nie.
Zustand benachrichtigt genau einen Besitzer. Zwei Komponenten nebeneinander können einander nie neu rendern — beweisbar in der Isolations-Demo.
Mutation<T> verfolgt Schreibvorgänge und invalidiert Query-Keys bei
Erfolg per Präfix, sodass jede betroffene Liste sich selbst neu lädt.
Keine JSON-Serialisierer, keine reflektionslastige Magie — trimming- und AOT-sicher, mit Multi-Targeting von net8.0 bis net10.0.