详解 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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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. 宣传与内部影响力建设五、安全运营的战略意义六、为何需要安全原因在…