当前位置:首页 > React

react组件如何通讯

2026-03-30 18:35:48React

组件通讯方式

父组件向子组件传递数据
通过props传递数据,子组件通过this.props(类组件)或函数参数(函数组件)接收。父组件更新props会触发子组件重新渲染。

子组件向父组件传递数据
父组件通过props传递回调函数给子组件,子组件调用该函数并传入参数。父组件在回调中处理子组件的数据。

兄弟组件通讯
通过共同的父组件作为中介,子组件A通过父组件回调更新状态,状态通过props传递给子组件B。

跨层级通讯

Context API
使用React.createContext创建上下文,Provider提供数据,子组件通过ConsumeruseContext钩子消费数据。适合跨多层级组件共享状态。

状态管理库(Redux/MobX)
集中管理全局状态,组件通过connectuseSelector获取状态,通过dispatchaction更新状态。适合复杂应用的状态共享。

事件总线模式

自定义事件系统
利用EventEmitterPubSub库实现发布订阅模式,组件通过事件名监听和触发事件。灵活性高但需注意事件命名冲突。

代码示例

父传子

// 父组件
<ChildComponent message="Hello" />

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

子传父

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

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

Context API

react组件如何通讯

const ThemeContext = React.createContext();

function App() {
  return (
    <ThemeContext.Provider value="dark">
      <Toolbar />
    </ThemeContext.Provider>
  );
}

function Toolbar() {
  return <Button />;
}

function Button() {
  const theme = useContext(ThemeContext);
  return <button className={theme}>Click</button>;
}

选择建议

  • 简单父子通讯优先使用props和回调。
  • 跨层级或多组件共享状态使用Context或状态管理库。
  • 事件总线适合解耦非直接关联的组件,但需谨慎维护。

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

相关文章

Vue组件实现方法

Vue组件实现方法

Vue组件的基本实现方法 Vue组件是Vue.js的核心概念之一,用于构建可复用的UI模块。以下是Vue组件的几种常见实现方式: 单文件组件(SFC) 使用.vue文件格式,将模板、脚本和样式封装在…

vue动态组件实现

vue动态组件实现

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

vue哪个组件实现动画

vue哪个组件实现动画

在Vue中实现动画效果,可以通过以下组件和方法实现: Vue内置动画组件 Vue提供了<transition>和<transition-group>两个内置组件,用于处理进入…

vue 实现toast组件

vue 实现toast组件

实现 Vue Toast 组件的方法 创建基础 Toast 组件 在 Vue 项目中创建一个基础 Toast 组件,通常包含消息内容和显示控制逻辑。 <template> &…

vue实现树组件

vue实现树组件

Vue 树形组件的实现方法 递归组件实现 使用 Vue 的递归组件特性可以轻松实现树形结构。定义一个组件,该组件能够调用自身来渲染子节点。 <template> <ul>…

vue实现search组件

vue实现search组件

Vue 实现搜索组件 基础实现 创建一个基础的搜索组件需要包含输入框和搜索逻辑。以下是一个简单的实现示例: <template> <div class="search-cont…