1. import { useCallback, useEffect, useState } from 'react';
  2. import { merge } from 'lodash';
  3. import { Modal } from 'antd';
  4. import { ModalFuncProps } from 'antd/lib/modal';
  5. export type ModalType = 'info' | 'success' | 'error' | 'warning' | 'confirm';
  6. export interface Opts extends ModalFuncProps {
  7. destroyOnClose?: boolean;
  8. }
  9. export interface ModalStateCallback {
  10. destroy: () => void;
  11. update: (newConfig: ModalFuncProps) => void;
  12. }
  13. const defaultOpts = {
  14. okText: '确定',
  15. cancelText: '取消',
  16. maskClosable: true,
  17. };
  18. const useConfirm = (type: Partial<ModalType>, opts?: Opts) => {
  19. const [state, setState] = useState<ModalStateCallback | null>(null);
  20. const [config, setConfig] = useState(() => merge(defaultOpts, opts));
  21. const show = useCallback(
  22. (cfg?: Opts) => {
  23. const newOptions = merge(config, cfg);
  24. setConfig(newOptions);
  25. setState(Modal[type](newOptions));
  26. },
  27. [setState, config, setConfig],
  28. );
  29. useEffect(() => {
  30. return () => {
  31. if (config?.destroyOnClose) {
  32. state?.destroy();
  33. }
  34. };
  35. }, [state, config]);
  36. return [show, state] as const;
  37. };
  38. export default useConfirm;

使用方式

  1. const [showDeleteTask] = useConfirm('confirm', {
  2. title: '标题',
  3. content: '具体描述内容',
  4. icon: <ExclamationCircleFilled style={{ color: '#faac16' }} />,
  5. });
  6. showDeleteTask({
  7. onOk: () => {
  8. console.log('onOk');
  9. }
  10. });