Modal模态框

模态框。

何时使用

代码演示

Modal 模态框 - 图1

基本使用

基本使用。

  1. import { Modal, Button } from 'choerodon-ui/pro';
  2. const modalKey = Modal.key();
  3. const ModalContent = ({ modal }) => {
  4. modal.handleOk(() => {
  5. console.log('do OK');
  6. return false;
  7. });
  8. modal.handleCancel(() => {
  9. console.log('do Cancel');
  10. });
  11. function toggleOkDisabled() {
  12. modal.update({ okProps: { disabled: !modal.props.okProps.disabled } });
  13. }
  14. return (
  15. <div>
  16. <p>Some contents...</p>
  17. <p>Some contents...</p>
  18. <p>Some contents...</p>
  19. <Button color="primary" onClick={modal.close}>
  20. custom button for close modal
  21. </Button>
  22. <Button onClick={toggleOkDisabled}>
  23. {modal.props.okProps.disabled ? 'enable' : 'disable'}
  24. </Button>
  25. </div>
  26. );
  27. };
  28. function openModal() {
  29. Modal.open({
  30. key: modalKey,
  31. title: 'Basic',
  32. children: <ModalContent />,
  33. okProps: { disabled: true, children: '保存' },
  34. });
  35. }
  36. ReactDOM.render(<Button onClick={openModal}>Open</Button>, mountNode);

Modal 模态框 - 图2

自定义页脚

自定义页脚。

  1. import { Modal, Button } from 'choerodon-ui/pro';
  2. const key1 = Modal.key();
  3. const key2 = Modal.key();
  4. const key3 = Modal.key();
  5. let modal;
  6. function closeModal() {
  7. modal.close();
  8. }
  9. function openModal() {
  10. modal = Modal.open({
  11. key: key1,
  12. title: 'Custom Footer',
  13. children: (
  14. <div>
  15. <p>Some contents...</p>
  16. <p>Some contents...</p>
  17. <p>Some contents...</p>
  18. </div>
  19. ),
  20. footer: <Button onClick={closeModal}>关闭</Button>,
  21. });
  22. }
  23. function openNoFooter() {
  24. Modal.open({
  25. key: key2,
  26. title: 'No Footer',
  27. maskClosable: true,
  28. destroyOnClose: true,
  29. children: (
  30. <div>
  31. <p>Some contents...</p>
  32. <p>Some contents...</p>
  33. <p>Some contents...</p>
  34. </div>
  35. ),
  36. footer: null,
  37. });
  38. }
  39. function openMoreButtons() {
  40. Modal.open({
  41. key: key3,
  42. title: 'More Buttons',
  43. maskClosable: true,
  44. destroyOnClose: true,
  45. drawer: true,
  46. children: (
  47. <div>
  48. <p>Some contents...</p>
  49. <p>Some contents...</p>
  50. <p>Some contents...</p>
  51. </div>
  52. ),
  53. footer: (okBtn, cancelBtn) => (
  54. <div>
  55. {okBtn}
  56. <Button color="primary">Custom</Button>
  57. {cancelBtn}
  58. </div>
  59. ),
  60. });
  61. }
  62. ReactDOM.render(
  63. <div>
  64. <Button onClick={openModal}>Custom</Button>
  65. <Button onClick={openNoFooter}>No Footer</Button>
  66. <Button onClick={openMoreButtons}>More Buttons</Button>
  67. </div>,
  68. mountNode,
  69. );

Modal 模态框 - 图3

自定义坐标

自定义坐标。

  1. import { Modal, Button } from 'choerodon-ui/pro';
  2. const modalKey = Modal.key();
  3. function openModal() {
  4. Modal.open({
  5. key: modalKey,
  6. title: 'No Footer',
  7. children: (
  8. <div>
  9. <p>Some contents...</p>
  10. <p>Some contents...</p>
  11. <p>Some contents...</p>
  12. </div>
  13. ),
  14. style: {
  15. left: 100,
  16. top: 200,
  17. },
  18. });
  19. }
  20. ReactDOM.render(
  21. <Button onClick={openModal}>Open</Button>,
  22. mountNode,
  23. );

Modal 模态框 - 图4

确认框

