Blazor es un framework de Microsoft que permite construir aplicaciones web interactivas utilizando C# en lugar de JavaScript, aprovechando .NET y WebAssembly para aplicaciones modernas.
Tipos de Blazor
Blazor WebAssembly (WASM)
Ejecuta C# directamente en el navegador mediante WebAssembly.
Blazor Server
Ejecuta el código en el servidor y envía actualizaciones al navegador en tiempo real a través de SignalR.
Crear proyecto
Crear un proyecto Blazor WebAssembly
Para crear un proyecto básico de Blazor WebAssembly.
dotnet new blazorwasm -o MiProyectoBlazorCrear un proyecto Blazor Server
Para crear un proyecto Blazor Server.
dotnet new blazorserver -o MiProyectoBlazorServerComponentes en Blazor
Componentes en Blazor
Los componentes son la unidad fundamental de Blazor. Se escriben en archivos .razor y pueden incluir C#, HTML y Razor.
<h3>Hola, Blazor</h3>
@code {
    string mensaje = "Bienvenido a Blazor";
}Comunicarse entre componentes
Propiedades y parámetros pueden ser utilizados para comunicar datos entre componentes.
<h3>@Titulo</h3>
@code {
    [Parameter]
    public string Titulo { get; set; }
}Para pasar parámetros a un componente:
<ComponentePersonalizado Titulo="Hola Blazor" />Ciclo de vida de los componentes
Métodos del ciclo de vida
Blazor proporciona varios métodos de ciclo de vida para controlar la lógica de los componentes:
- OnInitialized() Se ejecuta una vez cuando el componente es inicializado. 
- OnParametersSet() Se ejecuta cada vez que se cambian los parámetros. 
- OnAfterRender() Se ejecuta después de que el componente ha sido renderizado. 
@code {
    protected override void OnInitialized() {
        Console.WriteLine("Componente inicializado");
    }
}Enlaces de datos (Data Binding)
One-way binding
El enlace de datos de una vía se utiliza para mostrar datos en la UI.
<p>@mensaje</p>
@code {
    string mensaje = "Hola desde Blazor";
}Two-way binding
El enlace de datos bidireccional permite que los cambios en la UI se reflejen en el código y viceversa. Utiliza el atributo @bind.
<input @bind="mensaje" />
<p>@mensaje</p>
@code {
    string mensaje = "Hola Blazor";
}Manejo de eventos
Eventos comunes
Blazor utiliza el prefijo @ para manejar eventos del navegador, como clics de botones y cambios de texto.
<button @onclick="HandleClick">Click me</button>
@code {
    void HandleClick() {
        Console.WriteLine("Button clicked!");
    }
}EventCallback
Blazor permite la comunicación de eventos entre componentes padres e hijos con EventCallback.
Componente hijo:
<button @onclick="OnClick">Click me</button>
@code {
    [Parameter]
    public EventCallback OnClick { get; set; }
}Componente padre:
<ChildComponent OnClick="HandleChildClick" />
@code {
    void HandleChildClick() {
        Console.WriteLine("El botón del componente hijo fue clicado");
    }
}Renderización condicional y bucles
Renderizado condicional
Blazor permite mostrar o esconder elementos basados en condiciones lógicas.
@if (mostrar) {
    <p>Este es un párrafo condicional</p>
}Renderizado con bucles
Utiliza @foreach para iterar sobre colecciones y renderizar múltiples elementos.
@foreach (var item in lista) {
    <p>@item</p>
}
@code {
    List<string> lista = new List<string> { "Item 1", "Item 2", "Item 3" };
}Directivas comunes en Blazor
@page
Define una ruta en un componente Razor, convirtiéndolo en una página.
@page "/home"
<h3>Home Page</h3>@code
Permite escribir bloques de C# dentro de un componente .razor.
@code {
    string mensaje = "Hola Blazor";
}@inject
Inyecta servicios dentro de los componentes para acceso a dependencias.
@inject ServicioDeTiempo Tiempo
<p>Tiempo actual: @Tiempo.GetHoraActual()</p>Routing en Blazor
Configuración de rutas
En un componente .razor, puedes definir rutas con @page.
@page "/about"
<h3>About Page</h3>Navegación programática
Puedes redirigir programáticamente utilizando NavigationManager.
@inject NavigationManager navManager
<button @onclick="NavigateToHome">Ir a Inicio</button>
@code {
    void NavigateToHome() {
        navManager.NavigateTo("/home");
    }
}Inyección de dependencias
Configurar servicios
Blazor soporta inyección de dependencias a través del contenedor de servicios en Program.cs.
builder.Services.AddSingleton<ServicioDeTiempo>();Inyectar servicios en un componente
Para usar un servicio dentro de un componente, se utiliza @inject.
@inject ServicioDeTiempo Tiempo
<p>La hora es: @Tiempo.GetHoraActual()</p>
@code {
    // lógica adicional
}Formularios y validación
Crear un formulario simple
Blazor facilita la creación de formularios con binding bidireccional y eventos de envío.
<EditForm Model="@usuario" OnValidSubmit="HandleSubmit">
    <InputText id="nombre" @bind-Value="usuario.Nombre" />
    <button type="submit">Enviar</button>
</EditForm>
@code {
    Usuario usuario = new Usuario();
    void HandleSubmit() {
        Console.WriteLine("Formulario enviado");
    }
}Validación de formularios
Blazor incluye soporte para validación utilizando atributos de anotación de datos (DataAnnotations).
public class Usuario {
    [Required]
    public string Nombre { get; set; }
}Componentes reutilizables
Componentes parametrizados
Puedes crear componentes reutilizables pasando parámetros.
<h3>@Titulo</h3>
@code {
    [Parameter]
    public string Titulo { get; set; }
}Componentes anidados
Puedes usar componentes dentro de otros componentes:
<ComponenteHijo Titulo="Mi Componente" />Blazor y JavaScript
Invocar JavaScript desde Blazor
Blazor permite la interoperabilidad con JavaScript mediante IJSRuntime.
@inject IJSRuntime js
<button @onclick="MostrarAlerta">Mostrar Alerta</button>
@code {
    async Task MostrarAlerta() {
        await js.InvokeVoidAsync("alert", "Hola desde Blazor!");
    }
}Invocar Blazor desde JavaScript
Puedes llamar a métodos C# desde JavaScript utilizando DotNet.invokeMethodAsync.
DotNet.invokeMethodAsync('NombreAssembly', 'MetodoEnCSharp');Deploy de aplicaciones Blazor
Blazor WebAssembly
Para publicar una aplicación WebAssembly, usa el siguiente comando:
dotnet publish --configuration ReleaseBlazor Server
Para publicar una aplicación Blazor Server:
dotnet publish --configuration Release --output ./publicDebugging y optimización
Debug en Blazor WebAssembly
Puedes depurar aplicaciones Blazor WASM utilizando las herramientas de desarrollo del navegador y Visual Studio.
Optimización de carga
Utiliza la publicación en modo release para optimizar la carga de la aplicación.
dotnet publish -c Release