Dela via


Använda Razor komponenter i JavaScript-appar och SPA-ramverk

Anmärkning

Det här är inte den senaste versionen av den här artikeln. För den nuvarande utgåvan, se .NET 9-versionen av den här artikeln .

Varning

Den här versionen av ASP.NET Core stöds inte längre. Mer information finns i supportpolicyn för .NET och .NET Core. För den nuvarande utgåvan, se .NET 9-versionen av den här artikeln .

Viktigt!

Den här informationen gäller en förhandsversionsprodukt som kan ändras avsevärt innan den släpps kommersiellt. Microsoft lämnar inga garantier, uttryckliga eller underförstådda, med avseende på den information som tillhandahålls här.

För den nuvarande utgåvan, se .NET 9-versionen av den här artikeln .

Den här artikeln beskriver hur du renderar Razor komponenter från JavaScript, använder Blazor anpassade element och genererar Angular- och React-komponenter.

Anmärkning

Vi rekommenderar att du använder skripten blazor.server.js (Blazor Server) och blazor.webassembly.js (Blazor WebAssembly) när du integrerar Razor komponenter i en befintlig JavaScript-app tills bättre stöd för skriptet blazor.web.js (Blazor Web App) läggs till i framtiden. För mer information, se RegisterCustomElement slutade fungera i Blazor 8 (dotnet/aspnetcore #53920).

Angular-exempelappar

Rendera Razor komponenter från JavaScript

Razor komponenter kan återges dynamiskt från JavaScript (JS) för befintliga JS appar.

Exemplet i det här avsnittet återger följande Razor komponent till en sida via JS.

Quote.razor:

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

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

Program Lägg till namnområdet för komponentens plats i filen.

Anropa RegisterForJavaScript appens rotkomponentsamling för att registrera en Razor komponent som en rotkomponent för JS återgivning.

RegisterForJavaScript innehåller en överlagring som accepterar namnet på en JS funktion som kör initieringslogik (javaScriptInitializer). Funktionen JS anropas en gång för varje komponentregistrering, omedelbart efter att Blazor appen har startat och innan några komponenter återges. Den här funktionen kan användas för integrering med JS tekniker, till exempel anpassade HTML-element eller ett JS-baserat SPA-ramverk.

En eller flera initieringsfunktioner kan skapas och anropas av olika komponentregistreringar. Det vanliga användningsfallet är att återanvända samma initieringsfunktion för flera komponenter, vilket förväntas om initieringsfunktionen konfigurerar integrering med anpassade element eller något annat JS-baserat SPA-ramverk.

Viktigt!

Blanda inte ihop javaScriptInitializer-parametern i RegisterForJavaScript med JavaScript-initierare. Namnet på parametern och JS initieringsfunktionen är en slump.

I följande exempel visas dynamisk registrering av föregående Quote komponent med "quote" som identifierare.

  • Ändra anropet till Blazor Server i en AddServerSideBlazor-appens Program-fil.

    builder.Services.AddServerSideBlazor(options =>
    {
        options.RootComponents.RegisterForJavaScript<Quote>(identifier: "quote", 
            javaScriptInitializer: "initializeComponent");
    });
    
  • I en Blazor WebAssembly app anropar du RegisterForJavaScript på klientsidans RootComponents-fil Program.

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

Koppla initieringsfunktionen med name och parameters funktionsparametrar till window objektet. I demonstrationssyfte loggar följande initializeComponent funktion namnet och parametrarna för den registrerade komponenten.

wwwroot/jsComponentInitializers.js:

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

Rendera komponenten från JS till ett containerelement med hjälp av den registrerade identifieraren och skicka komponentparametrar efter behov.

I följande exempel:

  • Komponenten Quote (quote identifieraren) återges i elementet quoteContainershowQuote när funktionen anropas.
  • En citatsträng skickas till komponentens Text parameter.

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);

När skriptetBlazor har lästs in, läs in föregående skript i JSappen:

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

I föregående exempel {BLAZOR SCRIPT} är platshållaren skriptet Blazor .

I HTML, placera målcontainer-elementet (quoteContainer). För demonstrationen i det här avsnittet utlöser en knapp återgivning av komponenten Quote genom att anropa showQuoteJS funktionen:

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

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

