当前位置:首页 > 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分发数据给子组件。

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)

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

// 事件总线实现
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节点,适用于命令式操作。

react如何实现组件通信

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

分享给朋友:

相关文章

vue实现拖拽实现组件嵌套

vue实现拖拽实现组件嵌套

Vue 拖拽实现组件嵌套 使用 Vue 实现拖拽组件嵌套功能可以通过原生 HTML5 拖拽 API 或第三方库如 vuedraggable 实现。以下是两种方法的详细说明: 使用 HTML5 拖拽…

vue实现倒计时组件

vue实现倒计时组件

Vue 倒计时组件实现 核心思路 通过 setInterval 或 setTimeout 实现时间递减,结合 Vue 的响应式数据更新 UI。需注意组件销毁时清除定时器。 基础实现方案 模板部分…

Vue组件实现方法

Vue组件实现方法

Vue组件的基本实现 Vue组件是Vue.js的核心概念之一,允许将UI拆分为独立可复用的代码片段。组件的实现方式有多种,以下是常见的几种方法。 单文件组件(SFC) 单文件组件以.vue为后缀,将…

react如何实现录音

react如何实现录音

使用React实现录音功能 在React中实现录音功能通常需要借助浏览器的MediaRecorder API。以下是实现步骤: 获取用户麦克风权限 需要请求用户授权访问麦克风设备,使用navigat…

vue如何实现轮播

vue如何实现轮播

使用 Vue 实现轮播 使用第三方库(推荐) Vue 生态中有许多成熟的轮播组件库,例如 vue-awesome-swiper 或 swiper。以下是使用 vue-awesome-swiper 的示…

如何实现vue验证

如何实现vue验证

Vue 表单验证的实现方法 Vue 表单验证可以通过多种方式实现,包括内置指令、第三方库和自定义验证逻辑。以下是几种常见的方法: 使用 Vue 内置指令进行基础验证 Vue 提供了 v-model…