初識 Blazor WebAssembly(樣板元件)

定義:結構在樣板定義好,內容由使用樣板時帶入

  • 需要使用 RenderFragment 型別當作參數
  • public RenderFragment Template { get; set; }
  • public RenderFragment 樣板名稱 { get; set; }在樣板中充當定義參數
  • 泛型樣板化元件,需使用 @typeparam 指示詞

例:新建一個樣板文件Child.razor內容如下

<div>
    @ChildTemplate
</div>
//這裡是指使用樣板時,畫面內容會放置在div下

@code {
    [Parameter]
    public RenderFragment? ChildTemplate{ get; set; }
    //ChildTemplate為樣板名稱 *@
}

再使用 一個上層文件Father.razor用於傳輸樣板內容,讓child.razor接受上層內容

<div>
    <Child>
        <ChildTemplate>
            <p>123</p>
        </ChildTemplate>
    </Child>
</div>

如下結果, 

 

 

泛型樣板化組件

组件可以根据不同的类型参数来生成不同的实例

要创建一个泛型樣板化元件,您需要在组件类上使用泛型类型参数,并在组件中使用该参数 

 例:建立一個樣板用於接收上層的數組,再根據這些數組轉化成自己需要的樣板

子組件Child.razor

@typeparam TItem
//1.宣告元件的型別是泛型參數 *@
<div class="container">
    @foreach (var item in ChildItems)
    {   
        <p>@item</p>
    }
</div>

@code {
    [Parameter]
    public IReadOnlyList<TItem> ChildItems { get; set; } = null!;
    //2.在元件的傳入參數使用 TItem 型別
}

在C#中,<T><TItem>都是泛型类型参数的表示方式,它们是可以互换使用的。一般来说,<T>是用于通用类型参数的表示方法,而<TItem>则通常用于表示集合(如列表)中的项目类型参数。 

此外,值得注意的是,当在Blazor组件中定义类型参数时,建议使用<TItem>而不是<T>来表示项目类型参数。这是因为在Blazor的某些方面,<T>已被用作其他的目的,例如<TValue>用于表示输入控件的值类型参数,以避免混淆和歧义。 

建立上層文件Father.razor傳遞數組


<div class="box">
    <Child ChildItems="ParentItems">
    </Child >
</div>
@code {
    private List<string> ParentItems = new List<string> { "A", "B", "C" };
}

建立下層文件Child.razor接收數組循環 

  • @typeparam TItem ->用於宣告元件的型別是泛型參數
  • IReadOnlyList<TItem> ->唯讀清單中的項目類型。
    這是共變數的型別參數。 也就是說,可以使用自己指定的類型,或衍生程度較高的任何類型。
@typeparam TItem
//1.宣告元件的型別是泛型參數 *@
<div class="container">
    @foreach (var item in ChildItems)
    {   
        <p>@item</p>
    }
</div>

@code {
    [Parameter]
    public IReadOnlyList<TItem> ChildItems { get; set; } =null!;
    //2.在元件的傳入參數使用 TItem 型別
}

將泛型元件的資料內容交給外部使用 (也就是樣板內的資料內容由父來決定)

 例:

新建上層文件 Father.razor

<div class="box">
    <Child Items="pets" Context="apple">
        <Banana>
            <p>@apple.PetId, @apple.Name</p>
        </Banana>
    </Child >
</div>
@code {
   
    private List<Pet> pets = new List<Pet>
    {
        new Pet { PetId = 2, Name = "小花" },
        new Pet { PetId = 4, Name = "小貓" },
        new Pet { PetId = 7, Name = "小白" }
    };

  
    private class Pet
    {
        public int PetId { get; set; }
        public string? Name { get; set; }
    }
}

Child.razor

  • IReadOnlyList<TItem> ->唯讀清單中的項目類型。
    這是共變數的型別參數。 也就是說,可以使用自己指定的類型,或衍生程度較高的任何類型。
  • RenderFragment<TItem> ->泛型的樣板參數

 

@typeparam Item

<div class="container">
    @foreach (var item in Items)
    {
        @Banana(item)
        //意思是@Banana為泛型區塊,透過RenderFragment樣板參數,將資料內容傳給外部。外部在透過Context="apple"綁定。
    }
</div>

@code {
    [Parameter]
    public RenderFragment<Item> Banana { get; set; } = null!;

    [Parameter]
    public IReadOnlyList<Item> Items { get; set; } = null!;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值