Vid initiering, innan några komponenter återges, loggar webbläsarens konsol för utvecklingsverktyg komponentens identifierare (Quote) och parametrar (name) när parameters anropas:

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

När Show Quote-knappen har valts, visas komponenten Quote med citatet som är lagrat i Text.

Citattecken som återges i webbläsaren

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

Anmärkning

rootComponents.add returnerar en instans av komponenten. Anropa instansen dispose för att frigöra den:

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

...

rootComponent.dispose();

Föregående exempel återger dynamiskt rotkomponenten när showQuote()JS funktionen anropas. Om du vill återge en rotkomponent i ett containerelement när Blazor den startas använder du en JavaScript-initierare för att återge komponenten, vilket visas i följande exempel.

Följande exempel bygger på föregående exempel, med hjälp av komponenten Quote , rotkomponentregistreringen Program i filen och initieringen av jsComponentInitializers.js. Funktionen showQuote() (och script.js filen) används inte.

I HTML placerar du målcontainerelementet i quoteContainer2 det här exemplet:

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

Med hjälp av en JavaScript-initierare lägger du till rotkomponenten i målcontainerelementet.

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.'"
    });
}

Anmärkning

För anropet till rootComponents.addanvänder du parametern blazor (i gemener b) som tillhandahålls av starthändelsen Blazor. Även om registreringen är giltig när du använder Blazor-objektet (versaler B), är den bästa metoden att använda parametern.

Ett avancerat exempel med ytterligare funktioner finns i exemplet i BasicTestApp referenskällan ASP.NET Core (dotnet/aspnetcore GitHub-lagringsplats):

Anmärkning

Dokumentationslänkar till .NET-referenskällan läser vanligtvis in lagringsplatsens standardgren, vilket representerar den aktuella utvecklingen för nästa version av .NET. Om du vill välja en tagg för en specifik version använder du listrutan Välj bland grenar eller taggar. Mer information finns i Så här väljer du en versionstagg för ASP.NET Core-källkod (dotnet/AspNetCore.Docs #26205).

Blazor specialanpassade element

Använd Blazor anpassade element för att dynamiskt återge Razor komponenter från olika JavaScript-tekniker, till exempel Angular, React och Vue.

Blazor anpassade element:

  • Använd HTML-standardgränssnitt för att implementera anpassade HTML-element.
  • Eliminera behovet av att manuellt hantera tillståndet och livscykeln för rotkomponenter Razor med hjälp av JavaScript-API:er.
  • Är användbara för att gradvis introducera Razor komponenter i befintliga projekt som skrivits i andra tekniker.

Anpassade element stöder inte underordnat innehåll eller mallkomponenter.

Elementnamn

Enligt HTML-specifikationen måste namn på anpassade elementtagg anta ett kebabfall:

Ogiltig:mycounter
Ogiltig:MY-COUNTER
Ogiltig:MyCounter
Giltig:my-counter
Giltig:my-cool-counter

Paket

Lägg till en paketreferens för Microsoft.AspNetCore.Components.CustomElements i appens projektfil.

Anmärkning

Vägledning om hur du lägger till paket i .NET-appar finns i artiklarna under Installera och hantera paket i arbetsflödet för paketförbrukning (NuGet-dokumentation). Bekräfta rätt paketversioner på NuGet.org.

Exempelkomponent

Följande exempel baseras på komponenten Counter från projektmallen Blazor .

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 registrering

Utför följande steg för att registrera en rotkomponent som ett anpassat element i en Blazor Server app.

Lägg till namnområdet Microsoft.AspNetCore.Components.Web överst i filen Program:

using Microsoft.AspNetCore.Components.Web;

Lägg till ett namnområde för appens komponenter. I följande exempel är BlazorSample appens namnområde och komponenterna finns i Pages mappen:

using BlazorSample.Pages;

Ändra anropet till AddServerSideBlazor. Ange det anpassade elementet med RegisterCustomElement på kretsalternativet RootComponents . I följande exempel registreras komponenten Counter med det anpassade HTML-elementet my-counter:

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

Blazor WebAssembly registrering

Utför följande steg för att registrera en rotkomponent som ett anpassat element i en Blazor WebAssembly app.

Lägg till namnområdet Microsoft.AspNetCore.Components.Web överst i filen Program:

using Microsoft.AspNetCore.Components.Web;

Lägg till ett namnområde för appens komponenter. I följande exempel är BlazorSample appens namnområde och komponenterna finns i Pages mappen:

using BlazorSample.Pages;

Anropa RegisterCustomElementRootComponents. I följande exempel registreras komponenten Counter med det anpassade HTML-elementet my-counter:

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

Använda det registrerade anpassade elementet

Använd det anpassade elementet med valfritt webbramverk. Till exempel används det föregående my-counter anpassade HTML-elementet som renderar appens Counter komponent i en React-app med följande markering:

<my-counter></my-counter>

Ett fullständigt exempel på hur du skapar anpassade element med Blazorfinns i komponentenCustomElementsComponent i referenskällan.

Anmärkning

Dokumentationslänkar till .NET-referenskällan läser vanligtvis in lagringsplatsens standardgren, vilket representerar den aktuella utvecklingen för nästa version av .NET. Om du vill välja en tagg för en specifik version använder du listrutan Välj bland grenar eller taggar. Mer information finns i Så här väljer du en versionstagg för ASP.NET Core-källkod (dotnet/AspNetCore.Docs #26205).

Skicka parametrar

Skicka parametrar till komponenten Razor antingen som HTML-attribut eller som JavaScript-egenskaper för DOM-elementet.

Följande Counter komponent använder en IncrementAmount parameter för att ange knappens Click me inkrementella mängd.

Counter.razor:

<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;
    }
}

