(12/30)大家一起學Blazor:Cascading values and parameters

(12/30)大家一起學Blazor:Cascading values and parameters

昨天不小心把Reset按鈕的type改成button,今天改回reset。

最後更新 2021/12/15 下午11:38
StrayaWorker
預計閱讀 3 分鐘
分類
Blazor
專題
一起學Blazor系列
標籤
.NET C# ASP.NET Core Blazor

(註:昨天不小心把 Reset 按鈕的 type 改成 button,今天改回 reset。)

我們目前建立了 3 個元件,BlogPostMyButton,如果想讓 3 個元件的字體顏色或是尺寸都一樣,似乎得先在 MyButton 定義一個帶有 [Parameter] attribute 的變數,Post 呼叫時再填入值,Post 同樣定義變數,Blog 呼叫時再填入,每個環節都要這樣做。

前面講過父元件想將資料傳遞到子元件內的就是靠 Parameter,有沒有類似 Parameter 不過可以一次傳遞到底下所有元件的方法呢?

這時候就要用到 CascadingValue 這個元件了,cascading 的意思是「級聯、噴瀉」,可以將其理解為「由上而下注入」,前端用的 CSS 全名就是 Cascading Style Sheet(層級式樣式表)。

我們先在 BlogBase.razor.cs 加入一個 Property ColorStyle(註:筆者之前檔案取名有誤,這篇改為 BlogBase.razor.cs),其值為 "color: goldenrod"

接著在 Blog.razor<CascadingValue Value="ColorStyle"><Post> 包住。

再於 PostBase.razor.cs 定義同名變數,不過多了 [CascadingParameter] attribute。

然後只要在想要套用的地方填寫該變數即可。

MyButton 也是一樣的用法。

雖然每個元件都還是要定義一個變數去承接最上層來的變數,不過可以看到 [CascadingParameter] 省去了在 PostBase.razor 呼叫 <MyButton> 必須填值的步驟。

那如果有兩個值要這樣層層傳遞呢?沒錯,就是包兩層 <CascadingValue> 即可,但真的寫了會發現,怎麼會套用兩個 color style 呢?

[站長註:上下有差異,上面是站長調試結果,下面是原文截圖]

因為 <CascadingValue> 認識的是變數類型,如果類型不同可以方便套用,但如果有兩個 string,則子元素只會套用最靠近的 <CascadingValue>,以圖片為例就是 ColorStyle

為了解決這問題,可以使用裡面的 Name 變數,如此一來元件之間就會認識這個 <CascadingValue> 的名字,如果子元件找不到該 Name 就會回傳空白。

從上面的範例可以知道每次 <CascadingValue> Blazor 都會層層通知下層元件,但如果不希望每次都通知佔用資源呢?可以用 IsFixed,將其設為 true,Blazor 就不會去通知子元件了。

引用:

  1. Blazor cascading values and parameters
  2. Blazor multiple cascading parameters
  3. Blazor cascading values performance

註:本文程式碼透過 .NET 6 + Visual Studio 2022 重構,可點選原文連結與重構後程式碼比較學習,謝謝閱讀,支持原作者

繼續探索

延伸閱讀

更多文章
同分類 / 同標籤 2021/12/25

(29/30)大家一起學Blazor:Blazor單元測試

開發一個系統最無聊的過程大概就是解決 Bug 了,尤其是那種嘗試對 null 物件取值的錯誤(`Object reference not set to an instance of an object.`),這應該是大部分人剛踏入程式設計領域最常碰到的問題,為了從枯燥的解決 Bug 過程解脫,這篇就來介紹`單元測試`。

繼續閱讀
同分類 / 同標籤 2021/12/25

(28/30)大家一起學Blazor:Policy-based authorization

之前有說到`ASP.NET Core Identity` 使用的是基於`Claim` 的驗證,其實`ASP.NET Core Identity` 有不同類型的授權方式,最簡單的`登入授權`、`角色授權`、`Claim 授權`,但上述幾種都是以一種方式實現:原則授權(`Policy-based authorization`)。

繼續閱讀