确认框。

  1. import { Modal, Button } from 'choerodon-ui/pro';
  2. function doConfirm() {
  3. Modal.confirm({
  4. title: 'Confirm',
  5. children: (
  6. <div>
  7. <p>Some contents...</p>
  8. <p>Some contents...</p>
  9. <p>Some contents...</p>
  10. </div>
  11. ),
  12. }).then(button => {
  13. Modal.info(`Click ${button}`);
  14. });
  15. }
  16. function info() {
  17. Modal.info({
  18. title: 'This is title',
  19. children: '您的订单已经提交!',
  20. });
  21. }
  22. function success() {
  23. Modal.success('订单提交成功!');
  24. }
  25. function error() {
  26. Modal.error('订单提交失败!');
  27. }
  28. function warning() {
  29. Modal.warning('订单信息不完整!');
  30. }
  31. ReactDOM.render(
  32. <div>
  33. <Button onClick={doConfirm}>Confirm</Button>
  34. <Button onClick={info}>Info</Button>
  35. <Button onClick={success}>Success</Button>
  36. <Button onClick={error}>Error</Button>
  37. <Button onClick={warning}>Warning</Button>
  38. </div>,
  39. mountNode,
  40. );

Modal 模态框 - 图5

多层抽屉

通过设定多个 drawer 类型的弹出框形成多层抽屉,可指定弹出层宽度,弹出动画。

  1. import { Modal, Button } from 'choerodon-ui/pro';
  2. const key1 = Modal.key();
  3. const key2 = Modal.key();
  4. const key3 = Modal.key();
  5. function openSubModal2() {
  6. return new Promise(resolve => {
  7. Modal.open({
  8. key: key3,
  9. title: 'Sub Mode 2',
  10. style: {
  11. width: 600,
  12. },
  13. drawer: true,
  14. drawerTransitionName: 'slide-left',
  15. children: (
  16. <div>
  17. <p>Open Sub Modal2...</p>
  18. <p>Open Sub Modal2...</p>
  19. </div>
  20. ),
  21. onOk: resolve,
  22. });
  23. });
  24. }
  25. function openSubModal1() {
  26. return new Promise(resolve => {
  27. Modal.open({
  28. key: key2,
  29. title: 'Sub Mode 1',
  30. drawer: true,
  31. style: {
  32. width: 600,
  33. },
  34. children: (
  35. <div>
  36. <Button onClick={openSubModal2}>Open Sub Modal2...</Button>
  37. <p>Open Sub Modal1...</p>
  38. <p>Open Sub Modal1...</p>
  39. </div>
  40. ),
  41. onOk: resolve,
  42. onCancel: resolve,
  43. });
  44. });
  45. }
  46. function openModal() {
  47. Modal.open({
  48. closable: true,
  49. key: key1,
  50. title: 'Multilayer',
  51. drawer: true,
  52. style: {
  53. width: 300,
  54. },
  55. children: (
  56. <div>
  57. <Button onClick={openSubModal1}>Open Sub Modal1...</Button>
  58. <p>Modal...</p>
  59. <p>Modal...</p>
  60. </div>
  61. ),
  62. afterClose: () => {
  63. window.console.log('after close');
  64. },
  65. });
  66. }
  67. ReactDOM.render(<Button onClick={openModal}>Drawer</Button>, mountNode);

Modal 模态框 - 图6

异步关闭

异步关闭。

  1. import { Modal, Button } from 'choerodon-ui/pro';
  2. const modalKey = Modal.key();
  3. function openModal() {
  4. Modal.open({
  5. key: modalKey,
  6. title: 'Synchronize',
  7. children: (
  8. <div>
  9. <p>Some contents...</p>
  10. <p>Some contents...</p>
  11. <p>Some contents...</p>
  12. </div>
  13. ),
  14. onOk: () => new Promise((resolve) => {
  15. setTimeout(() => {
  16. resolve();
  17. }, 1000);
  18. }),
  19. onCancel: () => new Promise((resolve, reject) => {
  20. setTimeout(() => {
  21. reject(new Error('error'));
  22. }, 1000);
  23. }),
  24. });
  25. }
  26. ReactDOM.render(
  27. <Button onClick={openModal}>Open</Button>,
  28. mountNode,
  29. );

Modal 模态框 - 图7

多层

多层。

  1. import { Modal, Button } from 'choerodon-ui/pro';
  2. const modalKey = Modal.key();
  3. async function openSubModal() {
  4. return await Modal.confirm('确认关闭?') === 'ok';
  5. }
  6. function openModal() {
  7. Modal.open({
  8. key: modalKey,
  9. title: 'Multilayer',
  10. children: (
  11. <div>
  12. <p>Some contents...</p>
  13. <p>Some contents...</p>
  14. <p>Some contents...</p>
  15. </div>
  16. ),
  17. onClose: openSubModal,
  18. });
  19. }
  20. ReactDOM.render(
  21. <Button onClick={openModal}>Open</Button>,
  22. mountNode,
  23. );

Modal 模态框 - 图8

关闭按钮

关闭按钮。

  1. import { Modal, Button } from 'choerodon-ui/pro';
  2. const modalKey = Modal.key();
  3. function openModal() {
  4. Modal.open({
  5. key: modalKey,
  6. title: 'Close button',
  7. children: (
  8. <div>
  9. <p>Some contents...</p>
  10. <p>Some contents...</p>
  11. <p>Some contents...</p>
  12. </div>
  13. ),
  14. closable: true,
  15. });
  16. }
  17. ReactDOM.render(<Button onClick={openModal}>Open</Button>, mountNode);

