当前位置:首页 > React

react兄弟组件如何通信

2026-01-24 11:52:13React

父子组件通信

父组件通过props向子组件传递数据,子组件通过回调函数通知父组件。这是React中最基础的通信方式,适用于直接嵌套的组件关系。

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

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

  return <Child data={data} onUpdate={handleChildUpdate} />;
}

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

Context API

使用React内置的Context实现跨层级组件通信。创建Context后,Provider组件提供数据,Consumer组件或useContext钩子消费数据。

const DataContext = createContext();

// 顶层组件
function App() {
  const [value, setValue] = useState('default');

  return (
    <DataContext.Provider value={{ value, setValue }}>
      <ComponentA />
      <ComponentB />
    </DataContext.Provider>
  );
}

// 任意子组件
function ComponentA() {
  const { value } = useContext(DataContext);
  return <div>{value}</div>;
}

function ComponentB() {
  const { setValue } = useContext(DataContext);
  return <button onClick={() => setValue('new')}>Update</button>;
}

状态管理库

Redux或MobX等状态管理库适用于复杂应用场景。这些库提供全局状态管理,所有组件都可以订阅和修改共享状态。

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

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

function ComponentB() {
  const dispatch = useDispatch();
  return (
    <button onClick={() => dispatch({ type: 'UPDATE' })}>
      Update
    </button>
  );
}

事件总线

通过自定义事件系统实现组件通信。这种方式不依赖组件层级关系,但需要手动管理订阅和取消订阅。

const eventBus = new EventEmitter();

function ComponentA() {
  const [message, setMessage] = useState('');

  useEffect(() => {
    const handler = (msg) => setMessage(msg);
    eventBus.on('message', handler);
    return () => eventBus.off('message', handler);
  }, []);

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

function ComponentB() {
  return (
    <button onClick={() => eventBus.emit('message', 'Hello')}>
      Send
    </button>
  );
}

状态提升

将共享状态提升到最近的共同祖先组件中。适用于需要共享状态的兄弟组件,通过props和回调实现数据同步。

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

  return (
    <>
      <ChildA 
        state={sharedState} 
        onStateChange={setSharedState} 
      />
      <ChildB 
        state={sharedState} 
        onStateChange={setSharedState} 
      />
    </>
  );
}

引用传递

使用forwardRef和useImperativeHandle暴露子组件方法,允许父组件直接调用子组件函数。

// 子组件
const Child = forwardRef((props, ref) => {
  useImperativeHandle(ref, () => ({
    doSomething: () => console.log('Action performed')
  }));

  return <div>Child</div>;
});

// 父组件
function Parent() {
  const childRef = useRef();

  return (
    <>
      <Child ref={childRef} />
      <button onClick={() => childRef.current.doSomething()}>
        Trigger
      </button>
    </>
  );
}

react兄弟组件如何通信

标签: 组件兄弟
分享给朋友:

相关文章

vue 组件实现

vue 组件实现

Vue 组件实现方法 单文件组件 (SFC) 使用 .vue 文件格式,包含模板、脚本和样式三部分: <template> <div class="example">{…

vue实现多级组件

vue实现多级组件

Vue 多级组件实现方法 在 Vue 中实现多级组件通常涉及父子组件通信、动态组件或递归组件等技术。以下是几种常见实现方式: 父子组件嵌套 通过逐层嵌套组件实现多级结构,适用于固定层级场景:…

vue实现倒计时组件

vue实现倒计时组件

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

vue实现下拉框组件

vue实现下拉框组件

Vue 下拉框组件实现 基础实现 创建基础下拉框组件,使用v-model实现双向数据绑定: <template> <div class="dropdown"> &…

uniapp组件写法

uniapp组件写法

Uniapp 组件的基本写法 Uniapp 的组件写法与 Vue 类似,支持单文件组件(.vue 文件)。一个基本的组件通常包含三个部分:<template>、<script>…

uniapp如何将底部导航组件化

uniapp如何将底部导航组件化

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