当前位置:首页 > React

react 子组件如何通信

2026-03-31 17:42:02React

子组件向父组件通信(子传父)

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

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

// 子组件
function Child({ onData }) {
  const sendData = () => {
    onData("子组件数据"); // 触发回调
  };
  return <button onClick={sendData}>发送数据</button>;
}

父组件向子组件通信(父传子)

通过 props 直接传递数据或状态。

// 父组件
function Parent() {
  const [count, setCount] = useState(0);
  return <Child count={count} />; // 传递状态
}

// 子组件
function Child({ count }) {
  return <div>{count}</div>; // 显示父组件数据
}

兄弟组件通信

通过状态提升(Lifting State Up)到共同的父组件,再通过 props 传递。

// 父组件
function Parent() {
  const [sharedData, setSharedData] = useState("");
  return (
    <>
      <SiblingA onData={setSharedData} />
      <SiblingB data={sharedData} />
    </>
  );
}

// 兄弟组件A(发送数据)
function SiblingA({ onData }) {
  return <button onClick={() => onData("数据")}>发送</button>;
}

// 兄弟组件B(接收数据)
function SiblingB({ data }) {
  return <div>{data}</div>;
}

跨层级组件通信(Context API)

使用 React.createContext 实现深层嵌套组件间的数据传递。

const DataContext = React.createContext();

// 父组件(提供数据)
function Parent() {
  return (
    <DataContext.Provider value="全局数据">
      <Child />
    </DataContext.Provider>
  );
}

// 子组件(消费数据)
function Child() {
  const data = useContext(DataContext);
  return <div>{data}</div>;
}

事件总线(Event Bus)

通过自定义事件实现任意组件间通信(需谨慎使用,可能破坏 React 数据流)。

// 事件总线工具
const EventBus = {
  listeners: {},
  emit(event, data) {
    if (this.listeners[event]) {
      this.listeners[event].forEach(cb => cb(data));
    }
  },
  on(event, callback) {
    if (!this.listeners[event]) this.listeners[event] = [];
    this.listeners[event].push(callback);
  }
};

// 组件A(发布事件)
function ComponentA() {
  const handleClick = () => {
    EventBus.emit("message", "数据");
  };
  return <button onClick={handleClick}>发布</button>;
}

// 组件B(订阅事件)
function ComponentB() {
  const [data, setData] = useState("");
  useEffect(() => {
    EventBus.on("message", setData);
  }, []);
  return <div>{data}</div>;
}

状态管理工具(Redux/Zustand)

适用于复杂场景,集中管理全局状态。以 Zustand 为例:

react 子组件如何通信

import create from 'zustand';

// 创建 store
const useStore = create(set => ({
  data: "",
  setData: (newData) => set({ data: newData })
}));

// 组件A(更新状态)
function ComponentA() {
  const setData = useStore(state => state.setData);
  return <button onClick={() => setData("新数据")}>更新</button>;
}

// 组件B(读取状态)
function ComponentB() {
  const data = useStore(state => state.data);
  return <div>{data}</div>;
}

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

相关文章

vue radio组件实现

vue radio组件实现

Vue Radio 组件实现 在 Vue 中实现 Radio 组件可以通过原生 HTML 的 <input type="radio"> 结合 Vue 的响应式特性,或者使用第三方 UI 库…

vue实现组件循环

vue实现组件循环

Vue 实现组件循环的方法 在 Vue 中,可以通过 v-for 指令实现组件的循环渲染。以下是几种常见的实现方式: 使用 v-for 渲染数组 通过 v-for 遍历数组数据,动态生成组件列表:…

vue实现广告组件

vue实现广告组件

vue实现广告组件的方法 使用动态组件实现 在Vue中可以通过动态组件的方式加载广告组件,根据不同的条件展示不同的广告内容。动态组件使用<component :is="currentCompon…

react如何删除组件

react如何删除组件

删除 React 组件的几种方法 条件渲染法 通过状态控制组件是否渲染。当状态为 false 时,组件会被移除: const [showComponent, setShowComponent] =…

vue实现组件切换

vue实现组件切换

Vue 组件切换的实现方法 在 Vue 中实现组件切换有多种方式,以下是几种常见的方法: 动态组件 使用 Vue 内置的 <component> 元素和 is 属性可以动态切换组件:…

vue实现路由组件

vue实现路由组件

Vue 实现路由组件的方法 在 Vue 中实现路由功能通常需要结合 Vue Router 库,以下是具体实现步骤: 安装 Vue Router 通过 npm 或 yarn 安装 Vue Router…