Modal 模态框 - 图9

全屏显示

全屏显示。

  1. import { Modal, Button } from 'choerodon-ui/pro';
  2. const modalKey = Modal.key();
  3. function openModal() {
  4. Modal.open({
  5. key: modalKey,
  6. title: 'Full screen',
  7. children: (
  8. <div>
  9. <p>Some contents...</p>
  10. <p>Some contents...</p>
  11. <p>Some contents...</p>
  12. </div>
  13. ),
  14. fullScreen: true,
  15. });
  16. }
  17. ReactDOM.render(
  18. <Button onClick={openModal}>Open</Button>,
  19. mountNode,
  20. );

API

Modal

参数说明类型默认值
key唯一键, 当 destroyOnClose 为 false 时,必须指定 key。为了避免与其他 modal 的 key 重复,可通过 Modal.key()来获取唯一 key。string
title标题ReactNode
closable显示右上角关闭按钮booleanfalse
movable可移动, drawer 无法移动booleantrue
fullScreen全屏显示booleanfalse
maskClosable点击蒙层是否允许关闭booleanfalse
keyboardClosable按 esc 键是否允许关闭booleantrue
destroyOnClose关闭时是否销毁booleantrue
footer底部内容ReactNode 或(okBtn: ReactNode, cancelBtn: ReactNode) => ReactNode
okText确认按钮文字ReactNode确定
cancelText取消按钮文字ReactNode取消
onClose关闭时回调,返回false Promise.resolve(false)Promise.reject()不会关闭, 其他自动关闭() => Promise<boolean>
onOk点击确定回调,返回false Promise.resolve(false)Promise.reject()不会关闭, 其他自动关闭() => Promise<boolean>
onCancel点击取消回调,返回false Promise.resolve(false)Promise.reject()不会关闭, 其他自动关闭() => Promise<boolean>
afterClose关闭后回调() => void
drawer抽屉模式booleanfalse
drawerTransitionName抽屉模式使用的动画string'slide-right'
okCancel同时显示 ok 和 cancel 按钮,false 的时候只显示 ok 按钮booleantrue
okFirstok 按钮是否排在第一个booleantrue
okPropsok 按钮属性object
cancelPropscancel 按钮属性object

ModalProvider > v0.8.50

  • 使用 Modal 前,需要在页面根节点外包裹 ModalProvider。如果路由切换时要清空所有 Modal,需要在 ModalProvider 传入 location,如下所示。

  • 如果 Modal 要获取 React Context,请在对应的 Context.Provider 子节点外包裹 ModalProvider,并使用 ModalProvider 提供的 injectModal 或 useModal 来代替 Modal.open。

  1. import { ModalProvider } from 'choerodon-ui/pro';
  2. import { withRouter } from 'react-router';
  3. @withRouter
  4. class App extends React.Component {
  5. render() {
  6. const { location } = this.props;
  7. return (
  8. <ModalProvider location={location}>
  9. <Main />
  10. </ModalProvider>
  11. );
  12. }
  13. }
  14. render(<App />, mountNode);

ModalContent <= v0.8.50

  • 使用 Modal 前,需要在页面 Root 内插入 ModalContainer。如果路由切换时要清空所有 Modal,需要在 ModalContiner 传入 location,如下所示。

  • 如果 Modal 要获取 React Context,请将 ModalContainer 至于 Context.Provider 之下。

  • 为了避免多个 ModalContainer 之间 Context 错乱, ModalContainer 务必作为第一个子元素使用。

  1. import { ModalContainer } from 'choerodon-ui/pro';
  2. import { withRouter } from 'react-router';
  3. @withRouter
  4. class App extends React.Component {
  5. render() {
  6. const { location } = this.props;
  7. return (
  8. <div>
  9. <ModalContainer location={location} />
  10. <Main />
  11. </div>
  12. );
  13. }
  14. }
  15. render(<App />, mountNode);

Modal.open

Modal.open()返回一个对象,该对象具有如下方法:

名称说明参数
close(destroy)关闭destroy - 是否销毁
open()打开
update(props)更新

props.modal

Modal 会向内部组件注入 modal 对象,该对象具有如下属性与方法:

名称说明参数
handleOk(callback)注册响应 ok 按钮的钩子,返回值为 false 将阻止关闭callback - 钩子
handleCancel(callback)注册响应 cancel 按钮的钩子,返回值为 false 将阻止关闭callback - 钩子
close(destroy)关闭destroy - 是否销毁
update(props)更新
propsmodal 的 props