当前位置:首页 > 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暴露子组件方法,允许父组件直接调用子组件函数。

react兄弟组件如何通信

// 子组件
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>
    </>
  );
}

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

相关文章

vue实现拖拽实现组件嵌套

vue实现拖拽实现组件嵌套

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

如何缓存react组件

如何缓存react组件

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

vue实现search组件

vue实现search组件

Vue 实现搜索组件 基础实现 创建一个基础的搜索组件需要包含输入框和搜索逻辑。以下是一个简单的实现示例: <template> <div class="search-cont…

vue 实现table组件

vue 实现table组件

Vue 实现 Table 组件 基础表格结构 使用 Vue 的模板语法构建表格的基本框架,通过 v-for 动态渲染数据。 <template> <table>…

vue实现图片组件

vue实现图片组件

Vue 实现图片组件的方法 基础图片组件实现 创建一个基础的图片组件,支持动态传入图片路径和替代文本。在Vue项目中新建一个ImageComponent.vue文件: <template>…

vue基础组件实现

vue基础组件实现

Vue 基础组件实现 组件定义 使用 Vue.component 全局注册或局部注册组件。全局注册适合通用组件,局部注册适合特定页面使用的组件。 // 全局注册 Vue.component('my-…