Rendera komponenten Counter med det anpassade elementet och skicka ett värde till parametern IncrementAmount som ett HTML-attribut. Attributets namn antar syntax för kebabfall (increment-amount, inte IncrementAmount):

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

Du kan också ange parameterns värde som en JavaScript-egenskap för elementobjektet. Egenskapsnamnet använder camel case-syntax (incrementAmount, inte IncrementAmount):

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

Du kan uppdatera parametervärden när som helst med antingen attribut- eller egenskapssyntax.

Parametertyper som stöds:

  • Med javascript-egenskapssyntax kan du skicka objekt av valfri JSON-serialiserbar typ.
  • Med HJÄLP av HTML-attribut är du begränsad till att skicka objekt av sträng-, boolesk- eller numeriska typer.

Experimentellt stöd är tillgängligt för att skapa anpassade element med hjälp av Microsoft.AspNetCore.Components.CustomElements NuGet-paketet. Anpassade element använder HTML-standardgränssnitt för att implementera anpassade HTML-element.

Varning

Experimentella funktioner tillhandahålls för att utforska funktionskraft och kanske inte levereras i en stabil version.

Registrera en rotkomponent som ett anpassat element:

  • I en Blazor Server app ändrar du anropet till AddServerSideBlazor i Program filen för att anropa RegisterCustomElementCircuitOptions.RootComponents:

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

    Anmärkning

    Föregående kodexempel kräver ett namnområde för appens komponenter (till exempel using BlazorSample.Components.Pages;) i Program filen.

  • I en Blazor WebAssembly app, anropa RegisterCustomElementWebAssemblyHostBuilder.RootComponents i Program filen:

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

    Anmärkning

    Föregående kodexempel kräver ett namnområde för appens komponenter (till exempel using BlazorSample.Components.Pages;) i Program filen.

Inkludera följande <script> tagg i appens HTML-kod föreBlazor skripttaggen:

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

Använd det anpassade elementet med valfritt webbramverk. Till exempel används det tidigare anpassade räknarelementet i en React-app med följande markering:

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

Varning

Funktionen för anpassade element är för närvarande experimentell, stöds inte och kan ändras eller tas bort när som helst. Vi välkomnar din feedback om hur väl den här metoden uppfyller dina krav.

Generera Angular- och React-komponenter

Generera JavaScript-komponenter (JS) från Razor komponenter för JavaScript-tekniker, till exempel Angular eller React. Den här funktionen ingår inte i .NET, men aktiveras av stöd för rendering Razor av komponenter från JS. KomponentgenereringsexempletJS på GitHub visar hur du genererar Angular- och React-komponenter från Razor komponenter. Mer information finns i GitHub-exempelappens README.md fil.

Varning

Komponentfunktionerna Angular och React är för närvarande experimentella, stöds inte och kan ändras eller tas bort när som helst. Vi välkomnar din feedback om hur väl den här metoden uppfyller dina krav.