Blazor ——支持 UI 片段的 RenderFragment

前言

似乎很久没有写 Blazor 的东西了,因为我感觉我写的差不多了。现在觉得可能还需要补充一些细节,比如这个 RenderFragmentRenderFragment<TValue> 的使用,

RenderFragment

Represents a segment of UI content, implemented as a delegate that writes the content to a Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder.

表示UI内容的一个片段,作为一个将内容写入到Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder 的委托实现。

    public delegate void RenderFragment(RenderTreeBuilder builder);

RenderFragment<TValue>

Represents a segment of UI content for an object of type TValue, implemented as a function that returns a Microsoft.AspNetCore.Components.RenderFragment.

表示类型为 TValue 的对象的UI内容段,已实现作为一个函数,返回一个 Microsoft.AspNetCore.Components.RenderFragment

    public delegate RenderFragment RenderFragment<TValue>(TValue value);

示例

使用 .razor 创建组件

首先定义一个 Table.razor 组件

<table class="table table-striped">
    <thead>
        <tr>
            @Header
        </tr>
    </thead>
    <tbody>
        @if (DataSource != null)
        {
            foreach (var item in DataSource)
            {
                <tr>
                    @Body(item)
                </tr>
            }
        }
    </tbody>
</table>

@typeparam T

@code {
    [Parameter] public IEnumerable<T> DataSource { get; set; }
    [Parameter] public RenderFragment Header { get; set; }
    [Parameter] public RenderFragment<T> Body { get; set; }
}

使用这个组件:

@if (forecasts == null)
{
    <p><em>Loading...</em></p>
}
else
{
    <Table DataSource="forecasts">
        <Header>
            <th>Date</th>
            <th>Temp. (C)</th>
            <th>Temp. (F)</th>
            <th>Summary</th>
        </Header>
        <Body>
            <td>@context.Date.ToShortDateString()</td>
            <td>@context.TemperatureC</td>
            <td>@context.TemperatureF</td>
            <td>@context.Summary</td>
        </Body>
    </Table>
}

@code {
    private WeatherForecast[] forecasts;

    protected override async Task OnAfterRenderAsync(bool firstRender)
    {
        if (firstRender)
        {
            forecasts = await ForecastService.GetForecastAsync(DateTime.Now);
        }
    }
}

在这里插入图片描述
Header 参数是一个自定义的 UI 代码块,这个应该很好理解。

Body 参数也是一个自定义的 UI 代码块,不同的是它具备一个 context 参数,数据类型是一个泛型类型,也就是 DataSource 定义的 T 的类型,也就是 context 的数据类型就是 T 的类型。

使用 RenderTreeBuilder 创建组件

public class Table<T> : ComponentBase
{
    [Parameter] public IEnumerable<T> DataSource { get; set; }
    [Parameter] public RenderFragment Header { get; set; }
    [Parameter] public RenderFragment<T> Body { get; set; }

    protected override void BuildRenderTree(RenderTreeBuilder builder)
    {
        builder.OpenElement(0, "table"); //table
        builder.AddAttribute(1, "class", "table table-striped");

        builder.AddContent(2, table =>
        {
            #region thead
            table.OpenElement(0, "thead");
            table.AddContent(1, tr =>
            {
                tr.OpenElement(0, "tr");
                tr.AddContent(1, Header);
                tr.CloseElement();
            });
            table.CloseElement();
            #endregion

            #region tbody
            if (DataSource != null)
            {
                table.OpenElement(10, "tbody");
                foreach (var item in DataSource)
                {
                    table.AddContent(11, tr =>
                    {
                        tr.OpenElement(0, "tr");
                        tr.AddContent(1, Body(item));
                        tr.CloseElement();
                    });
                }
                table.CloseElement();
            }
            #endregion

        });

        builder.CloseElement(); //table end
    }
}

总结

RenderFragment 是一个 UI 片段,用于定义一个参数可以接受任何 HTML 的内容;

RenderFragment<TValue> 是可以在这一块的 UI 片段中附带一个指定数据类型的 context 变量,因此这段代码就可以在合适的地方使用这个变量进行操作。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

叫我 Teacher 周

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值