当前位置:首页 > 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 或组件实例的场景。

react组件如何通信

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

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

相关文章

vue实现穿梭框树组件

vue实现穿梭框树组件

Vue 穿梭框树组件实现 穿梭框树组件通常结合了树形结构和穿梭框功能,允许用户在左右两栏之间移动树节点数据。以下是基于 Vue 的实现方案: 核心功能设计 数据结构 树形数据通常采用嵌套结构,例如:…

uniapp倒计时组件

uniapp倒计时组件

uniapp倒计时组件实现方法 使用内置组件实现 uniapp提供了<countdown>组件用于倒计时功能,支持自定义格式和样式。示例代码如下: <countdown :t…

vue 实现组件刷新

vue 实现组件刷新

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

vue实现水印组件

vue实现水印组件

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

vue实现父子组件

vue实现父子组件

Vue 父子组件通信实现方式 1. 父组件向子组件传递数据(Props) 父组件通过 props 向子组件传递数据,子组件通过 props 接收数据。 父组件模板: <template>…

vue实现搜索组件

vue实现搜索组件

Vue 实现搜索组件的方法 基础搜索组件实现 创建基础搜索组件需要包含输入框和搜索按钮。在Vue中可以使用v-model绑定输入值,通过@click或@keyup.enter触发搜索。 <te…