当前位置:首页 > React

react组件如何通信

2026-02-26 08:12:08React

父子组件通信

父组件通过 props 向子组件传递数据,子组件通过回调函数(如 onChange)向父组件传递数据。

// 父组件
function Parent() {
  const [value, setValue] = useState("");

  return <Child value={value} onChange={(newValue) => setValue(newValue)} />;
}

// 子组件
function Child({ value, onChange }) {
  return <input value={value} onChange={(e) => onChange(e.target.value)} />;
}

兄弟组件通信

通过 状态提升 将共享状态提升至共同的父组件,再通过 props 传递数据和方法。

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

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

跨层级组件通信(Context API)

使用 React.createContextuseContext 实现跨层级数据传递,避免逐层传递 props。

const DataContext = React.createContext();

function App() {
  const [data, setData] = useState("");

  return (
    <DataContext.Provider value={{ data, setData }}>
      <ComponentA />
    </DataContext.Provider>
  );
}

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

function ComponentB() {
  const { data, setData } = useContext(DataContext);
  return <input value={data} onChange={(e) => setData(e.target.value)} />;
}

全局状态管理(Redux / Zustand)

使用第三方库(如 Redux 或 Zustand)管理全局状态,适用于复杂应用。

Redux 示例:

// store.js
import { createStore } from "redux";

const reducer = (state = "", action) => {
  switch (action.type) {
    case "UPDATE_DATA":
      return action.payload;
    default:
      return state;
  }
};

const store = createStore(reducer);

// ComponentA.js
import { useDispatch } from "react-redux";

function ComponentA() {
  const dispatch = useDispatch();
  return (
    <button onClick={() => dispatch({ type: "UPDATE_DATA", payload: "New Data" })}>
      Update Data
    </button>
  );
}

// ComponentB.js
import { useSelector } from "react-redux";

function ComponentB() {
  const data = useSelector((state) => state);
  return <div>{data}</div>;
}

事件总线(Event Emitter)

通过自定义事件或第三方库(如 events)实现组件间通信,适用于非父子关系的组件。

import { EventEmitter } from "events";
const eventBus = new EventEmitter();

function ComponentA() {
  const handleClick = () => {
    eventBus.emit("customEvent", "Data from A");
  };
  return <button onClick={handleClick}>Send Event</button>;
}

function ComponentB() {
  const [data, setData] = useState("");

  useEffect(() => {
    const handler = (payload) => setData(payload);
    eventBus.on("customEvent", handler);
    return () => eventBus.off("customEvent", handler);
  }, []);

  return <div>{data}</div>;
}

使用 Refs 直接访问组件

通过 useRefforwardRef 直接调用子组件方法,适用于需要直接操作 DOM 或组件实例的场景。

const Child = forwardRef((props, ref) => {
  const inputRef = useRef();

  useImperativeHandle(ref, () => ({
    focus: () => inputRef.current.focus(),
  }));

  return <input ref={inputRef} />;
});

function Parent() {
  const childRef = useRef();

  return (
    <>
      <Child ref={childRef} />
      <button onClick={() => childRef.current.focus()}>Focus Input</button>
    </>
  );
}

react组件如何通信

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

相关文章

uniapp 分页组件

uniapp 分页组件

uniapp 分页组件实现方法 在uniapp中实现分页功能,可以通过自定义组件或使用第三方组件库完成。以下是几种常见实现方式: 自定义分页组件 创建一个名为uni-pagination的组件,模板…

vue实现日历组件

vue实现日历组件

Vue 日历组件实现步骤 基础结构搭建 使用Vue 3的Composition API或Options API创建组件框架。核心结构包括年份/月份切换按钮、星期标题栏和日期网格。 <temp…

vue 动态组件实现

vue 动态组件实现

vue 动态组件实现 Vue 的动态组件功能允许根据条件或用户交互动态切换不同的组件,主要通过 <component> 标签和 is 属性实现。 基本用法 通过 is 属性绑定组件名或…

vue 实现动态组件

vue 实现动态组件

Vue 动态组件的实现方法 在 Vue 中,可以通过 <component> 标签结合 is 属性实现动态组件切换。以下是具体实现方式: 使用 is 属性绑定组件名 <templ…

vue实现拖拽组件

vue实现拖拽组件

Vue 实现拖拽组件的方法 使用 HTML5 原生拖拽 API HTML5 提供了原生的拖拽 API,可以通过 draggable 属性、dragstart、dragend、dragover 和 dr…

vue实现抽屉组件

vue实现抽屉组件

实现抽屉组件的基本思路 抽屉组件通常用于从屏幕边缘滑出的交互式面板,常见于移动端或后台管理系统。Vue中可以通过动态CSS和过渡动画实现这一效果。 基础HTML结构 <template>…