在 React 中,组件之间传递变量的常见方法

news2025/3/31 23:44:04

目录

      • 1. **通过 Props 传递数据**
      • 2. **通过回调函数传递数据**
      • 3. **通过 Context API 传递数据**
      • 4. **通过 Redux 管理全局状态**
      • 5. **通过事件总线(如 Node.js 的 EventEmitter)**
      • 6. **通过 Local Storage / Session Storage**
      • 7. **通过 URL 查询参数传递数据**
      • 总结

在 React 中,组件之间传递变量的常见方法有以下几种:

1. 通过 Props 传递数据

  • 父组件通过 props 向子组件传递数据。子组件通过 props 来接收数据。

示例

function ParentComponent() {
  const parentData = "Hello from Parent!";
  return <ChildComponent data={parentData} />;
}

function ChildComponent({ data }) {
  return <div>{data}</div>;
}

2. 通过回调函数传递数据

  • 父组件可以传递一个回调函数给子组件,子组件通过调用该回调函数向父组件传递数据。

示例

function ParentComponent() {
  const [childData, setChildData] = useState("");

  const handleDataFromChild = (data) => {
    setChildData(data);
  };

  return (
    <div>
      <ChildComponent sendDataToParent={handleDataFromChild} />
      <p>Data from child: {childData}</p>
    </div>
  );
}

function ChildComponent({ sendDataToParent }) {
  return (
    <button onClick={() => sendDataToParent("Hello from Child!")}>
      Send Data to Parent
    </button>
  );
}

3. 通过 Context API 传递数据

  • Context API 允许你跨越组件树层级来传递数据,避免层层传递 props

示例

const MyContext = React.createContext();

function ParentComponent() {
  const parentData = "Data from Parent";
  
  return (
    <MyContext.Provider value={parentData}>
      <ChildComponent />
    </MyContext.Provider>
  );
}

function ChildComponent() {
  const data = useContext(MyContext);
  return <div>{data}</div>;
}

4. 通过 Redux 管理全局状态

  • 如果应用中需要跨多个组件共享复杂的状态,可以使用 Redux 或其他状态管理库。Redux 将状态集中在一个单一的 store 中,任何组件都可以访问和更新这些状态。

示例

// actions.js
export const setData = (data) => ({ type: 'SET_DATA', payload: data });

// reducer.js
const initialState = { data: "" };

function reducer(state = initialState, action) {
  switch (action.type) {
    case 'SET_DATA':
      return { ...state, data: action.payload };
    default:
      return state;
  }
}

// ParentComponent.js
import { useDispatch } from 'react-redux';
import { setData } from './actions';

function ParentComponent() {
  const dispatch = useDispatch();
  return (
    <button onClick={() => dispatch(setData("Hello from Redux!"))}>
      Send Data to Store
    </button>
  );
}

// ChildComponent.js
import { useSelector } from 'react-redux';

function ChildComponent() {
  const data = useSelector(state => state.data);
  return <div>{data}</div>;
}

5. 通过事件总线(如 Node.js 的 EventEmitter)

  • 使用事件总线(在 React 中较少使用)也是一种传递数据的方式,尤其是在复杂的场景中。可以创建一个中央事件管理器,然后跨组件触发事件和监听事件。

这种方式通常更少用于 React 中,除非有特定的场景需求。

6. 通过 Local Storage / Session Storage

  • 在需要多个组件或者不同页面间共享数据时,可以利用浏览器的 localStoragesessionStorage,来存储数据,然后在组件中读取。

示例

// 组件 A
useEffect(() => {
  localStorage.setItem('data', 'Hello from LocalStorage');
}, []);

// 组件 B
const data = localStorage.getItem('data');
console.log(data); // 输出: Hello from LocalStorage

7. 通过 URL 查询参数传递数据

  • 通过 URL 的查询参数(例如,?key=value)传递数据,适用于需要在不同路由间共享数据的场景。

示例

import { useLocation } from 'react-router-dom';

function ChildComponent() {
  const location = useLocation();
  const queryParams = new URLSearchParams(location.search);
  const data = queryParams.get('data');
  
  return <div>{data}</div>;
}

