詳解 Blazor 組件傳值

父子組件傳值

Blazor 中,組件之間的通信可以通過 [Parameter] 參數和 EventCallback<T> 事件回調實現。下面分別給出 父組件傳遞值給子組件子組件傳遞值給父組件 的簡單示例。


1.1 父組件傳遞值給子組件

步驟:

  • 在子組件中定義 public 屬性,并使用 [Parameter] 特性標記。
  • 在父組件中通過綁定屬性將值傳遞給子組件。

示例代碼:

子組件 ChildComponent.razor
<h3>子組件收到的值: @Message</h3>@code {[Parameter]public string Message { get; set; }
}
父組件 ParentComponent.razor
<ChildComponent Message="@message" />@code {private string message = "Hello from parent!";
}

1.2 子組件傳遞值給父組件

步驟:

  • 使用 EventCallback<T> 實現子組件向父組件傳值。
  • 子組件觸發事件并攜帶數據,父組件監聽該事件并處理數據。

示例代碼:

子組件 ChildComponent.razor
<button @onclick="SendMessage">發送消息給父組件</button>@code {[Parameter]public EventCallback<string> OnMessageSent { get; set; }private async Task SendMessage(){await OnMessageSent.InvokeAsync("這是來自子組件的消息");}
}
父組件 ParentComponent.razor
<ChildComponent OnMessageSent="HandleMessage" />
<p>收到子組件的消息: @receivedMessage</p>@code {private string receivedMessage;private void HandleMessage(string message){receivedMessage = message;}
}

1.3 總結

通信方向實現方式
父組件 → 子組件使用 [Parameter] 傳遞屬性值
子組件 → 父組件使用 EventCallback<T> 觸發事件

這種方式可以滿足大多數 Blazor 組件間的基本通信需求。


級聯組件傳值

Blazor 中,級聯傳值(Cascading Communication) 可以通過以下幾種方式實現:

  1. 使用 CascadingParameter 實現層級組件傳值
  2. 使用 CascadingValue 組件包裹子樹,并向下傳遞數據

下面是一個 三層級組件傳值的完整示例(父 → 子 → 孫)


2.1 使用 CascadingValueCascadingParameter

示例結構

ParentComponent.razor
└── ChildComponent.razor└── GrandChildComponent.razor

Ⅰ. 父組件:ParentComponent.razor

@page "/parent"<CascadingValue Value="@message"><ChildComponent />
</CascadingValue>@code {private string message = "來自父組件的消息";
}

Ⅱ. 子組件:ChildComponent.razor

<h4>子組件收到消息: @cascadeMessage</h4>
<GrandChildComponent />@code {[CascadingParameter]public string cascadeMessage { get; set; }
}

Ⅲ. 孫組件:GrandChildComponent.razor

<h5>孫組件收到消息: @cascadeMessage</h5>@code {[CascadingParameter]public string cascadeMessage { get; set; }
}

2.2 運行效果

訪問 /parent 路由后,頁面將顯示如下內容:

子組件收到消息: 來自父組件的消息
孫組件收到消息: 來自父組件的消息

說明:

  • CascadingValue 將值從父組件廣播給其所有嵌套子組件。
  • 所有子組件通過 [CascadingParameter] 接收值,無需手動逐層傳遞。

2.3 注意事項

注意點說明
類型匹配CascadingValue 的類型必須與接收組件的 CascadingParameter 類型一致
多個值可以使用多個 CascadingValue 包裹不同值,或使用對象封裝多個字段
性能影響不建議過度使用級聯參數,避免造成上下文污染和性能問題

2.4 進階用法:傳遞對象而非基本類型

<CascadingValue Value="@userContext"><ChildComponent />
</CascadingValue>@code {private UserContext userContext = new UserContext { Name = "Alice", Role = "Admin" };
}public class UserContext {public string Name { get; set; }public string Role { get; set; }
}

子組件中接收:

[CascadingParameter]
public UserContext userContext { get; set; }

blazor

如需更復雜的通信(如跨層級雙向綁定),可以結合 EventCallback 或使用狀態管理庫(如 Fluxor)。

更復雜的通信

Blazor 中,當組件層級較深或需要實現 跨層級雙向綁定通信 時,推薦使用以下兩種方式:


