当前位置:首页 > React

react如何实现组件通信

2026-03-10 18:06:53React

父子组件通信

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

// 父组件
function Parent() {
  const [data, setData] = useState('初始数据');
  const handleChildData = (childData) => {
    setData(childData);
  };
  return <Child onDataUpdate={handleChildData} />;
}

// 子组件
function Child({ onDataUpdate }) {
  const sendData = () => {
    onDataUpdate('子组件数据');
  };
  return <button onClick={sendData}>传递数据</button>;
}

兄弟组件通信

通过状态提升(Lifting State Up)将共享状态提升到最近的共同父组件中,父组件通过props分发数据给子组件。

react如何实现组件通信

function Parent() {
  const [sharedData, setSharedData] = useState('');
  return (
    <>
      <SiblingA onDataUpdate={setSharedData} />
      <SiblingB data={sharedData} />
    </>
  );
}

function SiblingA({ onDataUpdate }) {
  return <button onClick={() => onDataUpdate('A的数据')}>更新数据</button>;
}

function SiblingB({ data }) {
  return <div>接收到的数据: {data}</div>;
}

跨层级组件通信

使用Context API实现跨层级数据传递,适用于深层嵌套组件或全局状态管理。

const DataContext = 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 <button onClick={() => setData('新数据')}>{data}</button>;
}

事件总线(Event Bus)

通过自定义事件实现任意组件间通信,适用于非父子关系的复杂场景。

react如何实现组件通信

// 事件总线实现
const eventBus = {
  listeners: {},
  emit(event, data) {
    if (this.listeners[event]) {
      this.listeners[event].forEach(cb => cb(data));
    }
  },
  on(event, callback) {
    if (!this.listeners[event]) this.listeners[event] = [];
    this.listeners[event].push(callback);
  }
};

// 组件A触发事件
function ComponentA() {
  const emitData = () => {
    eventBus.emit('dataEvent', '来自A的数据');
  };
  return <button onClick={emitData}>发送事件</button>;
}

// 组件B监听事件
function ComponentB() {
  const [data, setData] = useState('');
  useEffect(() => {
    eventBus.on('dataEvent', setData);
    return () => eventBus.off('dataEvent'); // 清理
  }, []);
  return <div>接收事件数据: {data}</div>;
}

状态管理库(Redux/Zustand)

使用Redux或Zustand等库集中管理状态,实现高效跨组件通信。

// Redux示例
import { createSlice, configureStore } from '@reduxjs/toolkit';

const dataSlice = createSlice({
  name: 'data',
  initialState: { value: '' },
  reducers: {
    updateData: (state, action) => {
      state.value = action.payload;
    }
  }
});

const store = configureStore({ reducer: dataSlice.reducer });

function ComponentA() {
  const dispatch = useDispatch();
  return (
    <button onClick={() => dispatch(dataSlice.actions.updateData('A的数据'))}>
      更新Redux状态
    </button>
  );
}

function ComponentB() {
  const data = useSelector(state => state.data.value);
  return <div>Redux数据: {data}</div>;
}

使用Refs

通过ref直接访问组件实例或DOM节点,适用于命令式操作。

function Parent() {
  const childRef = useRef();
  const callChildMethod = () => {
    childRef.current.updateData('父组件调用');
  };
  return (
    <>
      <Child ref={childRef} />
      <button onClick={callChildMethod}>触发子组件方法</button>
    </>
  );
}

const Child = forwardRef((props, ref) => {
  useImperativeHandle(ref, () => ({
    updateData: (data) => console.log(data)
  }));
  return <div>子组件</div>;
});

分享给朋友:

相关文章

uniapp如何将底部导航组件化

uniapp如何将底部导航组件化

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

vue如何实现重新实现主题

vue如何实现重新实现主题

Vue 主题切换的实现方法 使用 CSS 变量动态切换主题 定义主题相关的 CSS 变量,通过修改这些变量实现主题切换。在根元素(如 :root)中定义默认主题的变量,在特定类名下定义其他主题的变量。…

vue如何实现原理

vue如何实现原理

Vue 实现原理的核心机制 Vue.js 的核心实现原理基于响应式系统、虚拟 DOM 和组件化设计。以下是关键机制的详细解析: 响应式系统 Vue 通过 Object.defineProperty(…

vue实现折叠组件

vue实现折叠组件

实现折叠组件的基本思路 在Vue中实现折叠组件通常需要利用动态绑定和条件渲染。核心是通过控制一个布尔值状态来决定内容是否显示,并添加过渡动画提升用户体验。 基础实现方法 使用v-show或v-if控…

java如何实现异步

java如何实现异步

Java实现异步的方法 Java中实现异步编程可以通过多种方式,每种方式适用于不同的场景和需求。以下是常见的实现方法: 使用Thread类 创建新线程执行异步任务是最基础的方式。通过继承Thread…

如何实现翻页式h5

如何实现翻页式h5

翻页式H5的实现方法 翻页式H5通常指通过滑动或点击切换页面的交互形式,常用于营销活动、产品展示等场景。以下是几种常见的实现方式: 使用HTML5和CSS3实现基础翻页 通过CSS3的transfo…