当前位置:首页 > 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 向子组件传递回调函数,子组件调用该函数将数据传递回父组件。

// 父组件
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。

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

react组件如何通讯

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

相关文章

vue怎么实现组件缓存

vue怎么实现组件缓存

Vue 实现组件缓存的方法 Vue 提供了内置组件 <keep-alive> 来实现组件缓存,避免重复渲染和销毁组件,提升性能。 基本用法 使用 <keep-alive> 包…

vue实现组件

vue实现组件

Vue 组件实现基础 Vue 组件是可复用的 Vue 实例,用于封装 UI 和逻辑。通过 .vue 文件或直接注册组件实现。 单文件组件 (SFC) 示例 <template&g…

vue实现拖拽实现组件嵌套

vue实现拖拽实现组件嵌套

Vue 拖拽实现组件嵌套 使用 Vue 实现拖拽组件嵌套功能可以通过原生 HTML5 拖拽 API 或第三方库如 vuedraggable 实现。以下是两种方法的详细说明: 使用 HTML5 拖拽…

vue实现折叠组件

vue实现折叠组件

Vue 折叠组件实现方法 基于 v-show 和事件触发 通过 v-show 控制内容的显示与隐藏,结合点击事件切换状态。 <template> <div> &…

vue实现组件封装

vue实现组件封装

Vue 组件封装方法 封装组件的基本步骤 创建独立的 .vue 文件,包含 template、script 和 style 三个部分。通过 props 接收父组件传递的数据,使用 $emit 触发…

vue动态组件实现

vue动态组件实现

Vue 动态组件实现方法 使用 component 标签与 is 属性 通过 Vue 内置的 <component> 标签和 is 属性实现动态组件切换。is 的值可以是已注册的组件名或导…