当前位置:首页 > 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 radio组件实现

vue radio组件实现

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

uniapp 分页组件

uniapp 分页组件

uniapp 分页组件实现方法 在uniapp中实现分页功能,可以通过自定义组件或使用第三方组件库完成。以下是几种常见实现方式: 自定义分页组件 创建一个名为uni-pagination的组件,模板…

vue 实现组件刷新

vue 实现组件刷新

组件局部刷新 在Vue中实现组件刷新可以通过强制重新渲染组件来实现。常用的方法有以下几种: 使用v-if指令 通过切换v-if条件触发组件的销毁和重建 <template> &…

如何缓存react组件

如何缓存react组件

缓存React组件的方法 React.memo 使用React.memo对函数组件进行浅比较缓存,避免不必要的重新渲染。适用于props不变的场景。 const MemoizedComponen…

vue实现盖章组件

vue实现盖章组件

实现Vue盖章组件的步骤 组件结构设计 创建一个Vue组件,包含画布元素和必要的控制按钮。画布用于显示盖章效果,按钮用于触发盖章操作。组件需要接收图片和盖章位置等参数。 <template&g…

vue实现父子组件

vue实现父子组件

Vue 父子组件通信实现方式 1. 父组件向子组件传递数据(Props) 父组件通过 props 向子组件传递数据,子组件通过 props 接收数据。 父组件模板: <template&…