当前位置:首页 > React

react如何完成组件通信

2026-01-25 10:46:35React

父子组件通信

父组件通过props向子组件传递数据。子组件通过调用父组件传递的回调函数与父组件通信。

// 父组件
function Parent() {
  const [data, setData] = useState('initial data');

  const handleChildClick = (newData) => {
    setData(newData);
  };

  return <Child data={data} onClick={handleChildClick} />;
}

// 子组件
function Child({ data, onClick }) {
  return (
    <button onClick={() => onClick('updated data')}>
      {data}
    </button>
  );
}

子父组件通信

子组件通过调用父组件传递的回调函数将数据传递回父组件。父组件可以更新自己的状态或执行其他操作。

兄弟组件通信

通过将共享状态提升到最近的共同父组件中实现兄弟组件间的通信。父组件管理状态并通过props分发给各个子组件。

function Parent() {
  const [sharedState, setSharedState] = useState('');

  return (
    <>
      <SiblingA 
        state={sharedState} 
        setState={setSharedState} 
      />
      <SiblingB 
        state={sharedState} 
        setState={setSharedState} 
      />
    </>
  );
}

Context API

对于跨多级组件的数据共享,使用Context API避免props层层传递。创建Context后,Provider提供数据,Consumer或useContext钩子消费数据。

const MyContext = createContext();

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

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

状态管理库

对于复杂应用状态管理,可使用Redux、MobX等库。这些库提供集中式状态存储和可预测的状态更新机制。

// Redux示例
const store = createStore(reducer);

function Component() {
  const state = useSelector(state => state.value);
  const dispatch = useDispatch();

  return (
    <button onClick={() => dispatch({ type: 'INCREMENT' })}>
      {state}
    </button>
  );
}

事件总线/发布订阅

创建全局事件系统,组件通过订阅和发布事件进行通信。适用于松散耦合的组件间通信。

const EventBus = new EventEmitter();

function ComponentA() {
  useEffect(() => {
    EventBus.emit('event', 'data');
  }, []);
}

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

  useEffect(() => {
    EventBus.on('event', setData);
    return () => EventBus.off('event', setData);
  }, []);

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

Refs与实例方法

通过ref获取组件实例并调用其方法。适用于需要直接访问子组件的情况。

react如何完成组件通信

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

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

  return (
    <>
      <Child ref={childRef} />
      <button onClick={handleClick}>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 实现广告组件的核心方法 数据驱动的广告内容渲染 通过 props 接收广告数据(如图片URL、跳转链接等),使用 v-bind 动态绑定属性。典型结构包含 <a> 标签嵌套 <…

vue radio组件实现

vue radio组件实现

Vue Radio 组件实现 在 Vue 中实现 Radio 组件可以通过原生 HTML 的 <input type="radio"> 结合 Vue 的响应式特性,或者使用第三方 UI 库…

vue哪个组件实现动画

vue哪个组件实现动画

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

elementui组件

elementui组件

ElementUI 组件概述 ElementUI 是一套基于 Vue.js 的桌面端组件库,提供丰富的 UI 组件,适用于快速开发中后台系统。以下是其核心组件分类及典型用法。 基础组件 Button…

uniapp倒计时组件

uniapp倒计时组件

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

uniapp如何将底部导航组件化

uniapp如何将底部导航组件化

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