Blazor學習之旅(4)數據共享

06cbec7de6bfdb724cc8d75a1f732466.jpeg

【Blazor】|?總結/Edison Zhou


大家好,我是Edison。前幾天沒有發布本篇就發布了第五篇,屬于操作失誤哈,這次把第四篇補上!

本篇,我們來了解下在Blazor中數據是如何共享的,組件之間又該如何傳遞參數。

關于Blazor組件

在 Blazor 中,從名為“組件”的自包含代碼部分生成 UI。每個組件都可以包含 HTML 和 C# 代碼的混合。組件是通過使用 Razor 語法編寫的,其中的代碼是用?@code 指令標記的。其他指令可用于訪問變量、綁定到值以及實現其他呈現任務。

編譯應用時,HTML 和代碼將編譯為組件類。組件一般被編寫為擴展名為 .razor 的文件。

關于數據共享

Blazor 包含多種在組件之間共享信息的方法。

(1)可使用組件參數或級聯參數將值從父組件發送到子組件。

(2)AppState 模式是另一種可用于存儲值并從應用程序中的任何組件訪問這些值的方法。

使用組件參數共享

在父組件和子組件的此層次結構中,可以使用組件參數在它們之間共享信息。在子組件上定義這些參數,然后在父組件中設置其值。

例如,在Counter組件中,定義了一個IncrementAmount的組件參數:

@page "/counter"<PageTitle>Counter</PageTitle><h1>Counter</h1><p role="status">Current count: @currentCount</p><button class="btn btn-primary" @onclick="IncrementCount">Click me</button>@code {private int currentCount = 0;[Parameter]public int IncrementAmount { get; set; } = 1;private void IncrementCount(){currentCount += IncrementAmount;}
}

在調用端只需要下面這樣既可,由于Counter組件中還設置了默認值為1,因此,如果調用端不傳遞,則默認為1。

<Counter IncrementAmount="10" />

此外,還可以使用自定義類用作組件參數,例如:

@using EDT.BlazorServer.App.Models<p>New Topping: @Topping.Name</p>
<p>Ingredients: @Topping.Ingredients</p>@code {[Parameter]public PizzaTopping Topping { get; set; }
}

PizzaTopping的定義如下:

public class PizzaTopping
{public string Name { get; set; }public string Ingredients { get; set; }
}

調用方的定義如下:

@page "/pizzas-toppings"<h1>Our Latest Pizzas and Topping</h1><PizzaTopping Topping="@(new PizzaTopping() { Name = "Chilli Sauce", Ingredients = "Three kinds of chilli." })" />

使用級聯參數共享

當具有包含子組件的子組件的較深層次結構時,事情便會變得難以應付。組件參數不會從上級組件或沿著層次結構向下自動傳遞到下級組件。為了完美處理此問題,Blazor 包含了級聯參數。在組件中設置級聯參數的值時,其值將自動提供給所有子組件。

在父組件中,使用??標記指定將級聯到所有子組件的信息。此標記作為內置的 Blazor 組件實現。在該標記內呈現的任何組件都將能夠訪問該值。

例如,我們有三個組件,其中,CascComp2組件被嵌套在CascComp1組件中,而CascComp1組件又被嵌套在CascCompSamle組件中。他們的調用關系如下:

d64f735f532d5ffc20b96a891663180c.png

使用CascadingParameter級聯傳遞參數NickName:

(1)CascCompSample.razor

<!--this is CascCompSample.razor-->@page "/cascparamsample"<h3>This is the sample page</h3><CascadingValue Value="NickName"><CascComp1></CascComp1>
</CascadingValue>@code
{private string NickName = "Edison Zhou";
}

(2)CascComp1.razor

<!--this is CascComp1.razor--><h3>Comp1: @NickName</h3><CascComp2></CascComp2>@code {[CascadingParameter]public string NickName { get; set; }
}

(3)CascComp2.razor

<!--this is CascComp2.razor--><h3>Comp2: @NickName</h3>@code {[CascadingParameter]public string NickName { get; set; }
}

要點:

