前言

今日介紹的內建元件是 CascadingValue 用途是從父元件傳遞參數到子元件,而無需使用傳統的參數

基本用法

父元件

1
2
3
4
5
6
7
8
@page "/parent"
<CascadingValue Value="@Content">
    <Child></Child>
</CascadingValue>

@code {
    string Content = "國慶快樂";
}

子元件

1
2
3
4
5
6
<h1>@Content</h1>

@code {
        [CascadingParameter] 
        string Content { get; set; }
}

如果異動了 CascadingValue 參數的內容,會傳遞到所有的後代,並且呼叫 StateHasChanged

多個 CascadingValue 參數

如果想要傳遞多個值怎麼辦?

錯誤的錯法

父元件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
@page "/parent"
<CascadingValue Value="@Date">
    <CascadingValue Value="@Content">
        <Child></Child>
    </CascadingValue>
</CascadingValue>

@code {
    string Date = $"{DateTime.Now.Date:yyyy MM dd}";
    string Content = "國慶快樂";
}

子元件

1
2
3
4
5
6
7
8
9
<h1>@Date @Content</h1>

@code {
    [CascadingParameter]
    string Date { get; set; }

    [CascadingParameter]
    string Content { get; set; }
}

結果不是預期的 2022 10 10 國慶快樂,會這樣的原因是當有多個CascadingValue 時,需要讓 Blaozr 有辦法去辨別不同,有兩個方法可以做到

使用 Name 屬性

父元件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
@page "/parent"
<CascadingValue Value="@Date" Name="Date">
    <CascadingValue Value="@Content" Name="Content">
        <Child></Child>
    </CascadingValue>
</CascadingValue>

@code {
    string Date = $"{DateTime.Now.Date:yyyy MM dd}";
    string Content = "國慶快樂";
}

子元件

1
2
3
4
5
6
7
8
9
<h1>@Date @Content</h1>

@code {
    [CascadingParameter(Name = "Date")]
    string Date { get; set; }

    [CascadingParameter(Name = "Content")]
    string Content { get; set; }
}

這個結果出來的時候我很錯愕,我一直以為今天 10/10,想說怎麼少一天 哈哈哈

使用型別作依據

另一種方式是給予他們不同的型別, Bloazr 會去做搜尋,搜尋到第一個符合型別的就會填入值

父元件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
@page "/parent"
<CascadingValue Value="@Date">
    <CascadingValue Value="@Content">
        <Child></Child>
    </CascadingValue>
</CascadingValue>

@code {
    int Date = 20221010;
    string Content = "國慶快樂";
}

子元件

1
2
3
4
5
6
7
8
9
<h1>@Date @Content</h1>

@code {
    [CascadingParameter]
    int Date { get; set; }

    [CascadingParameter]
    string Content { get; set; }
}

小結

使用 CascadingValue 最好且可靠的方式是透過 Name 來使用,以免出現不可預期的問題,這個功能非常好用但是需要注意不要濫用,否則在大型專案可能會增加維護成本,明天介紹內建元件中的 DynamicComponent