? 方案一:結合 EventCallback 實現跨層級通信

場景說明:

  • 組件層級嵌套較深(如 父 → 子 → 孫)。
  • 需要從最內層子組件向頂層組件傳遞數據,并同步更新狀態。

示例結構:

ParentComponent.razor
└── ChildComponent.razor└── GrandChildComponent.razor

1. 父組件:ParentComponent.razor

@page "/parent"<h3>父組件顯示的值: @sharedValue</h3><ChildComponent OnValueChanged="UpdateValue" />@code {private string sharedValue = "初始值";private void UpdateValue(string newValue){sharedValue = newValue;}
}

2. 子組件:ChildComponent.razor

<GrandChildComponent OnValueChanged="OnValueChanged" />@code {[Parameter]public EventCallback<string> OnValueChanged { get; set; }
}

3. 孫組件:GrandChildComponent.razor

<input @bind="inputValue" />
<button @onclick="SendValueToParent">發送到父組件</button>@code {private string inputValue = "默認輸入";[Parameter]public EventCallback<string> OnValueChanged { get; set; }private async Task SendValueToParent(){await OnValueChanged.InvokeAsync(inputValue);}
}

運行效果:

  1. 在孫組件中修改輸入框內容并點擊按鈕;
  2. 消息會逐級上傳至父組件;
  3. 父組件中的 sharedValue 被更新并重新渲染。

? 方案二:使用狀態管理庫 Fluxor 實現全局共享狀態(推薦)

優勢:

  • 避免層層傳遞參數和事件回調;
  • 實現組件間真正的“雙向綁定”;
  • 支持集中管理應用狀態,提升可維護性。

安裝 Fluxor

通過 NuGet 安裝:

dotnet add package Fluxor --version 6.6.0

注冊服務(在 Program.cs 中):

builder.Services.AddFluxor(options =>options.ScanAssemblies(typeof(Program).Assembly));

1. 創建 State 類:CounterState.cs

public class CounterState(int count)
{public int Count { get; } = count;
}

2. 創建 Feature 和 Reducer:CounterFeature.cs

public class CounterFeature : Feature<CounterState>
{public override string GetName() => "Counter";public override CounterState GetInitialState() => new(0);
}public record IncrementAction();
public record DecrementAction();public class CounterReducer
{[ReducerMethod]public static CounterState Increment(CounterState state, IncrementAction action) =>new(state.Count + 1);[ReducerMethod]public static CounterState Decrement(CounterState state, DecrementAction action) =>new(state.Count - 1);
}

3. 創建 Store 并使用(任意組件中)

使用 Store 的組件示例:CounterComponent.razor
@inject IStore store;
@inject IDispatcher dispatcher;<p>當前計數: @counterState.Value.Count</p>
<button @onclick="Increment">+1</button>
<button @onclick="Decrement">-1</button>@code {private IState<CounterState> counterState;protected override void OnInitialized(){counterState = store.GetState<CounterState>();}private void Increment() => dispatcher.Dispatch(new IncrementAction());private void Decrement() => dispatcher.Dispatch(new DecrementAction());
}

運行效果:

  • 多個組件都可以訪問和修改同一個 Count 值;
  • 所有監聽該狀態的組件都會自動刷新;
  • 實現了真正的跨層級、雙向綁定通信。

🧠 總結對比

方式適用場景優點缺點
EventCallback層級不深 / 單向/雙向傳值簡單直接層級多時繁瑣
CascadingParameter同一樹狀結構下傳值快速廣播只能讀取,不能雙向綁定
Fluxor全局狀態共享 / 復雜交互狀態統一管理,解耦組件初期配置復雜

? 推薦實踐

  • 小型項目:使用 EventCallback & CascadingParameter
  • 中大型項目或需要跨組件共享狀態:優先使用 Fluxor
  • 更高級需求可考慮配合 TimeWarp.StateMediatR

說明:

  • Blazor-State 已更名為 TimeWarp.State

相關 nuget 包資源:

  • Blazor-Statehttps://www.nuget.org/packages/Blazor-State/11.0.0-beta.36
  • TimeWarp.Statehttps://www.nuget.org/packages/TimeWarp.State/
  • MediatRhttps://www.nuget.org/packages/MediatR

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

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