(1)首先在CascCompSample.razor頁面,我們通過把CascComp1嵌套到CascadingValue里面來傳遞參數。

(2)其次在CascComp1和 CascComp2,不再需要顯式傳遞參數,只需要聲明CascadingParameter即可拿到值。

效果:

820ac22f94489d9a05edf8a4f7b90a2a.png

如果需要級聯傳遞多個參數,可以使用CascadingValue的嵌套,這里我們修改一下CascCompSample.razor組件,讓它可以共享兩個參數:

<!--this is CascCompSample.razor-->@page "/cascparamsample"<h3>This is the sample page</h3><CascadingValue Value="currentNickName" Name="NickName"><CascadingValue Value="currentAge" Name="Age"><CascComp1></CascComp1></CascadingValue>
</CascadingValue>@code
{private string currentNickName = "Edison Zhou";private int currentAge = 34;
}

修改CascComp1.razor,增加一個CascadingParameter屬性Age:

<!--this is CascComp1.razor--><h3>Comp1: @NickName - @Age</h3><CascComp2></CascComp2>@code {[CascadingParameter(Name="NickName")]public string NickName { get; set; }[CascadingParameter(Name="Age")]public int Age { get; set; }
}

CascComp2.razor修改同上,不再贅述。

這里需要注意的是:級聯值由父級中的 Name 屬性標識,與?[CascadingParameter]?屬性中的 Name 值匹配。對于只有一個該類型的參數而言,在子組件中CascadingParameter特性中無需指定Name。但對于如果有多個相同類型的級聯參數而言,最好加上Name名稱進行指定,以避免找不到。因此,這里也推薦在CascadingValue中指定Name,然后再CascadingParameter特性中指定Name。

最終效果:

86a71954ed3d3c2621d66087242d71f8.png

使用AppState模式共享

在不同組件之間共享信息的另一種方法是使用 AppState 模式。

即創建一個定義要存儲的屬性的類,并將其注冊為作用域服務。在要設置或使用 AppState 值的任何組件中,注入該服務,然后可以訪問其屬性。不同于組件參數和級聯參數,AppState 中的值可用于應用程序中的所有組件,即使這些組件不是存儲該值的組件的子組件也是如此。

例如,創建一個包含銷售狀態的類:

public class PizzaSalesState
{public int PizzasSoldToday { get; set; }
}

然后,將該類注入到DI容器中:

builder.Services.AddScoped<PizzaSalesState>();

最后,在任意組件中通過依賴注入來訪問該屬性:

@page "/"
@using EDT.BlazorServer.App.Models
@inject PizzaSalesState salesState;<PageTitle>Index</PageTitle><h1>Hello, world!</h1>Welcome to your new app.<SurveyPrompt Title="Your Pizza Shop" />@*<Counter IncrementAmount="10" />*@
<p>Today, we've sold this many pizzas: @salesState.PizzasSoldToday</p>
<button @onclick="IncrementSales">Buy a Pizza</button>@code {private void IncrementSales(){salesState.PizzasSoldToday++;}
}

在本例中,由于我們已將計數器的值存儲在 AppState 范圍內服務中,因此計數會在頁面加載期間一直存在,并且對其他用戶可見。

最終效果:

fcd4164efa2a75d08ff83fb248df7d1c.gif

小結

本篇,我們了解了數據如何在Blazor中共享。

下一篇,我們學習一下在Blazor中數據綁定的各種花樣。

參考資料

Microsoft Docs,《在Blazor應用程序中共享數據》

65號腕,《Blazor中的參數和級聯參數》

9da0c6edf2047a997ea0ad846a2fb286.gif

年終總結:Edison的2021年終總結

數字化轉型:我在傳統企業做數字化轉型

C#刷題:C#刷劍指Offer算法題系列文章目錄

.NET面試:.NET開發面試知識體系

.NET大會:2020年中國.NET開發者大會PDF資料

d2ad04132510e200e4f43ce166c27383.png

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/281872.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/281872.shtml
英文地址,請注明出處:http://en.pswp.cn/news/281872.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Zynq7000開發系列-5(OpenCV開發環境搭建:Ubuntu、Zynq)

