Verwenden von Razor-Komponenten in JavaScript-Apps und SPA-Frameworks

Hinweis

Dies ist nicht die neueste Version dieses Artikels. Die aktuelle Version finden Sie in der .NET 9-Version dieses Artikels.

Warnung

Diese Version von ASP.NET Core wird nicht mehr unterstützt. Weitere Informationen finden Sie in der Supportrichtlinie für .NET und .NET Core. Informationen zum aktuellen Release finden Sie in der .NET 8-Version dieses Artikels.

Wichtig

Diese Informationen beziehen sich auf ein Vorabversionsprodukt, das vor der kommerziellen Freigabe möglicherweise noch wesentlichen Änderungen unterliegt. Microsoft gibt keine Garantie, weder ausdrücklich noch impliziert, hinsichtlich der hier bereitgestellten Informationen.

Die aktuelle Version finden Sie in der .NET 9-Version dieses Artikels.

In diesem Artikel erfahren Sie, wie Sie Razor-Komponenten aus JavaScript rendern, benutzerdefinierte Blazor-Elemente verwenden und Angular- und React-Komponenten generieren.

Hinweis

Wir empfehlen die Verwendung der Skripte blazor.server.js (Blazor Server) und blazor.webassembly.js (Blazor WebAssembly), wenn Sie Razor-Komponenten in eine bestehende JavaScript-Anwendung integrieren, bis in Zukunft eine bessere Unterstützung für das Skript blazor.web.js (Blazor Web App) hinzugefügt wird. Weitere Informationen finden Sie unter RegisterCustomElement funktioniert nicht mehr in Blazor 8 (dotnet/aspnetcore #53920).

Angular-Beispiel-Apps

Rendern von Razor-Komponenten aus JavaScript

Razor Komponenten können für vorhandene JS-Apps dynamisch aus JavaScript (JS) gerendert werden.

Im Beispiel in diesem Abschnitt wird die folgende Razor-Komponente per JS in eine Seite gerendert.

Quote.razor:

<div class="m-5 p-5">
    <h2>Quote</h2>
    <p>@Text</p>
</div>

@code {
    [Parameter]
    public string? Text { get; set; }
}

Fügen Sie in der Program-Datei den Namespace für den Speicherort der Komponente hinzu.

Rufen Sie für die Stammkomponentensammlung der App RegisterForJavaScript auf, um eine Razor-Komponente als Stammkomponente für das JS-Rendern zu registrieren.

RegisterForJavaScript enthält eine Überladung, die den Namen einer JS-Funktion akzeptiert, die Initialisierungslogik ausführt (javaScriptInitializer). Die JS-Funktion wird einmal pro Komponentenregistrierung aufgerufen, unmittelbar nach dem Starten der Blazor-App und vor dem Rendern von Komponenten. Diese Funktion kann für die Integration in JS-Technologien wie benutzerdefinierte HTML-Elemente oder ein JS-basiertes SPA-Framework verwendet werden.

Eine oder mehrere Initialisiererfunktionen können erstellt und von verschiedenen Komponentenregistrierungen aufgerufen werden. Der typische Anwendungsfall besteht darin, dieselbe Initialisiererfunktion für mehrere Komponenten wiederzuverwenden, was erwartet wird, wenn die Initialisiererfunktion die Integration mit benutzerdefinierten Elementen oder einem anderen JS-basierten SPA_Framework konfiguriert.

Wichtig

Verwechseln Sie den Parameter javaScriptInitializer von RegisterForJavaScript nicht mit JavaScript-Initialisierern. Der Name des Parameters und des JS-Initialisiererfeatures ist zufällig.

Im folgenden Beispiel wird die dynamische Registrierung der vorherigen Quote-Komponente mit „quote“ als Bezeichner veranschaulicht.

  • Ändern Sie in einer Blazor Server-App den Aufruf von AddServerSideBlazor in der Program-Datei:

    builder.Services.AddServerSideBlazor(options =>
    {
        options.RootComponents.RegisterForJavaScript<Quote>(identifier: "quote", 
            javaScriptInitializer: "initializeComponent");
    });
    
  • Rufen Sie in einer Blazor WebAssembly-App RegisterForJavaScript für RootComponents in der clientseitigen Program-Datei auf:

    builder.RootComponents.RegisterForJavaScript<Quote>(identifier: "quote", 
        javaScriptInitializer: "initializeComponent");
    

Fügen Sie die Initialisiererfunktion mit den Funktionsparametern name und parameters an das window-Objekt an. Zu Demonstrationszwecken protokolliert die folgende initializeComponent-Funktion den Namen und die Parameter der registrierten Komponente.

wwwroot/jsComponentInitializers.js:

window.initializeComponent = (name, parameters) => {
  console.log({ name: name, parameters: parameters });
}

Rendern Sie die Komponente aus JS mithilfe des registrierten Bezeichners in ein Containerelement, und übergeben Sie bei Bedarf Komponentenparameter.

Im folgenden Beispiel:

  • Die Quote-Komponente (quote-Bezeichner) wird in das quoteContainer-Element gerendert, wenn die Funktion showQuote aufgerufen wird.
  • Eine Anführungszeichen-Zeichenfolge wird an den Text-Parameter der Komponente übergeben.

wwwroot/scripts.js:

window.showQuote = async () => {
  let targetElement = document.getElementById('quoteContainer');
  await Blazor.rootComponents.add(targetElement, 'quote', 
  {
    text: "Crow: I have my doubts that this movie is actually 'starring' " +
      "anybody. More like, 'camera is generally pointed at.'"
  });
}

const btn = document.querySelector("#showQuoteBtn");
btn.addEventListener("click", showQuote);

Nachdem das BlazorSkript geladen ist, laden Sie die vorhergehenden Skripte in die JS-Anwendung:

<script src="_framework/{BLAZOR SCRIPT}"></script>
<script src="jsComponentInitializers.js"></script>
<script src="scripts.js"></script>

Im vorangegangenen Beispiel ist der {BLAZOR SCRIPT}-Platzhalter das Blazor-Skript.

Platzieren Sie in HTML das Zielcontainerelement (quoteContainer). Für die Demonstration in diesem Abschnitt löst eine Schaltfläche das Rendern der Quote-Komponente aus, indem die JS-Funktion showQuote aufgerufen wird:

<button id="showQuoteBtn">Show Quote</button>

<div id="quoteContainer"></div>

Bei der Initialisierung, bevor Komponenten gerendert werden, protokolliert die Entwicklertools-Konsole des Browsers den Quote-Bezeichner (name) und die Parameter (parameters) der Komponente, wenn initializeComponent aufgerufen wird:

Object { name: "quote", parameters: (1) […] }
  name: "quote"
  parameters: Array [ {…} ]
    0: Object { name: "Text", type: "string" }
    length: 1

Wenn die Schaltfläche Show Quote ausgewählt ist, wird die Quote-Komponente mit dem in Text gespeicherten Anführungszeichen gerendert:

Im Browser gerendertes Anführungszeichen

Quote ©1988-1999 Satellite of Love LLC: Mystery Science Theater 3000 (Trace Beaulieu (Crow))

Hinweis

rootComponents.add gibt eine Instanz der Komponente zurück. Rufen Sie dispose für die Instanz auf, um sie freizugeben:

const rootComponent = await window.Blazor.rootComponents.add(...);

...

rootComponent.dispose();

Das vorherige Beispiel rendert die Stammkomponente dynamisch, wenn die JS-Funktion showQuote() aufgerufen wird. Um eine Stammkomponente beim Start von Blazor in ein Containerelement zu rendern, verwenden Sie einen JavaScript-Initialisierer, wie im folgenden Beispiel veranschaulicht.

Das folgende Beispiel baut auf dem vorherigen Beispiel auf und verwendet die Quote-Komponente, die Stammkomponentenregistrierung in der Program-Datei und die Initialisierung von jsComponentInitializers.js. Die Funktion showQuote() und die Datei script.js werden nicht verwendet.

Platzieren Sie in HTML das Zielcontainerelement, quoteContainer2, für dieses Beispiel:

<div id="quoteContainer2"></div>

Fügen Sie mithilfe eines JavaScript-Initialisierers die Stammkomponente zum Zielcontainerelement hinzu.

wwwroot/{PACKAGE ID/ASSEMBLY NAME}.lib.module.js:

export function afterStarted(blazor) {
  let targetElement = document.getElementById('quoteContainer2');
  blazor.rootComponents.add(targetElement, 'quote',
    {
      text: "Crow: I have my doubts that this movie is actually 'starring' " +
          "anybody. More like, 'camera is generally pointed at.'"
    });
}

Hinweis

Verwenden Sie für den Aufruf von rootComponents.add den Parameter blazor (klein geschrieben b), der vom Blazor-Startereignis bereitgestellt wird. Die Registrierung ist zwar auch bei Verwendung des Objekts Blazor (mit großem B) gültig, aber die bevorzugte Vorgehensweise besteht darin, den Parameter zu verwenden.

Ein erweitertes Beispiel mit zusätzlichen Features finden Sie in der BasicTestApp ASP.NET Core-Referenzquelle (dotnet/aspnetcore GitHub-Repository):

Hinweis

Dokumentationslinks zur .NET-Referenzquelle laden in der Regel den Standardbranch des Repositorys, der die aktuelle Entwicklung für das nächste Release von .NET darstellt. Um ein Tag für ein bestimmtes Release auszuwählen, wählen Sie diesen mit der Dropdownliste Switch branches or tags (Branches oder Tags wechseln) aus. Weitere Informationen finden Sie unter How to select a version tag of ASP.NET Core source code (dotnet/AspNetCore.Docs #26205) (Auswählen eines Versionstags von ASP.NET Core-Quellcode (dotnet/AspNetCore.Docs #26205)).

Benutzerdefinierte Blazor-Elemente

Verwenden Sie benutzerdefinierte Blazor-Elemente, um Razor-Komponenten aus anderen SPA-Frameworks, z. B. Angular oder React, dynamisch zu rendern.

Benutzerdefinierte Blazor-Elemente:

  • Verwenden Sie Standard-HTML-Schnittstellen, um benutzerdefinierte HTML-Elemente zu implementieren.
  • Vermeiden Sie die Notwendigkeit, den Zustand und den Lebenszyklus von Razor-Stammkomponenten mithilfe von JavaScript-APIs manuell zu verwalten.
  • Sind nützlich für die schrittweise Einführung von Razor-Komponenten in vorhandene Projekte, die in anderen SPA-Frameworks geschrieben wurden.

Benutzerdefinierte Elemente unterstützen keine untergeordneten Inhalte oder Vorlagenkomponenten.

Elementname

Gemäß der HTML-Spezifikation müssen benutzerdefinierte Element-Tagnamen kebab-Case übernehmen:

Ungültig: mycounter
Ungültig: MY-COUNTER
Ungültig: MyCounter
Gültig: my-counter
Gültig: my-cool-counter

Paket

Fügen Sie einen Paketverweis für Microsoft.AspNetCore.Components.CustomElements in der Projektdatei der App hinzu.

Hinweis

Eine Anleitung zum Hinzufügen von Paketen zu .NET-Anwendungen finden Sie in den Artikeln unter Pakete installieren und verwalten unter Workflow für die Paketnutzung (NuGet-Dokumentation). Überprüfen Sie unter NuGet.org, ob die richtige Paketversion verwendet wird.

Beispielkomponente

Die folgenden Beispiele basieren auf der Counter-Komponente aus der Blazor-Projektvorlage.

Counter.razor:

@page "/counter"

<PageTitle>Counter</PageTitle>

<h1>Counter</h1>

<p role="status">Current count: @currentCount</p>

<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>

@code {
    private int currentCount = 0;

    private void IncrementCount() => currentCount++;
}

Blazor Server-Registrierung

Führen Sie die folgenden Schritte aus, um eine Stammkomponente als benutzerdefiniertes Element in einer Blazor Server-App zu registrieren.

Fügen Sie den Microsoft.AspNetCore.Components.Web-Namespace am Anfang der Datei Program hinzu:

using Microsoft.AspNetCore.Components.Web;

Fügen Sie einen Namespace für die Komponenten der App hinzu. Im folgenden Beispiel ist BlazorSample der Namespace der App, und die Komponenten befinden sich im Ordner Pages:

using BlazorSample.Pages;

Ändern Sie den Aufruf in AddServerSideBlazor. Geben Sie das benutzerdefinierte Element mit RegisterCustomElement für die RootComponents-Leitungsoption an. Im folgenden Beispiel wird die Counter-Komponente beim benutzerdefinierten HTML-my-counter-Element registriert:

builder.Services.AddServerSideBlazor(options =>
{
    options.RootComponents.RegisterCustomElement<Counter>("my-counter");
});

Blazor WebAssembly-Registrierung

Führen Sie die folgenden Schritte aus, um eine Stammkomponente als benutzerdefiniertes Element in einer Blazor WebAssembly-App zu registrieren.

Fügen Sie den Microsoft.AspNetCore.Components.Web-Namespace am Anfang der Datei Program hinzu:

using Microsoft.AspNetCore.Components.Web;

Fügen Sie einen Namespace für die Komponenten der App hinzu. Im folgenden Beispiel ist BlazorSample der Namespace der App, und die Komponenten befinden sich im Ordner Pages:

using BlazorSample.Pages;

Rufen Sie RegisterCustomElement für RootComponents auf. Im folgenden Beispiel wird die Counter-Komponente beim benutzerdefinierten HTML-my-counter-Element registriert:

builder.RootComponents.RegisterCustomElement<Counter>("my-counter");

Verwenden des registrierten benutzerdefinierten Elements

Verwenden Sie das benutzerdefinierte Element mit einem beliebigen Webframework. Das vorstehende benutzerdefinierte HTML-my-counter-Element, das die Counter-Komponente der App rendert, wird zum Beispiel in einer React-App mit dem folgenden Markup verwendet:

<my-counter></my-counter>

Ein vollständiges Beispiel zum Erstellen benutzerdefinierter Elemente mit Blazor finden Sie in der CustomElementsComponent-Komponente in der Referenzquelle.

Hinweis

Dokumentationslinks zur .NET-Referenzquelle laden in der Regel den Standardbranch des Repositorys, der die aktuelle Entwicklung für das nächste Release von .NET darstellt. Um ein Tag für ein bestimmtes Release auszuwählen, wählen Sie diesen mit der Dropdownliste Switch branches or tags (Branches oder Tags wechseln) aus. Weitere Informationen finden Sie unter How to select a version tag of ASP.NET Core source code (dotnet/AspNetCore.Docs #26205) (Auswählen eines Versionstags von ASP.NET Core-Quellcode (dotnet/AspNetCore.Docs #26205)).

Übergeben von Parametern

Übergeben Sie die Parameter entweder als HTML-Attribute oder als JavaScript-Eigenschaften für das DOM-Element an Ihre Razor-Komponente.

Die folgende Counter-Komponente verwendet einen IncrementAmount-Parameter, um den Inkrementwert der SchaltflächeClick me festzulegen.

Counter.razor:

@page "/counter"

<h1>Counter</h1>

<p role="status">Current count: @currentCount</p>

<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>

@code {
    private int currentCount = 0;

    [Parameter]
    public int IncrementAmount { get; set; } = 1;

    private void IncrementCount()
    {
        currentCount += IncrementAmount;
    }
}

Rendern Sie die Counter-Komponente mit dem benutzerdefinierten Element, und übergeben Sie einen Wert als HTML-Attribut an den IncrementAmount-Parameter. Der Attributname verwendet die kebab-Syntax der Groß-/Kleinschreibung (increment-amount, nicht IncrementAmount):

<my-counter increment-amount="10"></my-counter>

Alternativ können Sie den Wert des Parameters als JavaScript-Eigenschaft für das Elementobjekt festlegen. Der Eigenschaftsname übernimmt die camel-Syntax der Groß-/Kleinschreibung (incrementAmount, nicht IncrementAmount):

const elem = document.querySelector("my-counter");
elem.incrementAmount = 10;

Sie können Parameterwerte jederzeit mithilfe der Attribut- oder Eigenschaftssyntax aktualisieren.

Unterstützte Parametertypen:

  • Mithilfe der JavaScript-Eigenschaftssyntax können Sie Objekte eines beliebigen JSON-serialisierbaren Typs übergeben.
  • Bei der Verwendung von HTML-Attributen sind Sie auf die Übergabe von Objekten von Zeichenfolgen-, booleschen oder numerischen Typen beschränkt.

Die experimentelle Unterstützung ist für das Erstellen benutzerdefinierter Elemente mithilfe des NuGet-Pakets Microsoft.AspNetCore.Components.CustomElements verfügbar. Benutzerdefinierte Elemente verwenden HTML-Standardschnittstellen, um benutzerdefinierte HTML-Elemente zu implementieren.

Warnung

Experimentelle Features werden für die Untersuchung der Funktionsfähigkeit von Features bereitgestellt und dürfen nicht in einer stabilen Version enthalten sein.

Registrieren Sie eine Stammkomponente als benutzerdefiniertes Element:

  • Ändern Sie in einer Blazor Server -App den Aufruf von AddServerSideBlazor in der Program -Datei so, dass der RegisterCustomElement -Aufruf für CircuitOptions.RootComponents gilt:

    builder.Services.AddServerSideBlazor(options =>
    {
        options.RootComponents.RegisterCustomElement<Counter>("my-counter");
    });
    

    Hinweis

    Das vorangehende Codebeispiel erfordert einen Namespace für die Komponenten der App (z. B. using BlazorSample.Components.Pages;) in der Program-Datei.

  • Rufen Sie in einer Blazor WebAssembly-App RegisterCustomElement für WebAssemblyHostBuilder.RootComponents in der Program-Datei auf:

    builder.RootComponents.RegisterCustomElement<Counter>("my-counter");
    

    Hinweis

    Das vorangehende Codebeispiel erfordert einen Namespace für die Komponenten der App (z. B. using BlazorSample.Components.Pages;) in der Program-Datei.

Fügen Sie das folgende <script>-Tag in den HTML-Code der App vor dem Skripttag Blazor ein:

<script src="/_content/Microsoft.AspNetCore.Components.CustomElements/BlazorCustomElements.js"></script>

Verwenden Sie das benutzerdefinierte Element mit einem beliebigen Webframework. Das vorangehende benutzerdefinierte counter-Element wird z. B. in einer React-App mit folgendem Markup verwendet:

<my-counter increment-amount={incrementAmount}></my-counter>

Warnung

Das Feature für benutzerdefinierte Elemente ist derzeit experimentell, wird nicht unterstützt und kann jederzeit geändert oder entfernt werden. Wir freuen uns über Ihr Feedback, wie gut dieser Ansatz Ihre Anforderungen erfüllt.

Generieren von Angular- und React-Komponenten

Frameworkspezifische JavaScript-JS-Komponenten werden aus Razor-Komponenten für Webframeworks, z. B. Angular oder React, generiert. Diese Funktion ist nicht in .NET enthalten, wird aber durch die Unterstützung für das Rendern von Razor-Komponenten aus JS aktiviert. Das Beispiel für die JS-Komponentengenerierung auf GitHub veranschaulicht, wie Sie Angular- und React-Komponenten aus Razor-Komponenten generieren. Weitere Informationen finden Sie in der README.md-Datei der Beispiel-App auf GitHub.

Warnung

Die Angular- und React-Komponentenfeatures sind derzeit experimentell, werden nicht unterstützt und können jederzeit geändert oder entfernt werden. Wir freuen uns über Ihr Feedback, wie gut dieser Ansatz Ihre Anforderungen erfüllt.