Blazor组件传参

6 阅读1分钟

逐一给出 8 种方式的最小示例(均为 Blazor):

  1. 组件参数([Parameter]
<!-- Parent.razor -->
<MyComp Title="Hello" Count="1" />

@* MyComp.razor *@
@code {
    [Parameter] public string? Title { get; set; }
    [Parameter] public int Count { get; set; }
}
  1. 子内容参数(RenderFragment
<!-- Parent.razor -->
<MyCard>
    <p>内容</p>
</MyCard>

@* MyCard.razor *@
<div class="card">@ChildContent</div>

@code {
    [Parameter] public RenderFragment? ChildContent { get; set; }
}
  1. 路由参数(@page + [Parameter]
@page "/user/{Id:int}"

<h3>@Id</h3>

@code {
    [Parameter] public int Id { get; set; }
}
  1. 查询字符串参数([SupplyParameterFromQuery]
@page "/list"

<h3>Sort: @Sort</h3>

@code {
    [SupplyParameterFromQuery] public string? Sort { get; set; }
}
  1. 表单参数([SupplyParameterFromForm],.NET 8+)
razor
@page "/submit"
@using Microsoft.AspNetCore.Components.Forms

<EditForm FormName="profile">
    <InputText name="Name" />
</EditForm>

@code {
    [SupplyParameterFromForm] public string? Name { get; set; }
}
  1. 级联参数([CascadingParameter]
<!-- Parent.razor -->
<CascadingValue Value="Theme">
    <Child />
</CascadingValue>

@code {
    private string Theme = "Dark";
}

@* Child.razor *@
@code {
    [CascadingParameter] public string? Theme { get; set; }
}
  1. 依赖注入(@inject / [Inject]
@inject NavigationManager Nav

<button @onclick="Go">Go</button>

@code {
    private void Go() => Nav.NavigateTo("/");
}
  1. 事件回调(EventCallback
<!-- Parent.razor -->
<MyComp OnSave="HandleSave" />

@code {
    private Task HandleSave() => Task.CompletedTask;
}

@* MyComp.razor *@
<button @onclick="OnSave">Save</button>

@code {
    [Parameter] public EventCallback OnSave { get; set; }
}