总结

  • 父子组件传递数据:通过 props 或回调函数。
  • 跨层级组件传递数据:通过 Context API
  • 全局状态管理:通过 Redux 或其他状态管理库。
  • 存储和路由传递数据:通过 localStorage, sessionStorage, 或 URL 查询参数。

根据实际需求和应用规模,选择合适的方式来管理和传递数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2324774.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

多线程—JUC(java.util.concurrent)

上篇文章&#xff1a; 多线程—synchronized原理https://blog.csdn.net/sniper_fandc/article/details/146713129?fromshareblogdetail&sharetypeblogdetail&sharerId146713129&sharereferPC&sharesourcesniper_fandc&sharefromfrom_link 目录 1 Calla…

从零开始跑通3DGS教程:(三)坐标系与尺度编辑(CloudCompare)

写在前面 本文内容 本文所属《从零开始跑通3DGS教程》系列文章&#xff1b; sfm重建的点云已经丢掉了尺度信息&#xff0c;并且坐标系跟图像数据有关(SFM初始化选择的图像)&#xff0c;所以如果想恢复物理真实尺度&#xff0c;以及在想要的视角下渲染&#xff0c;那么需要对尺度…

多线程 - 线程安全引入

写一个代码&#xff0c;让主线程创建一个新的线程&#xff0c;由新的线程负责完成一系列的运算&#xff08;比如&#xff1a;1 2 3 ... 1000&#xff09;&#xff0c;再由主线程负责获取到最终结果。 但打印结果为 result 0&#xff0c;略微思考&#xff0c;明白了要让 t 线…

【面试八股】:CAS指令

一、CAS 面试题 1. 说说CAS、CAS有什么问题&#xff08;ABA)?(美团一面&#xff09; Compare And Swap 对比交换&#xff08;原子指令&#xff09; CAS是 CPU指令 操作系统原生 API&#xff0c;JVM对它进行了封装&#xff08;C)&#xff0c;供我们使用。 通过判断 内存 和 …

el-radio-group 中 el-radio-button value未能绑定上数值数据

这样绑定到admin后不会随着admin的值显示 在value加上 : 后成功显示

JSP(实验):带验证码的用户登录

[实验目的] 1&#xff0e;掌握应用request对象获取表单提交的数据。 2&#xff0e;掌握解决获取表单提交数据产生中文乱码的问题。 3&#xff0e;掌握使用response对象进行定时跳转功能。 4&#xff0e;掌握使用session对象完成登录和注销功能。 [实验要求] 设计带验证码…

集多功能为一体的软件,支持批量操作。

今天我给大家分享一个超实用的小工具&#xff0c;真的是太好用了&#xff01;这个软件是吾爱大神无知灰灰制作的&#xff0c;它能直接一键把webp格式的图片转换成png格式。 webp转为png 一键操作&#xff0c;支持压缩 其实&#xff0c;作者最近在工作中经常遇到webp格式的图片…

linux压缩指令

今天我们来了解一下linux压缩指令,压缩是我们文件传输的一种重要手段,对此,我们是必须学习压缩指令的,那么话不多说,来看. 1.grep过滤查找&#xff0c;管道符&#xff0c;“&#xff5c;”&#xff0c;表示将前一个命令的处理结果输出传递给后面的命令处理。 基本语法&#x…

污水处理厂人员定位方案-UWB免布线高精度定位

1. 方案概述 本方案采用免布线UWB基站与北斗卫星定位融合技术&#xff0c;结合UWBGNSS双模定位工卡&#xff0c;实现污水处理厂室内外人员高精度定位&#xff08;亚米级&#xff09;。系统通过低功耗4G传输数据&#xff0c;支持实时位置监控、电子围栏、聚集预警、轨迹回放等功…

Elasticsearch 高级

Elasticsearch 高级 建议阅读顺序&#xff1a; Elasticsearch 入门Elasticsearch 搜索Elasticsearch 搜索高级Elasticsearch高级&#xff08;本文&#xff09; 1. nested 类型 1.1 介绍 Elasticsearch 中的 nested 类型允许你在文档内存储复杂的数据结构&#xff0c;比如一个…

C语言笔记数据结构(链表)

