React 父组件调用子组件的方法

在 React 中,父组件可以通过引用子组件的实例来调用子组件的方法。

1、通过 ref 和 forwardRef 来实现。

子组件:

使用 React.forwardRef 接收 ref。

使用 React.useImperativeHandle 暴露需要被调用的方法。
父组件:

使用 useRef 创建一个引用 childRef。

在点击事件时,调用子组件的方法。

javascript 复制代码
import React, { useRef } from 'react';

// 定义子组件
const ChildComponent = React.forwardRef((props, ref) => {
  // 定义一个方法
  const childMethod = () => {
    alert('子组件方法被调用!');
  };

  // 将子组件的方法暴露给父组件
  React.useImperativeHandle(ref, () => ({
    childMethod,
  }));

  return <div>这是子组件</div>;
});

// 定义父组件
const ParentComponent = () => {
  // 创建一个ref
  const childRef = useRef(null);

  // 调用子组件的方法
  const callChildMethod = () => {
    if (childRef.current) {
      childRef.current.childMethod();
    }
  };

  return (
    <div>
      <h1>父组件</h1>
      <ChildComponent ref={childRef} />
      <button onClick={callChildMethod}>调用子组件方法</button>
    </div>
  );
};

// 渲染父组件
export default ParentComponent;

2、通过 Props 传递回调函数

父组件可以传递一个回调函数给子组件,子组件通过调用这个函数来通知父组件发生了什么。

javascript 复制代码
import React from 'react';

// 定义子组件
const ChildComponent = ({ onChildAction }) => {
  const handleClick = () => {
    onChildAction();
  };

  return (
    <div>
      <button onClick={handleClick}>调用父组件方法</button>
    </div>
  );
};

// 定义父组件
const ParentComponent = () => {
  const handleChildAction = () => {
    alert('子组件调用了父组件的方法!');
  };

  return (
    <div>
      <h1>父组件</h1>
      <ChildComponent onChildAction={handleChildAction} />
    </div>
  );
};

// 渲染父组件
export default ParentComponent;

3、使用 Context API

通过 Context API,可以在组件树中传递值,使得深层嵌套的组件也能访问到父组件的方法。

javascript 复制代码
import React, { createContext, useContext } from 'react';

// 创建上下文
const MyContext = createContext();

// 定义子组件
const ChildComponent = () => {
  const { handleChildAction } = useContext(MyContext);

  return (
    <div>
      <button onClick={handleChildAction}>调用父组件方法</button>
    </div>
  );
};

// 定义父组件
const ParentComponent = () => {
  const handleChildAction = () => {
    alert('子组件调用了父组件的方法!');
  };

  return (
    <MyContext.Provider value={{ handleChildAction }}>
      <h1>父组件</h1>
      <ChildComponent />
    </MyContext.Provider>
  );
};

// 渲染父组件
export default ParentComponent;

4、 通过状态管理库(如 Redux)

应用中使用了 Redux 或其他状态管理库,也可以利用它们来管理父子组件之间的状态和方法。

相关推荐
css趣多多10 分钟前
ctx 上下文对象控制新增 / 编辑表单显示隐藏的逻辑
前端
lbb 小魔仙16 分钟前
【HarmonyOS实战】React Native 表单实战:自定义 useReactHookForm 高性能验证
javascript·react native·react.js
_codemonster17 分钟前
Vue的三种使用方式对比
前端·javascript·vue.js
寻找奶酪的mouse17 分钟前
30岁技术人对职业和生活的思考
前端·后端·年终总结
梦想很大很大25 分钟前
使用 Go + Gin + Fx 构建工程化后端服务模板(gin-app 实践)
前端·后端·go
We་ct27 分钟前
LeetCode 56. 合并区间:区间重叠问题的核心解法与代码解析
前端·算法·leetcode·typescript
张3蜂34 分钟前
深入理解 Python 的 frozenset:为什么要有“不可变集合”?
前端·python·spring
无小道34 分钟前
Qt——事件简单介绍
开发语言·前端·qt
广州华水科技36 分钟前
GNSS与单北斗变形监测技术的应用现状分析与未来发展方向
前端
code_YuJun1 小时前
corepack 作用
前端