Partilhar via


Utilizar componentes Razor em aplicações JavaScript e frameworks SPA

Observação

Esta não é a versão mais recente deste artigo. Para a versão atual, consulte a versão .NET 10 deste artigo.

Advertência

Esta versão do ASP.NET Core não é mais suportada. Para obter mais informações, consulte a Política de suporte do .NET e do .NET Core. Para a versão atual, consulte a versão .NET 10 deste artigo.

Este artigo aborda como renderizar Razor componentes de JavaScript, usar Blazor elementos personalizados e gerar componentes Angular e React.

Observação

Recomendamos usar os scripts blazor.server.js (Blazor Server) e blazor.webassembly.js (Blazor WebAssembly) ao integrar componentes Razor numa aplicação JavaScript existente até que melhor suporte para o script blazor.web.js (Blazor Web App) seja acrescentado no futuro. Para obter mais informações, consulte RegisterCustomElement parou de funcionar em Blazor 8 (dotnet/aspnetcore #53920).

Aplicações de exemplo Angular

As seguintes aplicações de exemplo demonstram como renderizar um Razor componente como elementoBlazor personalizado numa aplicação Angular:

Para migrar qualquer um destes exemplos de .NET 7, consulte os seguintes recursos:

As principais atualizações a fazer são:

Renderizar Razor componentes a partir de JavaScript

Os Razor componentes podem ser dinamicamente renderizados a partir do JavaScript (JS) para aplicações existentes JS.

O exemplo nesta seção renderiza o componente a seguir Razor em uma página 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 No arquivo, adicione o namespace para o local do componente.

Chame RegisterForJavaScript na coleção de componentes raiz do aplicativo para registar um componente Razor como componente raiz para a renderização de JS.

RegisterForJavaScript inclui uma sobrecarga que aceita o nome de uma JS função que executa a lógica de inicialização (javaScriptInitializer). A JS função é chamada uma vez por registro de componente imediatamente após o início do Blazor aplicativo e antes que quaisquer componentes sejam renderizados. Esta função pode ser usada para integração com tecnologias JS, como elementos personalizados HTML ou uma estrutura SPA baseada em JS.

Uma ou mais funções do inicializador podem ser criadas e chamadas por diferentes registros de componentes. O caso de uso típico é reutilizar a mesma função de inicializador para vários componentes, o que é esperado se a função de inicializador estiver configurando a integração com elementos personalizados ou outra estrutura SPA baseada em JS.

Importante

Não confunda o javaScriptInitializer parâmetro de RegisterForJavaScript com os inicializadores JavaScript. O nome do parâmetro e o JS recurso inicializadores são coincidências.

O exemplo a seguir demonstra o registro dinâmico do componente anterior Quote com "quote" como identificador.

  • Em uma Blazor Server aplicação, modifique a chamada para AddServerSideBlazor no arquivo Program.

    builder.Services.AddServerSideBlazor(options =>
    {
        options.RootComponents.RegisterForJavaScript<Quote>(identifier: "quote", 
            javaScriptInitializer: "initializeComponent");
    });
    
  • Em uma Blazor WebAssembly aplicação, chame RegisterForJavaScript em RootComponents no ficheiro do lado do cliente Program.

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

Anexe a função de inicialização com os parâmetros de função name e parameters ao objeto window. Para fins de demonstração, a função a seguir initializeComponent registra o nome e os parâmetros do componente registrado.

wwwroot/jsComponentInitializers.js:

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

Renderizar o componente do JS em um elemento de contêiner usando o identificador registado, passando os parâmetros do componente conforme necessário.

No exemplo a seguir:

  • O componente Quote (identificador quote) é renderizado no elemento quoteContainer quando a função showQuote é chamada.
  • Uma string de citação é passada para o parâmetro do componente Text.

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

Depois que o Blazor script for carregado, carregue os scripts precedentes na JS aplicação.

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

No exemplo anterior, o placeholder {BLAZOR SCRIPT} é o Blazor script.

Em HTML, coloque o elemento container de destino (quoteContainer). Para a demonstração nesta seção, um botão aciona a renderização do Quote componente chamando a showQuoteJS função:

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

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

Na inicialização, antes de qualquer componente ser renderizado, o console de ferramentas de desenvolvedor do navegador registra o identificador (Quote) e os name parâmetros (parameters) do componente quando initializeComponent é chamado:

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

Quando o botão Show Quote é selecionado, o componente Quote é renderizado com a cotação armazenada em Text exibida:

Citação renderizada no navegador

Citação ©1988-1999 Satellite of Love LLC: Mystery Science Theater 3000 (Trace Beaulieu (Corvo))

Observação

rootComponents.add retorna uma instância do componente. Chame dispose na instância para liberá-la:

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

...

rootComponent.dispose();

O exemplo anterior renderiza dinamicamente o componente raiz quando a showQuote()JS função é chamada. Para renderizar um componente raiz em um elemento container quando Blazor é iniciado, use um inicializador JavaScript para renderizar o componente, como demonstra o exemplo a seguir.

O exemplo a seguir baseia-se no exemplo anterior, usando o componente Quote, o registo do componente raiz no arquivo Program e a inicialização do jsComponentInitializers.js. A showQuote() função (e o script.js arquivo) não são usados.

Em HTML, coloque o elemento container de destino, quoteContainer2 para este exemplo:

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

Usando um inicializador JavaScript, adicione o componente raiz ao elemento de contêiner de destino.

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

Observação

Para a chamada para rootComponents.add, use o parâmetro blazor (letra minúscula b) fornecido pelo evento de início Blazor. Embora o registro seja válido ao usar o objeto Blazor (maiúsculas B), a abordagem preferida é usar o parâmetro.

Para obter um exemplo avançado com recursos adicionais, consulte o exemplo na BasicTestApp fonte de referência do ASP.NET Core (dotnet/aspnetcore repositório GitHub):

Observação

Os links de documentação para a fonte de referência do .NET geralmente carregam a ramificação padrão do repositório, que representa o desenvolvimento atual para a próxima versão do .NET. Para selecionar uma tag para uma versão específica, use a lista suspensa Alternar entre ramificações ou tags. Para obter mais informações, consulte Como selecionar uma marca de versão do código-fonte ASP.NET Core (dotnet/AspNetCore.Docs #26205).

Blazor elementos personalizados

Use Blazor elementos personalizados para renderizar Razor dinamicamente componentes de diferentes tecnologias JavaScript, como Angular, React e Vue.

Blazor Elementos personalizados:

  • Utilize interfaces HTML padrão para implementar elementos HTML personalizados.
  • Elimine a necessidade de gerenciar manualmente o estado e o ciclo de vida dos componentes raiz Razor usando APIs JavaScript.
  • São úteis para gradualmente introduzir componentes Razor em projetos existentes escritos em outras tecnologias.

Os elementos personalizados não suportam conteúdo filho ou componentes modelados.

Nome do elemento

De acordo com a especificação HTML, os nomes das tags de elementos personalizados devem adotar o formato kebab case:

Inválido:mycounter
Inválido:MY-COUNTER
Inválido:MyCounter
Validade:my-counter
Validade:my-cool-counter

Embalagem

Adicione uma referência de pacote para Microsoft.AspNetCore.Components.CustomElements o arquivo de projeto do aplicativo.

Observação

Para obter orientação sobre como adicionar pacotes a aplicativos .NET, consulte os artigos na seção Instalar e gerenciar pacotes em Workflow de utilização de pacotes (documentação do NuGet). Confirme as versões corretas do pacote em NuGet.org.

Componente de exemplo

Os seguintes exemplos são baseados no componente do modelo de projeto CounterBlazor.

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 Registo

Siga as etapas a seguir para registrar um componente raiz como um elemento personalizado em um Blazor Server aplicativo.

Adicione o Microsoft.AspNetCore.Components.Web namespace à parte superior do Program arquivo:

using Microsoft.AspNetCore.Components.Web;

Adicione um namespace para os componentes do aplicativo. No exemplo a seguir, o namespace do aplicativo é BlazorSample e os componentes estão localizados na Pages pasta:

using BlazorSample.Pages;

Modifique a chamada para AddServerSideBlazor. Especifique o elemento personalizado na opção RegisterCustomElement do circuito RootComponents. O exemplo a seguir regista o componente Counter com o elemento HTML my-counter personalizado:

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

Blazor WebAssembly Registo

Registar um componente raiz como elemento personalizado numa Blazor WebAssembly aplicação. No exemplo seguinte, o código:

  • Adiciona um namespace para os componentes da aplicação. No exemplo, o namespace da aplicação é BlazorSample, e os componentes estão localizados na Pages pasta.
  • Fornece acesso à API no Microsoft.AspNetCore.Components.Web namespace.
  • Chama RegisterCustomElement em RootComponents para registar o componente Counter com o elemento HTML personalizado my-counter.
using BlazorSample.Pages;
using Microsoft.AspNetCore.Components.Web;
using Microsoft.AspNetCore.Components.WebAssembly.Hosting;

var builder = WebAssemblyHostBuilder.CreateDefault(args);

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

await builder.Build().RunAsync();

Usar o elemento personalizado registrado

Use o elemento personalizado com qualquer estrutura da Web. Por exemplo, o elemento HTML personalizado my-counter que renderiza o componente Counter da aplicação é usado numa aplicação React com a seguinte marcação:

<my-counter></my-counter>

Para obter um exemplo completo de como criar elementos personalizados com Blazor, consulte o componente CustomElementsComponent na fonte de referência.

Observação

Os links de documentação para a fonte de referência do .NET geralmente carregam a ramificação padrão do repositório, que representa o desenvolvimento atual para a próxima versão do .NET. Para selecionar uma tag para uma versão específica, use a lista suspensa Alternar entre ramificações ou tags. Para obter mais informações, consulte Como selecionar uma marca de versão do código-fonte ASP.NET Core (dotnet/AspNetCore.Docs #26205).

Transmitir parâmetros

Passe parâmetros para seu Razor componente como atributos HTML ou como propriedades JavaScript no elemento DOM.

O componente a seguir Counter usa um IncrementAmount parâmetro para definir a quantidade de incremento do Click me botão.

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

Renderizar o componente Counter com o elemento personalizado e atribuir um valor ao parâmetro IncrementAmount como um atributo HTML. O nome do atributo adota a sintaxe kebab-case (increment-amount, não IncrementAmount):

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

Como alternativa, você pode definir o valor do parâmetro como uma propriedade JavaScript no objeto do elemento. O nome da propriedade adota a sintaxe camel case (incrementAmount, não IncrementAmount):

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

Você pode atualizar os valores dos parâmetros a qualquer momento usando a sintaxe de atributo ou propriedade.

Tipos de parâmetros suportados:

  • Usando a sintaxe de propriedades do JavaScript, pode-se passar objetos de qualquer tipo serializável em JSON.
  • Usando atributos HTML, você está limitado a passar objetos de string, booleano ou tipos numéricos.

O suporte experimental está disponível para a criação de elementos personalizados usando o Microsoft.AspNetCore.Components.CustomElements pacote NuGet. Os elementos personalizados usam interfaces HTML padrão para implementar elementos HTML personalizados.

Advertência

Os recursos experimentais são fornecidos com a finalidade de explorar a viabilidade do recurso e não podem ser enviados em uma versão estável.

Registre um componente raiz como um elemento personalizado:

  • Em uma Blazor Server aplicação, modifique a chamada para AddServerSideBlazor no ficheiro Program para chamar RegisterCustomElement em CircuitOptions.RootComponents.

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

    Observação

    O exemplo de código anterior requer um namespace para os componentes do aplicativo (por exemplo, using BlazorSample.Components.Pages;) no Program arquivo.

  • Em uma Blazor WebAssembly aplicação, chame RegisterCustomElement em WebAssemblyHostBuilder.RootComponents no ficheiro Program.

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

    Observação

    O exemplo de código anterior requer um namespace para os componentes do aplicativo (por exemplo, using BlazorSample.Components.Pages;) no Program arquivo.

Inclua a seguinte <script> tag no HTML do aplicativo antes da Blazor tag de script:

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

Use o elemento personalizado com qualquer estrutura da Web. Por exemplo, o elemento personalizado do contador anterior é usado em um aplicativo React com a seguinte marcação:

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

Advertência

O recurso de elementos personalizados é atualmente experimental, não tem suporte e está sujeito a alterações ou ser removido a qualquer momento. Agradecemos o seu feedback sobre o quão bem esta abordagem específica atende às suas necessidades.

Gerar componentes Angular e React

Gere componentes JavaScript (JS) a partir de Razor componentes para tecnologias JavaScript, como Angular ou React. Essa funcionalidade não está incluída no .NET, mas é ativada pelo suporte para renderização de componentes Razor do JS. O JS exemplo de geração de componentes no GitHub demonstra como gerar componentes Angular e React a partir de Razor componentes. Consulte o arquivo do README.md aplicativo de exemplo GitHub para obter informações adicionais.

Advertência

Os recursos dos componentes Angular e React são atualmente experimentais, sem suporte e estão sujeitos a alterações ou serem removidos a qualquer momento. Agradecemos o seu feedback sobre o quão bem esta abordagem específica atende às suas necessidades.

Recursos adicionais

Alojar e publicar ASP.NET Core Blazor