当前位置:首页 > React

react组件如何通讯

2026-01-14 09:36:28React

React 组件通讯方式

React 组件间的通讯方式主要包括以下几种方法,适用于不同场景下的数据传递和状态管理需求。

父子组件通讯(Props 传递)

父组件通过 props 向子组件传递数据或回调函数,子组件通过 props 接收数据或调用父组件传递的回调函数。

// 父组件
function Parent() {
  const [data, setData] = useState('Hello');
  return <Child message={data} />;
}

// 子组件
function Child({ message }) {
  return <div>{message}</div>;
}

子父组件通讯(回调函数)

父组件通过 props 向子组件传递回调函数,子组件调用该函数将数据传递回父组件。

react组件如何通讯

// 父组件
function Parent() {
  const handleData = (data) => console.log(data);
  return <Child onData={handleData} />;
}

// 子组件
function Child({ onData }) {
  return <button onClick={() => onData('Data from child')}>Send</button>;
}

兄弟组件通讯(状态提升)

将共享状态提升到共同的父组件中,通过 props 传递给兄弟组件。

function Parent() {
  const [sharedData, setSharedData] = useState('');
  return (
    <>
      <ChildA onData={setSharedData} />
      <ChildB data={sharedData} />
    </>
  );
}

Context API

通过 React 的 Context API 实现跨层级组件通讯,避免逐层传递 props。

react组件如何通讯

const DataContext = createContext();

function App() {
  const [data, setData] = useState('Default');
  return (
    <DataContext.Provider value={{ data, setData }}>
      <Child />
    </DataContext.Provider>
  );
}

function Child() {
  const { data, setData } = useContext(DataContext);
  return <button onClick={() => setData('Updated')}>{data}</button>;
}

事件总线(Event Bus)

通过自定义事件发布订阅机制实现任意组件间的通讯,适用于非父子关系的组件。

// 事件总线实现
const EventBus = {
  events: {},
  emit(event, data) {
    if (this.events[event]) this.events[event].forEach(cb => cb(data));
  },
  on(event, callback) {
    this.events[event] = this.events[event] || [];
    this.events[event].push(callback);
  }
};

// 组件A
function ComponentA() {
  const handleClick = () => EventBus.emit('event', 'Data');
  return <button onClick={handleClick}>Emit</button>;
}

// 组件B
function ComponentB() {
  const [data, setData] = useState('');
  useEffect(() => {
    EventBus.on('event', setData);
  }, []);
  return <div>{data}</div>;
}

状态管理库(Redux/Zustand)

使用第三方状态管理库(如 Redux、Zustand)集中管理应用状态,实现组件间高效通讯。

// Redux 示例
import { createSlice, configureStore } from '@reduxjs/toolkit';

const dataSlice = createSlice({
  name: 'data',
  initialState: { value: '' },
  reducers: {
    update: (state, action) => { state.value = action.payload; }
  }
});

const store = configureStore({ reducer: dataSlice.reducer });

function ComponentA() {
  return (
    <button onClick={() => store.dispatch(dataSlice.actions.update('New Data'))}>
      Update
    </button>
  );
}

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

Refs 和 ForwardRef

通过 ref 直接访问子组件实例或 DOM 节点,适用于需要直接操作子组件的情况。

const Child = forwardRef((props, ref) => {
  useImperativeHandle(ref, () => ({
    getData: () => 'Child Data'
  }));
  return <div>Child</div>;
});

function Parent() {
  const childRef = useRef();
  const handleClick = () => console.log(childRef.current.getData());
  return (
    <>
      <Child ref={childRef} />
      <button onClick={handleClick}>Get Data</button>
    </>
  );
}

选择建议

  • 简单父子通讯:优先使用 props 和回调函数
  • 跨层级通讯:使用 Context API
  • 复杂状态管理:考虑 Redux 或 Zustand
  • 非父子组件通讯:事件总线或状态管理库
  • 需要直接访问子组件:使用 refs

标签: 组件通讯
分享给朋友:

相关文章

vue实现水印组件

vue实现水印组件

Vue 水印组件实现 基础水印组件实现 创建一个基础水印组件,通过 props 接收文本、颜色、大小等参数: <template> <div class="watermark-…

vue组件实现vmodel

vue组件实现vmodel

Vue 组件实现 v-model 在 Vue 中,v-model 是双向数据绑定的语法糖,默认情况下绑定 value 属性并监听 input 事件。在自定义组件中实现 v-model 需要正确配置 p…

react如何刷新组件

react如何刷新组件

刷新 React 组件的常见方法 使用状态更新触发重新渲染 通过修改组件的状态(state),React 会自动触发重新渲染。例如: const [count, setCount] = useSta…

vue实现头像组件

vue实现头像组件

Vue 头像组件实现 基础实现 创建一个可复用的头像组件,支持图片链接或文字缩写显示: <template> <div class="avatar" :style="avata…

vue实现树形组件

vue实现树形组件

实现树形组件的基本思路 在Vue中实现树形组件通常涉及递归组件和动态数据渲染。核心是通过组件自身调用自身,逐层渲染嵌套的节点数据。 定义树形数据结构 树形数据通常是一个包含children属性的对象…

vue组件实现跳转

vue组件实现跳转

Vue 组件实现跳转的方法 在 Vue 中实现页面跳转可以通过多种方式,以下是常见的几种方法: 使用 router-link 组件 router-link 是 Vue Router 提供的组件,用于…