操作系統&#xff1a;Ubuntu14.04.5 LTS 64bit OpenCV&#xff1a;OpenCV 3.1.0、opencv_contrib gcc&#xff1a;gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04.3) arm-xilinx-linux-gnueabi-gcc&#xff1a;gcc version 4.9.2 (Sourcery CodeBench Lite 2015.05-17) 一、U…

# 20172307 2018-2019-1 《程序設計與數據結構》第5周學習總結

20172307 2018-2019-1 《程序設計與數據結構》第5周學習總結 教材學習內容總結 查找 1.線性查找&#xff1a;從該列表頭開始依次比較每一個值&#xff0c;直至找到該目標元素。2.二分查找法&#xff1a;二分查找是從排序列表的中間開始查找&#xff0c;如果沒有在那個中間元素則…

java 生成jni_Javah生成JNI頭文件

在eclipse中建一項目&#xff0c;建一class1 packageesmart.colfile.parse;2 3 publicclassTestHello {4 static{5 System.loadLibrary("TestHello");6 }7 8 publicstaticnativevoidhello(String msg);9 10 publicstaticvoidmain(String[] args) {11 12 hello("…

IBM 的大型機 z Systems 引入 Go 語言

據 cbronline 報道&#xff0c;IBM 正把 Go 語言運用到旗下的大型機上。 IBM 將開源的 Go 語言引入到 z Systems 大型機后&#xff0c;可以給用戶多一個的選擇&#xff0c;即在大型機上使用 Linux 或基于 Go 的應用&#xff0c;同時也使大型機更加靈活。Go 語言在高并發的網絡應…

WPF-10 邏輯樹和可視化樹

我們在WPF-03 資源之Resources結尾中介紹邏輯樹和可視化樹的基本概念&#xff0c;我們這節來介紹這兩棵樹邏輯樹&#xff08;Logical Tree&#xff09;邏輯樹是由每個控件的節點組成&#xff0c;本質上就是XAML文件中的UI元素&#xff0c;我們可以通過LogicalTreeHelper類提供的…

洛谷P4364 [九省聯考2018]IIIDX(線段樹)

傳送門 題解看得……很……迷&#xff1f; 因為取完一個數后&#xff0c;它的子樹中只能取權值小于等于它的數。我們先把權值從大到小排序&#xff0c;然后記$a_i$為他左邊&#xff08;包括自己&#xff09;所有取完他還能取的數的個數。那么當取完一個點$x$的數之后&#xff0…

國產車崛起粉碎德日工業神話

由于二戰戰敗&#xff0c;德國一大批頂尖人才被美蘇瓜分&#xff0c;戰敗國地位和人才斷層導致德國工業基本是第二次工業革命的產物&#xff0c;專精于機械、化工等傳統行業&#xff0c;并有巴斯夫、拜爾、大眾、戴姆勒、寶馬等一批世界級企業。不過&#xff0c;德國世界級的IT…

java hibernate 分頁查詢_4 Hibernate HQL查詢,分頁查詢

