当前位置:首页 > 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 直接传递数据或状态。

react 子组件如何通信

// 父组件
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 实现深层嵌套组件间的数据传递。

react 子组件如何通信

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 为例:

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实现下拉框组件

vue实现下拉框组件

Vue 下拉框组件实现 基础实现 创建基础下拉框组件,使用v-model实现双向数据绑定: <template> <div class="dropdown"> &…

vue实现折叠组件

vue实现折叠组件

实现折叠组件的基本思路 在Vue中实现折叠组件通常需要利用动态绑定和条件渲染。核心是通过控制一个布尔值状态来决定内容是否显示,并添加过渡动画提升用户体验。 基础实现方法 使用v-show或v-if控…

react如何删除组件

react如何删除组件

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

vue实现高阶组件

vue实现高阶组件

Vue 高阶组件实现方法 高阶组件(HOC)是一种复用组件逻辑的模式,通过函数包裹组件并返回新组件实现。Vue 中可通过以下方式实现: 使用 render 函数 通过函数接收组件选项并返回新组件选项…

vue基础组件实现

vue基础组件实现

Vue 基础组件实现 组件定义 使用 Vue.component 全局注册或局部注册组件。全局注册适合通用组件,局部注册适合特定页面使用的组件。 // 全局注册 Vue.component('my-…

vue实现switch组件

vue实现switch组件

Vue 实现 Switch 组件 基本结构 使用 Vue 的单文件组件(SFC)实现一个基础的 Switch 组件。模板部分包含一个 div 包裹的 input 和 span,通过 CSS 实现开关样…