Blazor

作者 mindrally97184105b5da无许可证269 个星标收录于 2026年10月8日更新于 2026年10月8日仓库5周前更新

Guidelines for Blazor development including component lifecycle, state management, and performance optimization

AI 生成的概览

Blazor 开发指南,涵盖组件架构、生命周期、状态管理、性能、测试与身份验证。

功能
该技能提供 .NET 中 Blazor 应用开发的参考指南,同时覆盖 Blazor Server 与 Blazor WebAssembly。内容包括组件设计与结构、生命周期方法、单向与双向数据绑定、事件处理、渲染优化与虚拟化、级联参数与状态容器形式的状态管理、HTTP API 集成、错误边界、bUnit 测试以及身份验证模式。它给出说明文字和 Razor、C# 代码示例,而不是脚本或生成的文件。
适用场景
在编写、审查或调试 Blazor 组件与页面,并需要生命周期、绑定、渲染或状态方面的约定时使用。也适用于在 Blazor Server 与 WebAssembly 之间做选择、接入身份验证,或搭建 bUnit 组件测试时。
运行要求
该技能不附带脚本或资源,仅为说明性指令。使用这些指南需要 .NET Blazor 项目以及对 Razor 和 C# 的了解;bUnit 测试示例意味着需要 bUnit 测试库,HTTP 示例意味着需要基于 HttpClient 的 API。

Blazor Development Guidelines

You are an expert in Blazor development with deep knowledge of both Blazor Server and Blazor WebAssembly.

Component Architecture

Component Design

  • Create small, focused components
  • Use component parameters for input
  • Use EventCallback for output/events
  • Implement IDisposable for cleanup
  • Use cascading parameters sparingly

Component Structure

razor
@page "/users/{Id:int}"@inject IUserService UserService
<h1>@User?.Name</h1>
@code {    [Parameter]    public int Id { get; set; }
    private User? User { get; set; }
    protected override async Task OnInitializedAsync()    {        User = await UserService.GetUserAsync(Id);    }}

Component Lifecycle

Lifecycle Methods

  • OnInitialized/OnInitializedAsync: Initial setup
  • OnParametersSet/OnParametersSetAsync: When parameters change
  • OnAfterRender/OnAfterRenderAsync: After DOM updates
  • Dispose: Cleanup resources

Best Practices

  • Use OnInitializedAsync for data loading
  • Check firstRender in OnAfterRenderAsync
  • Dispose subscriptions and timers
  • Avoid long-running synchronous code

Data Binding

One-Way Binding

razor
<p>@message</p><input value="@inputValue" />

Two-Way Binding

razor
<input @bind="inputValue" /><input @bind="inputValue" @bind:event="oninput" />

Event Handling

razor
<button @onclick="HandleClick">Click</button><button @onclick="() => HandleClickWithParam(id)">Click</button><button @onclick="HandleClickAsync">Async Click</button>

Render Optimization

Prevent Unnecessary Renders

  • Use @key for list items
  • Implement ShouldRender() when appropriate
  • Use StateHasChanged() judiciously
  • Avoid inline handlers in loops

Virtualization

razor
<Virtualize Items="@items" Context="item">    <ItemContent>        <div>@item.Name</div>    </ItemContent></Virtualize>

State Management

Component State

  • Use private fields for component state
  • Call StateHasChanged() when state changes externally
  • Use InvokeAsync for thread-safe updates

Cascading Parameters

razor
<CascadingValue Value="@currentTheme">    <ChildComponent /></CascadingValue>
<!-- In child component -->[CascadingParameter]public Theme CurrentTheme { get; set; }

State Containers

  • Create injectable state services
  • Use events for state change notifications
  • Consider Fluxor for complex state management

Blazor Server vs WebAssembly

Blazor Server

  • State lives on server
  • Real-time connection via SignalR
  • Faster initial load
  • Requires stable connection
  • Better for internal apps

Blazor WebAssembly

  • Runs entirely in browser
  • Larger initial download
  • Works offline (PWA capable)
  • No server resources per user
  • Better for public apps

API Integration

HTTP Client

csharp
@inject HttpClient Http
private async Task LoadData(){    users = await Http.GetFromJsonAsync<List<User>>("api/users");}

Error Handling

csharp
try{    users = await Http.GetFromJsonAsync<List<User>>("api/users");}catch (HttpRequestException ex){    errorMessage = "Failed to load users";}

Error Handling

Error Boundaries

razor
<ErrorBoundary>    <ChildContent>        <RiskyComponent />    </ChildContent>    <ErrorContent Context="ex">        <p>An error occurred: @ex.Message</p>    </ErrorContent></ErrorBoundary>

Global Error Handling

  • Implement IErrorBoundary for custom handling
  • Log errors to server
  • Show user-friendly messages

Testing

bUnit Testing

csharp
[Fact]public void ComponentRendersCorrectly(){    using var ctx = new TestContext();    var cut = ctx.RenderComponent<Counter>();
    cut.Find("p").MarkupMatches("<p>Current count: 0</p>");    cut.Find("button").Click();    cut.Find("p").MarkupMatches("<p>Current count: 1</p>");}

Authentication

Setup

  • Use AuthenticationStateProvider
  • Use AuthorizeView for conditional UI
  • Use [Authorize] attribute on pages
  • Implement custom auth state provider for JWT

AuthorizeView

razor
<AuthorizeView>    <Authorized>        <p>Welcome, @context.User.Identity?.Name!</p>    </Authorized>    <NotAuthorized>        <p>Please log in.</p>    </NotAuthorized></AuthorizeView>

Performance Tips

  • Use @key for dynamic lists
  • Implement virtualization for large lists
  • Lazy load components with @if
  • Minimize JavaScript interop calls
  • Use streaming rendering in .NET 8+

来源与署名

来源:mindrally/skills位于blazor提交9718410

许可证: 无许可证

内容归原作者所有。SourceWeft 从公开仓库中收录这些内容。

举报或申请下架