Antd Modal组件的封装 Modal.show

antd的modal组件,使用的时候,一般都需要手动去修改visible属性,创建编辑共用的时候,需额外维护数据。然后就想着封装一套不需要维护数据的Modal

1、onOk返回promise的时候,执行resolve会关闭弹窗,执行reject不关闭弹窗。不返回Promise的时候,点击会关闭弹窗
2、content 放Modal里面的JSX
3、该组件的api和Modal的api一样
使用示例:

const handleClick = () => {
  const { hide } = Modal.show({
    title: '新建',
    content: (
      <div>456</div>
    ),
    cancelText: '取消',
    okText: '确认',
    onOk: () => {
      // 可不需要返回Promise
      return new Promise((resolve, reject) => {
        reject();
      })
    },
    onCancel: () => {
      hide();
    }
  })
}
 
封装源码
import React, { forwardRef } from 'react';
import ReactDOM from 'react-dom';
import { Modal as AntdModal } from 'antd';

const Modal = (props) => {
  const { visible, children, ...rest } = props;
  return (
    <>
      <AntdModal
        {...rest}
        visible={visible}
      >
        {
          typeof children === 'object' ? React.Children.map(children, child => React.cloneElement(child)) : children
        }
      </AntdModal>
    </>
  )
}

const forwardRefModal = forwardRef(Modal);
export default forwardRefModal;

forwardRefModal.show = (props) => {
  const { title, content, ...rest } = props;
  let element = document.createElement('div');
  document.body.appendChild(element);
  const onClose = () => {
    ReactDOM.render(getModalNode({ visible: false }), element)
  }
  const afterClose = () => {
    ReactDOM.unmountComponentAtNode(element);
    element.remove();
    element = null;
    if (props.afterClose && typeof props.afterClose === 'function') {
      props.afterClose();
    }
  }
  const onOk = () => {
    if (props.onOk && typeof props.onOk === 'function') {
      const maybePromise = props.onOk();
      if (maybePromise instanceof Promise) {
        maybePromise
          .then(() => {
            onClose();
          })
      } else {
        onClose();
      }
      return;
    }
    onClose();
  }
  const getModalNode = ({ visible }) => {
    let modalNode = null;
    modalNode = (
      <Modal
        {...rest}
        visible={visible}
        title={title}
        afterClose={afterClose}
        onOk={onOk}
      >
        {content}
      </Modal>
    )
    return modalNode;
  }
  ReactDOM.render(getModalNode({ visible: true }), element)
  return {
    hide: onClose
  }
}

 

posted @ 2022-10-26 14:23  浪浪浪浪浪浪浪浪  阅读(1037)  评论(0编辑  收藏  举报