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

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)实现复杂应用的全局状态共享。

// 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 数据流)。

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

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

相关文章

vue实现组件循环

vue实现组件循环

Vue 实现组件循环的方法 在 Vue 中,可以通过 v-for 指令实现组件的循环渲染。以下是几种常见的实现方式: 使用 v-for 渲染数组 通过 v-for 遍历数组数据,动态生成组件列表:…

vue哪个组件实现动画

vue哪个组件实现动画

在Vue中实现动画效果,可以通过以下组件和方法实现: Vue内置动画组件 Vue提供了<transition>和<transition-group>两个内置组件,用于处理进入…

uniapp如何将底部导航组件化

uniapp如何将底部导航组件化

在 uniapp 中将底部导航组件化 将底部导航组件化可以提高代码复用性和维护性。以下是具体实现方法: 创建自定义底部导航组件 新建一个组件文件,例如 tab-bar.vue,放置在 compon…

uniapp 分页组件

uniapp 分页组件

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

如何判断react组件

如何判断react组件

判断 React 组件的依据 React 组件的判断通常基于其定义方式、功能特性和代码结构。以下是几种常见的判断方法: 函数组件与类组件 函数组件是通过 JavaScript 函数定义的,接收 pr…

vue实现递归组件

vue实现递归组件

递归组件的实现方法 在Vue中实现递归组件主要依靠组件调用自身的能力。以下是几种常见的实现方式: 使用组件name属性 通过组件的name属性实现递归调用是最简单的方式: <template…