当前位置:首页 > React

react如何实现组件通信

2026-03-31 17:32:22React

父组件向子组件通信(Props)

父组件通过props将数据传递给子组件。子组件通过this.props(类组件)或直接解构props(函数组件)接收数据。

// 父组件
function Parent() {
  const message = "Hello from Parent";
  return <Child message={message} />;
}

// 子组件
function Child({ message }) {
  return <div>{message}</div>;
}

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

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

// 父组件
function Parent() {
  const handleData = (data) => {
    console.log(data);
  };
  return <Child onData={handleData} />;
}

// 子组件
function Child({ onData }) {
  const sendData = () => {
    onData("Data from Child");
  };
  return <button onClick={sendData}>Send Data</button>;
}

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

将共享状态提升到最近的共同父组件中,通过props传递数据和回调函数实现兄弟组件通信。

react如何实现组件通信

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

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

function SiblingA({ onData }) {
  return <button onClick={() => onData("Data from A")}>Send to B</button>;
}

function SiblingB({ data }) {
  return <div>Received: {data}</div>;
}

Context API跨层级通信

使用React的Context API可以在组件树中跨层级传递数据,避免props层层传递。

const MyContext = React.createContext();

function App() {
  return (
    <MyContext.Provider value="Global Data">
      <ComponentA />
    </MyContext.Provider>
  );
}

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

function ComponentB() {
  const value = useContext(MyContext);
  return <div>{value}</div>;
}

使用状态管理库(Redux/MobX)

对于大型应用,可以使用Redux或MobX等状态管理库集中管理应用状态,实现任意组件间的通信。

react如何实现组件通信

// Redux示例
import { useSelector, useDispatch } from 'react-redux';

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

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

使用自定义事件(Event Emitter)

通过事件发布订阅模式实现组件通信,适用于非父子关系的组件。

import { EventEmitter } from 'events';
const emitter = new EventEmitter();

function ComponentA() {
  const emitEvent = () => {
    emitter.emit('customEvent', 'Event Data');
  };
  return <button onClick={emitEvent}>Emit Event</button>;
}

function ComponentB() {
  const [data, setData] = useState('');
  useEffect(() => {
    const handler = (data) => setData(data);
    emitter.on('customEvent', handler);
    return () => emitter.off('customEvent', handler);
  }, []);
  return <div>Received: {data}</div>;
}

使用Refs

通过ref直接访问组件实例或DOM元素,适用于需要直接操作子组件的场景。

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

  const callChildMethod = () => {
    childRef.current.doSomething();
  };

  return (
    <>
      <Child ref={childRef} />
      <button onClick={callChildMethod}>Call Child Method</button>
    </>
  );
}

const Child = forwardRef((props, ref) => {
  useImperativeHandle(ref, () => ({
    doSomething: () => console.log('Child method called')
  }));
  return <div>Child Component</div>;
});

分享给朋友:

相关文章

vue手写签名如何实现

vue手写签名如何实现

实现 Vue 手写签名的步骤 使用 canvas 实现基础签名功能 在 Vue 项目中创建一个组件,利用 HTML5 的 canvas 元素实现手写签名功能。通过监听鼠标或触摸事件来捕获用户的绘制路径…

权限管理vue如何实现

权限管理vue如何实现

基于路由的权限控制 在Vue中可以通过路由守卫实现页面级权限控制。定义路由时添加meta字段标记权限角色: const routes = [ { path: '/admin',…

vue如何实现滤镜

vue如何实现滤镜

Vue 实现滤镜的方法 在 Vue 中实现滤镜效果可以通过多种方式,以下是常见的几种方法: 使用 CSS filter 属性 通过 CSS 的 filter 属性可以直接为元素添加滤镜效果。在 Vu…

vue如何实现排序

vue如何实现排序

实现数组排序 在Vue中可以通过计算属性或方法对数组进行排序。使用JavaScript的sort()方法结合Vue的响应式特性实现动态排序。 data() { return { item…

vue如何实现高亮

vue如何实现高亮

实现文本高亮的方法 在Vue中实现文本高亮通常可以通过以下几种方式完成: 使用v-html指令结合字符串替换 通过将需要高亮的文本部分替换为HTML标签(如<span class="highl…

react如何实现分页

react如何实现分页

实现分页的基本思路 在React中实现分页通常需要以下几个核心步骤:管理当前页码状态、计算分页数据、渲染分页控件。以下是一个典型的分页实现方法。 管理分页状态 使用React的useState钩子来…