相關文章

力扣熱題100再刷

160.相交鏈表 讀一遍A&#xff0c;一個set存節點&#xff0c;遍歷B的時候判斷即可。復習下set的STL&#xff1a;set有set和unordered_set&#xff0c;同樣有insert&#xff0c;find&#xff0c;count&#xff0c;對于set而言&#xff0c;自動從小到大排序&#xff0c;還有&…

MySQL常用函數性能優化及索引影響分析

MySQL 常用函數性能優化指南&#xff08;含索引影響分析&#xff09; 以下是 MySQL 函數使用指南&#xff0c;新增性能影響評級、索引失效分析和優化方案&#xff0c;幫助您高效使用函數&#xff1a; &#x1f4dc; 一、字符串處理函數&#xff08;含性能分析&#xff09; 函…

莫隊(基礎版)優雅的暴力

莫隊算法是一種離線算法&#xff0c;常用于高效處理區間查詢問題。它通過合理排序和移動左右端點來減少時間復雜度。 基本思想 莫隊算法的核心思想是將所有查詢離線排序&#xff01;&#xff01;&#xff08;找出一個過起來最快的查詢順序&#xff09;&#xff0c;然后通過移動…

? Python 高級定制 | 美化 Word 表格邊框與樣式(收貨記錄增強版)

之前我們完成了 Excel 數據提取、Word 表格寫入與合并&#xff0c;現在繼續 為 Word 表格添加高級樣式 裝扮&#xff0c;包括單元格邊框、背景填色、居中對齊、粗體、高亮行/列等&#xff0c;進一步增強表格的可讀性與專業性。 &#x1f58c;? 樣式設置函數 1. 設置單元格邊框…

Clickhouse源碼分析-TTL執行流程

第一種情況&#xff1a;無ttl_only_drop_parts配置 總體示例以及說明 如果沒有ttl_only_drop_parts的配置&#xff0c;過期數據的刪除&#xff08;這里是刪除&#xff0c;是將過期的數據從這個part刪除&#xff0c;并將過期的數據構成一個part&#xff0c;這個過期的part標記…

elementui修改radio字體的顏色和圓圈的樣式

改完 <div class"choose"><el-radio-group v-model"radioNum"><el-radio label"1" size"large">Option 1</el-radio><el-radio label"2" size"large">Option 2</el-radio>&l…

力扣3381. 長度可被 K 整除的子數組的最大元素和

由于數據范圍是2*10^5所以必然是遍歷一次&#xff0c;子數組必定要用到前綴和&#xff0c;之前的題目中總是遇到的是子數組的和能不能被k整除&#xff0c;而這里不一樣的是子數組的長度能不能被k整除&#xff0c;如果單純的枚舉長度必定超時&#xff0c;而看看題解得出的思路&a…

基于SSM的勤工助學系統的設計與實現

第1章 摘要 基于SSM框架的勤工助學系統旨在為學生、用工部門和管理員提供高效便捷的管理平臺。系統包括學生端、用工部門端和管理員端&#xff0c;涵蓋了從崗位發布、申請審核、工時記錄、薪資管理到數據統計等完整的功能需求。 學生可以通過系統首頁瀏覽最新的崗位信息和公告&…

2025年06月30日Github流行趨勢

項目名稱&#xff1a;twenty 項目地址 URL&#xff1a;https://github.com/twentyhq/twenty項目語言&#xff1a;TypeScript歷史 star 數&#xff1a;31,774今日 star 數&#xff1a;1,002項目維護者&#xff1a;charlesBochet, lucasbordeau, FelixMalfait, Weiko, bosiraphae…

creo 2.0學習筆記

Creo軟件從入門到精通——杜書森 1.1 Creo基本建模過程介紹 新建-零件-改名稱-取消使用默認模板&#xff0c;是因為默認的是英制尺寸&#xff0c;自定義可選擇mmns_part_solid&#xff0c;模板主要是設置模型的單位拉伸-選取FRONT-點擊草繪視圖&#xff0c;可進行草繪旋轉——…

ZNS初步認識—GPT

