当前位置:首页 > React

react组件如何通讯

2026-02-26 01:49:55React

父子组件通讯

父组件通过 props 向子组件传递数据或方法,子组件通过调用父组件传递的回调函数实现通讯。

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

// 子组件
function Child({ data, onUpdate }) {
  return <button onClick={() => onUpdate("Updated")}>{data}</button>;
}

子父组件通讯

子组件通过调用父组件传递的回调函数,将数据传递回父组件。如上例中,子组件通过 onUpdate 触发父组件的状态更新。

兄弟组件通讯

通过状态提升(Lifting State Up),将共享状态定义在共同的父组件中,通过 props 传递给兄弟组件。

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

跨层级组件通讯

使用 Context API 或状态管理库(如 Redux)实现跨层级数据共享。

// 创建 Context
const DataContext = createContext();

// 提供者组件
function App() {
  const [data, setData] = useState("Initial");
  return (
    <DataContext.Provider value={{ data, setData }}>
      <ComponentA />
    </DataContext.Provider>
  );
}

// 消费者组件
function ComponentA() {
  const { data, setData } = useContext(DataContext);
  return <button onClick={() => setData("Updated")}>{data}</button>;
}

全局状态管理

使用 Redux 或 Zustand 等库管理全局状态,通过 dispatchselector 实现组件间通讯。

// Redux 示例
import { useSelector, useDispatch } from "react-redux";

function Component() {
  const data = useSelector((state) => state.data);
  const dispatch = useDispatch();
  return <button onClick={() => dispatch({ type: "UPDATE" })}>{data}</button>;
}

事件总线(Event Bus)

通过自定义事件或第三方库(如 EventEmitter)实现组件间松耦合通讯。

// 事件总线实现
const eventBus = {
  listeners: {},
  emit(event, data) {
    if (this.listeners[event]) this.listeners[event].forEach((fn) => fn(data));
  },
  on(event, callback) {
    if (!this.listeners[event]) this.listeners[event] = [];
    this.listeners[event].push(callback);
  },
};

// 组件A触发事件
eventBus.emit("update", "New Data");

// 组件B监听事件
eventBus.on("update", (data) => console.log(data));

Refs 通讯

通过 useRefforwardRef 直接访问组件实例或 DOM 节点,调用其方法或属性。

// 父组件通过 ref 调用子组件方法
function Parent() {
  const childRef = useRef();
  return (
    <>
      <Child ref={childRef} />
      <button onClick={() => childRef.current.updateData("New Data")}>Update</button>
    </>
  );
}

// 子组件暴露方法
const Child = forwardRef((props, ref) => {
  useImperativeHandle(ref, () => ({
    updateData: (data) => console.log(data),
  }));
  return <div>Child</div>;
});

react组件如何通讯

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

相关文章

vue实现水印组件

vue实现水印组件

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

实现vue组件

实现vue组件

创建 Vue 组件 Vue 组件可以通过单文件组件(.vue 文件)或直接在 JavaScript 中定义。以下是两种常见实现方式。 单文件组件方式 单文件组件包含模板、脚本和样式三部分,适合复杂…

vue实现折叠组件

vue实现折叠组件

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

组件elementui

组件elementui

ElementUI 简介 ElementUI 是一套基于 Vue.js 的桌面端组件库,由饿了么前端团队开发并开源。它提供了丰富的 UI 组件(如按钮、表单、表格等),适合快速构建企业级中后台产品。…

vue动态组件实现

vue动态组件实现

动态组件的基本用法 在Vue中,动态组件通过<component>标签和is属性实现。is属性可以绑定组件名称或组件选项对象,实现动态切换。 <template> <…

vue组件实现vmodel

vue组件实现vmodel

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