/*** HQL查詢的一個例子*/public static void hql(){Session s null;try{s HibernateUtil.getSeesion();//final String hql "from User as u where u.name?";final String hql "from User as u where u.name:name";final Query query s.createQuery…

Linux -sed

sed &#xff0c;查找sed -n /root/p passwd #列出passwd中有root的行 sed -nr /ot/p passwd #sed -r grep -E 都是進行脫意 sed -nr /0{2}/p passwd #匹配兩次o的 sed -nr /root|bus/p passwd #匹配root 或者bus的 sed -n 2p passwd # 查找指定的行sed -n 2,5p passwd # 查找…

h5 端圖片上傳-模擬多張上傳

1、由于后端的限制&#xff0c;上傳圖片到服務器只能的一張一張傳2、顯示圖片預覽是本地的圖片3、根據服務器返回的結果拿到相應的路徑保存到提交評論的接口中4、刪除的時候&#xff0c;需要刪除對應的路徑&#xff0c;不要把刪除的提交到評論的接口中 A、comment-detail.js va…

node安裝問題

1.最好安裝到默認路徑&#xff0c;手賤安到了D盤&#xff0c;升級npm各種出錯。 明明升級成功&#xff0c;查看版本時&#xff0c;確顯示依然是老的版本。 原因&#xff1a;升級的是C盤的node_modules中的npm&#xff0c;執行時確是D盤node自帶的npm&#xff0c;不知道為啥。。…

全新升級的AOP框架Dora.Interception[匯總,共6篇]

多年之前利用IL Emit寫了一個名為Dora.Interception的AOP框架。前幾天利用Roslyn的Source Generator對自己為公司寫的一個GraphQL框架進行改造&#xff0c;性能得到顯著的提高&#xff0c;覺得類似的機制同樣可以用在AOP框架上&#xff0c;實驗證明這樣的實現方式不僅僅極大地改…

java string轉decimal_java中string轉bigdecimal的例子

小編知道在java中數據類型非常 的嚴格了&#xff0c;我們如果一個地方不小心就會導致應用出問題了&#xff0c;今天 小編就在string 轉BigDecimal上碰到了一些問題&#xff0c;下面整理了幾個例子大家一起來看看。例子1,string 轉BigDecimalpublic class Test{public static vo…

通過url來設置log4j的記錄級別

2019獨角獸企業重金招聘Python工程師標準>>> 直接看代碼。 import org.apache.log4j.AppenderSkeleton; import org.apache.log4j.Level; import org.apache.log4j.LogManager; import org.apache.log4j.Logger; import org.springframework.beans.factory.annotati…

通過用戶模型,對數據庫進行增刪改查操作

增加&#xff1a;user db.session.add(user)db.session.commit() #增加 user User(username JACKSON,password0328 ) db.session.add(user) db.session.commit() 查詢&#xff1a;User.query.filter(User.username mis1114).first() #查詢 userUser.query.filter(User.usern…

Android OpenGL ES(七)----理解紋理與紋理過濾

1.理解紋理 OpenGL中的紋理能夠用來表示圖像。照片&#xff0c;甚至由一個數學算法生成的分形數據。每一個二維的紋理都由很多小的紋理元素組成。它們是小塊的數據&#xff0c;類似于我們前面討論過的片段和像素。要使用紋理&#xff0c;最經常使用的方式是直接從一個圖像文件載…

WPF 基礎控件之托盤

WPF 基礎控件之托盤控件名&#xff1a;NotifyIcon作者&#xff1a; WPFDevelopersOrg - 吳鋒|驚鏵原文鏈接&#xff1a; https://github.com/WPFDevelopersOrg/WPFDevelopers框架使用大于等于.NET40。Visual Studio 2022。項目使用 MIT 開源許可協議。新建NotifyIcon自定義…

java 匿名 異常_JAVA類(內部類、匿名內部類、異常、自定義異常)

內部類package AA;public class類 {int de123;StringBuffer deenewStringBuffer();public class成員內部類{public voidff() {System.out.println("這是成員內部類方法");}}/*1.可以訪問外部類所有的成員&#xff0c;包括被聲明為私有(private)的&#xff1b;2.可以使…

ASP.NET 多環境下配置文件web.config的靈活配置---轉

注意&#xff1a;本功能在.Net Core中已經不可用&#xff0c;暫時需手動修改web.config中的信息&#xff0c;或者將其設置在appsettings.XXX.json中&#xff0c;然后再使用web.config中的環境變量來制定使用的具體appsettings文件。 轉自&#xff1a;https://www.cnblogs.com/h…

英語之各類人群

工作狂&#xff1a;workaholic 月光族&#xff1a;moonlight group 電燈泡&#xff1a;third wheel 菜鳥&#xff1a;newbie 夜貓子&#xff1a;night owl 路癡&#xff1a;somebody has no sense of derection 宅男宅女&#xff1a;homebody 時尚的潮人&#xff1a;trend sett…