react 父组件调用子组件的属性或方法

前言

在vue3中,

  • 子组件会使用 defineExpose 暴露出父组件需要访问的 变量方法
  • 父组件通过 ref 函数定义子组件的 refName,并通过 refName.value.xxx 继续访问

react 中呢?

可使用 useImperativeHandleforwardRefuseRef

第一步,子组件

  • 使用 useImperativeHandle 定义要暴露出去的内容,第一个参数是 ref
  • forwardRef 包裹 App 组件后,再暴露出去
js 复制代码
import React, { useState, useImperativeHandle, forwardRef } from "react";
import { Modal, Button } from "antd";

const App = (props, ref) => {
  const [isModalOpen, setIsModalOpen] = useState(false);
  const [data, setData] = useState({});
  
  const showModal = () => {
    setIsModalOpen(true);
  };
  const handleCancel = () => {
    setIsModalOpen(false);
  };
  // 暴露给父组件访问(useImperativeHandle、forwardRef、ref组合使用)
  useImperativeHandle(ref, () => ({
    openModal: (data) => {
      showModal();
      setData(data);
    },
  }));

  return (
    <Modal
      title="查看平台详情"
      open={isModalOpen}
      onCancel={handleCancel}
      width={700}
      footer={null}
    >
      <div>
        <Button type="primary" onClick={handleOk}>
          确定
        </Button>
      </div>
    </Modal>
  );
};
const Index = forwardRef(App);
export default Index;

第二步,父组件

这一步跟vue3比较接近

  • 父组件通过 useRef 定义子组件的 ref 属性
  • 通过 refName.current.xx 再继续访问子组件暴露出的内容
js 复制代码
import React, { useRef } from "react";
import { Button } from "antd";
import Title from "../components/Title";
import DetailModal from "../components/DetailModal";

// 渲染
const App = () => {

  const detailRef = useRef();

  // 查看详情
  function handleDetail(row) {
    detailRef.current.openModal(row);
  }

  return (
    <>
      <Title title="境内平台管理">
        <Button type="primary">新建平台</Button>
      </Title>
      <DetailModal ref={detailRef} />
    </>
  );
};
export default App;
相关推荐
whinc7 分钟前
React技术周刊 2026年第18周
react.js
whinc9 分钟前
React技术周刊 2026年第14周
react.js
whinc10 分钟前
React技术周刊 2026年第15周
react.js
whinc11 分钟前
React技术周刊 2026年第16周
react.js
whinc12 分钟前
React技术周刊 2026年第17周
react.js
Lee川28 分钟前
Token 无感刷新与 Logout:前端安全会话管理实战
前端·后端·react.js
光影少年2 小时前
react16-react19类组件完整生命周期(挂载/更新/卸载)
前端·javascript·react.js
暗不需求5 小时前
一文吃透 React Context:跨层级通信的利器
前端·javascript·react.js
骑自行车的码农5 小时前
React Diff 算法的细节
react.js
Rhi6379 小时前
第 2 篇|吐槽向:那些年我们配过的环境,这次终于能跑起来了
react.js·github