react-modal-manager: 项目接入

一个自己常用的 modal 管理组件接入

01 安装依赖

安装相关依赖

# 项目
yarn add @jswork/react-modal-manager
# 开发依赖
yarn add @jswork/scan-modules

02 准备目录

准备 providers/modal-manager

mkdir -p ./src/shared/providers

准备 modals 目录

mkdir -p ./src/shared/modals

03 modal-manager 示例

参考代码 ./src/shared/providers/modal-manager.tsx

import { scanVite } from '@jswork/scan-modules';
import ReactModalManager from '@jswork/react-modal-manager';
import { PropsWithChildren } from 'react';

/* prettier-ignore */
const moduleModalFiles = import.meta.glob(['../modals/*.tsx', '../modals/**/index.tsx'], { eager: true });
const modulesModal = scanVite(moduleModalFiles, { modules: '/modals/' });

const Provider = (props: PropsWithChildren) => {
  return (
    <ReactModalManager modules={modulesModal} harmony>
      {props.children}
    </ReactModalManager>
  );
};

export default Provider;

04 测试 modal

另一个目录:modals/a-modal.tsx

/**
 * @Author: aric 1290657123@qq.com
 * @Date: 2025-04-09 13:54:37
 * @LastEditors: aric 1290657123@qq.com
 * @LastEditTime: 2025-04-09 14:01:34
 */
import { FC } from 'react';
import { Modal } from 'antd';

const Anonymous: FC = () => {
  const { visible, data } = nx.$modal.value('a-modal');

  return (
    <Modal title="a-modal" open={visible} onCancel={nx.$modal.dismissAll}>
      <h1 className="text-3xl">Hello World</h1>
      <p className="text-2xl">surprise!</p>
    </Modal>
  );
};

export default Anonymous;

05 开启/使用 modal

打开 modal

<Button
  className="w-full"
  onClick={() => nx.$modal.present('a-modal')}>
  surprise
</Button>

06 整体目录结构

示例结构

❯ tree -L 2 shared/modals shared/providers
shared/modals
└── a-modal.tsx
shared/providers
└── modal-manager.tsx
react modal manager