1. ZNS SSD 的基本概念 Zoned Namespace (ZNS): ZNS 是一種新的NVMe接口規范&#xff0c;它將SSD的邏輯塊地址空間劃分為多個獨立的、固定大小的“區域”&#xff08;Zones&#xff09;。區域 (Zone): ZNS SSD 的基本管理單元。每個區域都有自己的寫入指針&#xff08;write p…

【seismic unix生成可執行文件-sh文件】

Shell腳本文件&#xff08;.sh文件&#xff09;簡介 Shell腳本文件&#xff08;通常以.sh為擴展名&#xff09;是一種包含Shell命令的文本文件&#xff0c;用于在Unix/Linux系統中自動化執行任務。它由Shell解釋器&#xff08;如Bash、Zsh等&#xff09;逐行執行&#xff0c;常…

Debezium日常分享系列之:在 Kubernetes 上部署 Debezium

Debezium日常分享系列之&#xff1a;在 Kubernetes 上部署 Debezium 先決條件步驟部署數據源 (MySQL)登錄 MySQL db將數據插入其中部署 Kafka部署 kafdrop部署 Debezium 連接器創建 Debezium 連接器 Debezium 可以無縫部署在 Kubernetes&#xff08;一個用于容器編排的開源平臺…

利潤才是機器視覺企業的的“穩定器”,機器視覺企業的利潤 = (規模經濟 + 技術差異化 × 場景價值) - 競爭強度

影響機器視覺企業盈利能力的關鍵因素。這個公式本質上反映了行業的核心動態:利潤來自成本控制(規模化效應)和差異化優勢(技術壁壘與場景稀缺性的協同),但被市場競爭(內卷程度)所侵蝕。下面我將一步步拆解這個公式,結合機器視覺行業的特點(如工業自動化、質檢、安防、…

EPLAN 中定制 自己的- A3 圖框的詳細指南(一)

EPLAN 中定制 BIEM - A3 圖框的詳細指南 在智能電氣設計領域&#xff0c;圖框作為圖紙的重要組成部分&#xff0c;其定制的規范性和準確性至關重要。本文將以北京經濟管理職業學院人工智能學院的相關任務為例&#xff0c;詳細介紹在 EPLAN 軟件中定制 BIEM - A3 圖框的全過程…

macbook開發環境的配置記錄

前言&#xff1a;好多東西不記錄就會忘記 git ssh配置 當我們的沒有配置git ssh的時候&#xff0c;使用ssh下載的時候會顯示報錯“make sure you have the correct access rights and respository exits" 如何解決&#xff0c;我們先在命令行檢查檢查一下用戶名和郵箱是…

GitLab 18.1 高級 SAST 已支持 PHP,可升級體驗!

GitLab 是一個全球知名的一體化 DevOps 平臺&#xff0c;很多人都通過私有化部署 GitLab 來進行源代碼托管。極狐GitLab 是 GitLab 在中國的發行版&#xff0c;專門為中國程序員服務。可以一鍵式部署極狐GitLab。 學習極狐GitLab 的相關資料&#xff1a; 極狐GitLab 官網極狐…

[學習]M-QAM的數學原理與調制解調原理詳解(仿真示例)

M-QAM的數學原理與調制解調原理詳解 QAM&#xff08;正交幅度調制&#xff09;作為現代數字通信的核心技術&#xff0c;其數學原理和實現方法值得深入探討。本文將分為數學原理、調制解調原理和實現要點三個部分進行系統闡述。 文章目錄 M-QAM的數學原理與調制解調原理詳解一、…

圖書管理系統練習項目源碼-前后端分離-使用node.js來做后端開發

前端學習了這么久了&#xff0c;node.js 也有了一定的了解&#xff0c;知道使用node也可以來開發后端&#xff0c;今天給大家分享 使用node 來做后端&#xff0c;vue來寫前端&#xff0c;做一個簡單的圖書管理系統。我們在剛開始學習編程的時候&#xff0c;需要自己寫大量的項目…

【甲方安全視角】企業建設下的安全運營

文章目錄 一、安全運營的概念與起源二、安全運營的職責與定位三、安全運營工程師的核心能力要求四、安全運營的典型場景與應對技巧1. 明確責任劃分,避免“醫生做保姆”2. 推動機制:自下而上 vs. 自上而下3. 宣傳與內部影響力建設五、安全運營的戰略意義六、為何需要安全原因在…