当前位置:首页 > 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 传递给兄弟组件。

react组件如何通讯

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 实现组件间通讯。

react组件如何通讯

// 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>;
});

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

相关文章

vue实现倒计时组件

vue实现倒计时组件

Vue 倒计时组件实现 核心思路 通过 setInterval 或 setTimeout 实现时间递减,结合 Vue 的响应式数据更新 UI。需注意组件销毁时清除定时器。 基础实现方案 模板部分…

vue 实现组件刷新

vue 实现组件刷新

组件局部刷新 在Vue中实现组件刷新可以通过强制重新渲染组件来实现。常用的方法有以下几种: 使用v-if指令 通过切换v-if条件触发组件的销毁和重建 <template> <…

vue实现列表组件

vue实现列表组件

Vue 列表组件实现方法 基础列表渲染 使用 v-for 指令渲染数组数据,需配合 :key 提升性能: <template> <ul> <li v-for…

vue 实现树组件

vue 实现树组件

Vue 树形组件实现 基础树形结构实现 使用递归组件实现树形结构,核心是通过组件自身调用自身渲染嵌套数据。 <template> <ul> <li v-fo…

vue 滑杆组件实现

vue 滑杆组件实现

实现基础滑杆组件 使用Vue的v-model和原生<input type="range">实现基础功能: <template> <div> <i…

vue实现树形组件

vue实现树形组件

实现树形组件的基本思路 在Vue中实现树形组件通常涉及递归组件和动态数据渲染。核心是通过组件自身调用自身,逐层渲染嵌套的节点数据。 定义树形数据结构 树形数据通常是一个包含children属性的对象…