当前位置:首页 > React

react组件如何通信

2026-03-31 01:19:21React

React 组件通信方法

父子组件通信(Props)

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

// 父组件
function Parent() {
  const [data, setData] = useState("Hello");
  const handleChildData = (childData) => {
    setData(childData);
  };

  return <Child data={data} onChildData={handleChildData} />;
}

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

子父组件通信(回调函数)

子组件通过父组件传递的回调函数将数据传回父组件,如上例中的 onChildData

兄弟组件通信(状态提升)

将共享状态提升到最近的共同父组件中,通过 props 传递给兄弟组件。

react组件如何通信

function Parent() {
  const [sharedData, setSharedData] = useState("Shared");

  return (
    <>
      <SiblingA data={sharedData} />
      <SiblingB onDataChange={setSharedData} />
    </>
  );
}

跨层级通信(Context API)

使用 React.createContextuseContext 实现跨层级组件通信。

const DataContext = React.createContext();

function App() {
  const [data, setData] = useState("Context Data");
  return (
    <DataContext.Provider value={{ data, setData }}>
      <ComponentA />
    </DataContext.Provider>
  );
}

function ComponentA() {
  return <ComponentB />;
}

function ComponentB() {
  const { data, setData } = useContext(DataContext);
  return <button onClick={() => setData("Updated")}>{data}</button>;
}

全局状态管理(Redux/Zustand)

使用第三方状态管理库(如 Redux 或 Zustand)实现复杂应用的全局状态共享。

react组件如何通信

// Redux 示例
import { createSlice, configureStore } from "@reduxjs/toolkit";

const dataSlice = createSlice({
  name: "data",
  initialState: { value: "Redux Data" },
  reducers: {
    update: (state, action) => {
      state.value = action.payload;
    },
  },
});

const store = configureStore({ reducer: dataSlice.reducer });

function Component() {
  const data = useSelector((state) => state.data.value);
  const dispatch = useDispatch();
  return (
    <button onClick={() => dispatch(dataSlice.actions.update("New Data"))}>
      {data}
    </button>
  );
}

事件总线(Event Emitter)

通过自定义事件系统实现任意组件间通信(适用于非 React 生态的集成场景)。

const events = new EventEmitter();

function ComponentA() {
  useEffect(() => {
    events.emit("event", "Event Data");
  }, []);
}

function ComponentB() {
  const [data, setData] = useState("");
  useEffect(() => {
    events.on("event", setData);
    return () => events.off("event", setData);
  }, []);
  return <div>{data}</div>;
}

Refs 和 DOM 操作

通过 useRef 直接访问组件实例或 DOM 节点(慎用,破坏 React 数据流)。

function Parent() {
  const childRef = useRef();
  const handleClick = () => {
    childRef.current.doSomething();
  };
  return (
    <>
      <Child ref={childRef} />
      <button onClick={handleClick}>Call Child</button>
    </>
  );
}

const Child = forwardRef((props, ref) => {
  useImperativeHandle(ref, () => ({
    doSomething: () => console.log("Child Method"),
  }));
  return <div>Child</div>;
});

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

相关文章

uniapp组件

uniapp组件

uniapp组件基础概念 uniapp的组件系统基于Vue.js,支持跨平台开发(H5、小程序、App等)。组件分为内置基础组件(如<view>、<button>)和自定义组件…

vue实现水印组件

vue实现水印组件

Vue 水印组件的实现方法 使用Canvas绘制水印 在Vue组件中通过Canvas动态生成水印图案,将其作为背景添加到目标元素上。 <template> <div ref="…

vue实现秒表组件

vue实现秒表组件

实现秒表组件的基本思路 使用Vue实现秒表组件需要管理时间状态、控制计时器的启动/暂停/重置功能,并通过计算属性动态显示格式化时间。核心逻辑包括利用setInterval更新计时数据,并通过生命周期钩…

vue 实现toast组件

vue 实现toast组件

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

vue实现组件缓存

vue实现组件缓存

Vue 组件缓存的实现方法 在 Vue 中实现组件缓存通常使用 <keep-alive> 内置组件,它可以缓存不活动的组件实例,避免重复渲染和销毁。 基本用法 <keep-aliv…

vue实现头像组件

vue实现头像组件

Vue 头像组件实现 基础实现 创建一个可复用的头像组件,支持图片链接或文字缩写显示: <template> <div class="avatar" :style="ava…