希望文章能对你有所帮助&#xff0c;有不足的地方请在评论区留言指正,一起交流学习! 目录 1.链表 1.1 链表概念和组成 1.2 链表的分类 1.3 顺序表和链表 2.单链表&#xff08;无头单向不循环链表&#xff09; 2.1 结点的创建 2.2 创建新的结点 2.3 单链表的打印 2.4 尾…

Leetcode 两数相除

✅ LeetCode 29. 两数相除 — 思路总览 &#x1f9e9; 题目要求 给定两个整数 dividend 和 divisor&#xff0c;实现 整数除法&#xff0c;不能使用乘法 *、除法 / 和取余 % 运算符。 要求返回的结果应为 向零截断的整数商&#xff0c;即&#xff1a; 正数向下取整&#xf…

人工智能图像识别Scala介绍

Scala 一.Scala 简介 Scala即Scalable Language&#xff08;可伸缩的语言&#xff09;&#xff0c;Scala 语言是由 Martin Odersky 等人在 2003 年开发的&#xff0c;并于 2004 年首次发布。意味着这种语言设计上支持大规模软件开发&#xff0c;是一门多范式的编程语言。 Sc…

C++中使用CopyFromRecordset将记录集拷贝到excel中时,如果记录集为0个,函数崩溃,是什么原因

文章目录 原因分析解决方案1. 检查记录集是否为空2. 安全调用COM方法3.进行异常捕获4. 替代方案&#xff1a;手动处理空数据 总结 在C中使用CopyFromRecordset将空记录集&#xff08;0条记录&#xff09;复制到Excel时崩溃的原因及解决方法如下&#xff1a; 原因分析 空记录集…

c#的.Net Framework 的console 项目找不到System.Window.Forms 引用

首先确保是建立的.Net Framework 的console 项目,然后天健reference 应用找不到System.Windows.Forms 引用 打开对应的csproj 文件 在第一个PropertyGroup下添加 <UseWindowsForms>true</UseWindowsForms> 然后在第一个ItemGroup 下添加 <Reference Incl…

蓝桥杯嵌入式学习笔记

用博客来记录一下参加蓝桥杯嵌入式第十六届省赛的学习经历 工具环境准备cubemx配置外部高速时钟使能设置串口时钟配置项目配置 keil配置烧录方式注意代码规范头文件配置 模块ledcubemx配置keil代码实现点亮一只灯实现具体操作的灯&#xff0c;以及点亮还是熄灭 按键cubemx配置k…

Blender多摄像机怎么指定相机渲染图像

如题目所说&#xff0c;当blender的场景里面有摄像机的时候&#xff0c;按F12可以预览渲染结果&#xff0c;但是当有多个摄像机的时候就不知道使用哪个进行渲染了。 之前在网上没有找到方法&#xff0c;就用笨方法&#xff0c;把所有的摄像机删除&#xff0c;然后设置自己需要…

从 MySQL 到时序数据库 TDengine:Zendure 如何实现高效储能数据管理?

小T导读&#xff1a;TDengine 助力广州疆海科技有限公司高效完成储能业务的数据分析任务&#xff0c;轻松应对海量功率、电能及输入输出数据的实时统计与分析&#xff0c;并以接近 1 : 20 的数据文件压缩率大幅降低存储成本。此外&#xff0c;taosX 强大的 transform 功能帮助用…

观察者模式:解耦对象间的依赖关系

观察者模式&#xff1a;解耦对象间的依赖关系 JDK 中曾直接提供对观察者模式的支持&#xff0c;但因其设计局限性&#xff0c;现已被标记为“过时”&#xff08;Deprecated&#xff09;。不过&#xff0c;观察者模式的思想在 JDK 的事件处理、spring框架等仍有广泛应用。下面我…

windows第二十章 单文档应用程序

文章目录 单文档定义新建一个单文档应用程序单文档应用程序组成&#xff1a;APP应用程序类框架类&#xff08;窗口类&#xff09;视图类&#xff08;窗口类&#xff0c;属于框架的子窗口&#xff09;文档类&#xff08;对数据进行保存读取操作&#xff09; 直接用向导创建单文档…