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

目录

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

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

1. 通过 Props 传递数据

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

示例

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

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

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

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

示例

jsx 复制代码
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

示例

jsx 复制代码
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 中,任何组件都可以访问和更新这些状态。

示例

jsx 复制代码
// 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,来存储数据,然后在组件中读取。

示例

jsx 复制代码
// 组件 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)传递数据,适用于需要在不同路由间共享数据的场景。

示例

jsx 复制代码
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 查询参数。

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

相关推荐
2501_909078595 分钟前
获取1688.item_password接口:解析淘口令真实URL
前端·python
uhakadotcom11 分钟前
StoreKit 2:苹果应用内购买的新时代
前端·面试·github
henujolly42 分钟前
Axios核心原理
前端
计算机毕设定制辅导-无忧学长1 小时前
从入门到精通:HTML 项目实战中的学习进度(二)
前端·学习·html
好_快1 小时前
Lodash源码阅读-getAllKeys
前端·javascript·源码阅读
pixle01 小时前
Three.js 快速入门教程【二十】3D模型加载优化实战:使用gltf-pipeline与Draco对模型进行压缩,提高加载速度和流畅性
开发语言·javascript·3d·前端框架
好_快1 小时前
Lodash源码阅读-equalObjects
前端·javascript·源码阅读
The_era_achievs_hero1 小时前
vue复习1~45
前端·javascript·vue.js
星尘安全1 小时前
恶意npm包修改本地“以太坊”库以发起反弹Shell攻击
前端·npm·node.js·供应链安全·黑客攻击
一只小风华~2 小时前
鸿蒙harmonyOS:笔记 正则表达式
前端·笔记·华为·正则表达式·harmonyos