当前位置: 首页 > 知识库问答 >
问题:

前端 - 如何二次封装antd modal并且通过方法调用?

许茂才
2024-07-15

如何二次封装antd modal并且在父组件中通过方法调用?
类似下方这样的调用方式

//显示
 TestModal.show({
      title: '标题',
      content: '这是一个通过 API 调用的弹窗',
      onOk: () => {
        console.log('确定按钮被点击');
      },
      onCancel: () => {
        console.log('取消按钮被点击');
      },
    });

共有2个答案

薛征
2024-07-15

https://ant.design/components/modal-cn
官方有api直接用

狄宗清
2024-07-15

要二次封装Ant Design(antd)的Modal组件并在父组件中通过方法调用,你可以创建一个新的React组件(例如TestModal),然后在该组件内部使用antdModal组件。此外,你需要使用React的状态和props或者一些全局状态管理库(如Redux或MobX)来控制Modal的显示和隐藏,以及传递props给Modal。

不过,为了简单起见,我们可以使用React的useState和useEffect来管理Modal的显示,并通过一个静态方法来显示Modal。以下是一个基本的实现示例:

import React, { useState, useEffect } from 'react';
import { Modal, Button } from 'antd';

// 定义Modal的配置props类型
interface ModalProps {
  title: string;
  content: React.ReactNode;
  onOk: () => void;
  onCancel: () => void;
}

// 定义TestModal组件
const TestModal: React.FC<{}> & { show: (props: ModalProps) => void } = (props) => {
  const [visible, setVisible] = useState(false);
  const [modalProps, setModalProps] = useState<ModalProps | null>(null);

  // 显示Modal的方法
  const showModal = (newProps: ModalProps) => {
    setVisible(true);
    setModalProps(newProps);
  };

  // 隐藏Modal的方法
  const hideModal = () => {
    setVisible(false);
  };

  // 使用useEffect监听modalProps的变化并在变化时处理
  useEffect(() => {
    if (modalProps && visible) {
      // 当modalProps不为null且visible为true时,Modal会显示
      return () => {
        // 当Modal即将卸载时,可以清理一些副作用
      };
    }
  }, [modalProps, visible]);

  // 渲染Modal
  if (visible && modalProps) {
    return (
      <Modal
        title={modalProps.title}
        visible={visible}
        onOk={modalProps.onOk}
        onCancel={modalProps.onCancel || hideModal}
        afterClose={hideModal} // Modal完全关闭后的回调
      >
        {modalProps.content}
      </Modal>
    );
  }

  // 暴露一个方法静态用于在外部调用
  TestModal.show = showModal;

  // 注意:这里TestModal组件不渲染任何内容,因为Modal的渲染逻辑在if语句中
  return null;
};

export default TestModal;

// 在父组件中使用
// ...
// 假设TestModal已经被正确导入
TestModal.show({
  title: '标题',
  content: '这是一个通过 API 调用的弹窗',
  onOk: () => {
    console.log('确定按钮被点击');
  },
  onCancel: () => {
    console.log('取消按钮被点击');
  },
});
// ...

注意,此示例中TestModal组件没有渲染任何内容,因为它是一个控制Modal显示和隐藏的逻辑容器。实际的Modal渲染逻辑是在if (visible && modalProps)语句中进行的。同时,我们通过将showModal方法作为静态属性添加到TestModal上,使得我们可以在组件外部直接调用该方法来显示Modal。

这种方法的一个限制是,它要求TestModal组件被正确导入并在其父组件的范围内被使用。如果你想要一个更加全局的Modal管理方式,你可能需要考虑使用React Context或Redux等状态管理库。

 类似资料:
  • 父组件: 子组件CustomTree : 如何在父组件调用el-tree中的getNode方法?

  • 关于 axios 二次封装方法的问题 通过 class 创建多个实例 仅通过 axios 创建一个实例 哪种方法更好些呢?或者大家有更好的封装思路吗? 看了一些博客,关于用 class 包装的 axios, 给出来的好处是 不同的服务可以加不同的拦截器,我刚工作不久,不知道有什么场景需要用到这种需求。我更偏向于第二种方法,感觉我接触到的服务,只需要切换一下 baseUrl,并没有别的需求了。

  • 本文向大家介绍你有二次封装过ElementUI组件吗?相关面试题,主要包含被问及你有二次封装过ElementUI组件吗?时的应答技巧和注意事项,需要的朋友参考一下 有啊! 类似于分页, 表格, 毕竟每个项目的这些东西, 比如pageSize, size, 这些在每个项目基本都是统一的, 设置起来会有四五个参数是固定的, 我不可能每次使用的时候都设置一次

  • 大佬们,如何在vue的项目中封装函数通用,比如最少两个组件共用一套方法。有推荐的吗

  • 我正在使用这种方法,但它不适用于第一个片段,但在从第二个片段滑动到第一个片段时,它工作良好。请帮我做这件事。谢谢

  • 我有一个包含REST服务的Java Spring Boot后端应用程序。就在Spring Boot project的主文件夹中,我有一个React应用程序用于前端。我可以运行Spring Boot应用程序并成功访问所有endpoint。我可以运行React应用程序,它也能工作。但现在我想创建一个可执行的jar文件,并将其作为一个应用程序运行,而不是两个应用程序。 我创建了一个可执行的fat jar