Blazor-Komponentenmodell
Erstellen Sie Razor-Komponenten, verstehen Sie den Lebenszyklus von Komponenten und verwenden Sie Parameter und kaskadierende Werte.
Blazor-Komponentenmodell ist eine kostenlose C# Academy-Lektion auf CoddyKit. Dies ist Lektion 1 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des C# Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der C# Academy-Kurs umfasst insgesamt 4 Lektionen.
Was ist Blazor?
Mit Blazor können Sie interaktive Weboberflächen mit C# statt JavaScript erstellen. Komponenten werden in .razor-Dateien definiert, die HTML-Markup und C#-Logik kombinieren. Blazor läuft auf dem Server (Blazor Server) oder über WebAssembly im Browser (Blazor WASM).
Ihre erste Komponente
Eine Razor-Komponente ist eine .razor-Datei mit HTML-Markup und einem @code-Block für C#. Der Name der Komponente wird zum Namen des HTML-Tags.
@* Greeting.razor *@
<h2>Hello, @Name!</h2>
<p>You have @Count messages.</p>
@code {
[Parameter] public string Name { get; set; } = "World";
private int Count = 5;
}Komponentenlebenszyklus
Blazor-Komponenten haben einen Lebenszyklus mit Methoden, die Sie überschreiben können. Die wichtigsten sind OnInitializedAsync (Laden von Daten) und OnParametersSetAsync (Reaktion auf Parameteränderungen).
@code {
private List<Product> Products = new();
protected override async Task OnInitializedAsync()
{
// Called once on first render
Products = await Http.GetFromJsonAsync<List<Product>>("/api/products")
?? new();
}
protected override async Task OnParametersSetAsync()
{
// Called whenever parameters change
await LoadDataAsync();
}
}Parameter: Daten an Komponenten übergeben
Kennzeichnen Sie Eigenschaften mit [Parameter], um Daten von übergeordneten Komponenten zu akzeptieren. Parameter werden vor dem Rendern gesetzt und können bei Änderungen ein erneutes Rendern auslösen.
@* ProductCard.razor *@
<div class="card">
<h4>@Product.Name</h4>
<p>Price: @Product.Price.ToString("C")</p>
<button @onclick="AddToCart">Add to Cart</button>
</div>
@code {
[Parameter, EditorRequired]
public Product Product { get; set; } = default!;
[Parameter]
public EventCallback<Product> OnAddToCart { get; set; }
private async Task AddToCart() =>
await OnAddToCart.InvokeAsync(Product);
}Cascading-Parameter
Cascading-Parameter werden im Komponentenbaum weitergegeben, ohne dass sie explizit durch jede Zwischenebene gereicht werden müssen – ideal für Designs, Benutzerinformationen oder gemeinsamen Zustand.
@* App.razor — wraps the whole app *@
<CascadingValue Value="CurrentUser">
<Router AppAssembly="@typeof(App).Assembly">
<Found Context="routeData">
<RouteView RouteData="routeData" DefaultLayout="@typeof(MainLayout)" />
</Found>
</Router>
</CascadingValue>
@* Anywhere in the tree: *@
@code {
[CascadingParameter]
public UserInfo CurrentUser { get; set; } = default!;
}Listen und Bedingungen rendern
Verwenden Sie die Razor-Direktiven @if, @foreach und @for, um dynamische Inhalte zu rendern. Geben Sie bei Listenelementen immer @key an, damit Änderungen effizient abgeglichen werden können.
@if (Products.Count == 0)
{
<p>No products found.</p>
}
else
{
<ul>
@foreach (var product in Products)
{
<li @key="product.Id">
<ProductCard Product="product" OnAddToCart="HandleAdd" />
</li>
}
</ul>
}RenderFragment und ChildContent
Verwenden Sie RenderFragment, um Markup als Parameter zu übergeben – ähnlich wie Slots in Vue oder Children in React. Der übliche Parametername ist ChildContent.
@* Panel.razor *@
<div class="panel">
<div class="panel-header">@Title</div>
<div class="panel-body">@ChildContent</div>
</div>
@code {
[Parameter] public string Title { get; set; } = "";
[Parameter] public RenderFragment? ChildContent { get; set; }
}
@* Usage: *@
<Panel Title="Order Details">
<p>Order #42 — Shipped</p>
</Panel>Komponentenreferenzen mit @ref
Erfassen Sie mit @ref eine Referenz auf eine untergeordnete Komponente, um deren öffentliche Methoden aufzurufen oder deren Eigenschaften von der übergeordneten Komponente zu lesen.
@* Parent.razor *@
<ConfirmDialog @ref="_dialog" OnConfirm="DeleteOrder" />
<button @onclick="() => _dialog!.Show()">Delete Order</button>
@code {
private ConfirmDialog? _dialog;
private async Task DeleteOrder()
{
await OrderService.DeleteAsync(CurrentOrderId);
// Refresh UI...
}
}StateHasChanged und manuelles erneutes Rendern
Blazor rendert nach Eventhandlern automatisch erneut. Rufen Sie bei asynchronen Zustandsänderungen außerhalb von Eventhandlern (z. B. durch einen Hintergrund-Timer) StateHasChanged() manuell auf.
@implements IDisposable
<p>Time: @CurrentTime</p>
@code {
private string CurrentTime = "";
private Timer? _timer;
protected override void OnInitialized()
{
_timer = new Timer(_ =>
{
CurrentTime = DateTime.Now.ToString("HH:mm:ss");
InvokeAsync(StateHasChanged); // thread-safe re-render
}, null, 0, 1000);
}
public void Dispose() => _timer?.Dispose();
}ShouldRender für bessere Leistung
Überschreiben Sie ShouldRender(), um unnötiges erneutes Rendern zu überspringen. Geben Sie false zurück, wenn sich die Ausgabe der Komponente nicht ändert, und reduzieren Sie so den Aufwand für den Abgleich.
@code {
private string _lastRenderedStatus = "";
[Parameter] public string Status { get; set; } = "";
protected override bool ShouldRender()
{
// Only re-render if Status actually changed
if (Status == _lastRenderedStatus) return false;
_lastRenderedStatus = Status;
return true;
}
}Praxisbeispiel: Produktlistenkomponente
Eine vollständige Produktlistenkomponente, die Daten bei der Initialisierung lädt, den Ladestatus verarbeitet und Ereignisse an die übergeordnete Komponente weitergibt.
@inject HttpClient Http
@if (_loading)
{
<p>Loading products...</p>
}
else
{
@foreach (var p in _products)
{
<ProductCard Product="p" OnAddToCart="AddToCart" />
}
}
@code {
private List<Product> _products = new();
private bool _loading = true;
[Parameter] public EventCallback<Product> OnCartUpdated { get; set; }
protected override async Task OnInitializedAsync()
{
_products = await Http.GetFromJsonAsync<List<Product>>("/api/products")
?? new();
_loading = false;
}
private async Task AddToCart(Product p) => await OnCartUpdated.InvokeAsync(p);
}Kurze Überprüfung
Welche Lebenszyklusmethode eignet sich am besten, um Daten aus einer API zu laden, wenn eine Blazor-Komponente initialisiert wird?
Zusammenfassung: Das Blazor-Komponentenmodell
Wichtigste Erkenntnisse:
- .razor-Dateien kombinieren HTML-Markup mit C# in einem @code-Block
- [Parameter] akzeptiert Daten von der übergeordneten Komponente; EventCallback gibt Ereignisse nach oben weiter
- CascadingParameter gibt Daten nach unten weiter, ohne Prop-Drilling
- RenderFragment/ChildContent ermöglicht zusammensetzbare, slotbasierte Komponenten
- OnInitializedAsync zum Laden der Anfangsdaten; StateHasChanged zum manuellen erneuten Rendern
- ShouldRender() überspringt zur Leistungssteigerung unnötige Abgleiche
Lerne C# mit einem KI-Tutor — kostenlos
Schreibe und führe echten Code in deinem Browser aus, bekomme sofortige Hilfe von einem 24/7 KI-Tutor und setze dein Lernen im Web oder in der App fort.
- Kurse
- 93
- Lektionen
- 346
Häufig gestellte Fragen
Ist die Lektion „Blazor-Komponentenmodell“ kostenlos?
Ja — der vollständige Text von „Blazor-Komponentenmodell“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des C# Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der C# Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Blazor-Komponentenmodell“?
Erstellen Sie Razor-Komponenten, verstehen Sie den Lebenszyklus von Komponenten und verwenden Sie Parameter und kaskadierende Werte. Du übst C# Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um C# Academy zu starten?
Keine Vorkenntnisse erforderlich. C# Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 1 von 4.
Wie lange dauert die Lektion „Blazor-Komponentenmodell“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser C# Academy-Lektion Code schreiben und ausführen?
Ja. Jede C# Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Blazor-Komponentenmodell
- Datenbindung und Ereignisbehandlung
- Komponentenkommunikation und DI
- Zustandsverwaltung in Blazor