Modal 对话框

用作显示系统的重要信息,并请求用户进行操作反馈,eg:删除某个重要内容时,弹出 Modal 进行二次确认。

规则

  • 尽可能少用。Modal 会打断用户操作,只用在重要的时候。

  • 标题应该简明,不能超过 1 行;描述内容应该简明、完整,一般不多于 2 行。

  • 操作按钮最多到 3 个(竖排),一般为 1-2 个(横排);3 个以上建议使用组件 ActionSheet 来完成。

  • 一般将用户最可能点击的按钮,放在右侧。另外,取消按钮应当始终放在左侧。

代码演示

基本

基本对话框。

  1. import { Modal, Button, WhiteSpace, WingBlank } from 'antd-mobile';
  2. class App extends React.Component {
  3. constructor(props) {
  4. super(props);
  5. this.state = {
  6. modal1: false,
  7. modal2: false,
  8. modal3: false,
  9. };
  10. }
  11. showModal = key => (e) => {
  12. // 现象:如果弹出的弹框上的 x 按钮的位置、和手指点击 button 时所在的位置「重叠」起来,
  13. // 会触发 x 按钮的点击事件而导致关闭弹框 (注:弹框上的取消/确定等按钮遇到同样情况也会如此)
  14. e.preventDefault(); // 修复 Android 上点击穿透
  15. this.setState({
  16. [key]: true,
  17. });
  18. }
  19. onClose = key => () => {
  20. this.setState({
  21. [key]: false,
  22. });
  23. }
  24. render() {
  25. return (
  26. <div>
  27. <WhiteSpace />
  28. <WingBlank>
  29. <Button onClick={this.showModal('modal1')}>Modal 对话框 (自动检测平台)</Button>
  30. </WingBlank>
  31. <WhiteSpace />
  32. <Modal
  33. title="这是 title"
  34. transparent
  35. maskClosable={false}
  36. visible={this.state.modal1}
  37. onClose={this.onClose('modal1')}
  38. footer={[{ text: '确定', onPress: () => { console.log('ok'); this.onClose('modal1')(); } }]}
  39. >
  40. 这是内容...<br />
  41. 这是内容...<br />
  42. </Modal>
  43. <WingBlank>
  44. <Button onClick={this.showModal('modal2')}> Modal 对话框 Android)</Button>
  45. </WingBlank>
  46. <WhiteSpace />
  47. <Modal
  48. title="这是 title"
  49. transparent
  50. maskClosable={false}
  51. visible={this.state.modal2}
  52. onClose={this.onClose('modal2')}
  53. footer={[{ text: '确定', onPress: () => { console.log('ok'); this.onClose('modal2')(); } }]}
  54. platform="android"
  55. >
  56. 这是内容...<br />
  57. 这是内容...<br />
  58. </Modal>
  59. <WingBlank>
  60. <Button onClick={this.showModal('modal3')}> Modal 对话框 iOS)</Button>
  61. </WingBlank>
  62. <WhiteSpace />
  63. <Modal
  64. title="这是 title"
  65. transparent
  66. maskClosable={false}
  67. visible={this.state.modal3}
  68. onClose={this.onClose('modal3')}
  69. footer={[{ text: '确定', onPress: () => { console.log('ok'); this.onClose('modal3')(); } }]}
  70. platform="ios"
  71. >
  72. 这是内容...<br />
  73. 这是内容...<br />
  74. </Modal>
  75. </div>
  76. );
  77. }
  78. }
  79. ReactDOM.render(<App />, mountNode);

警告弹窗

包含无按钮, 确认框, 多按钮情况。

  1. import { Modal, Button, WhiteSpace, WingBlank, Toast } from 'antd-mobile';
  2. const alert = Modal.alert;
  3. const showAlert = () => {
  4. const alertInstance = alert('删除', '确定删除么???', [
  5. { text: 'Cancel', onPress: () => console.log('cancel'), style: 'default' },
  6. { text: 'OK', onPress: () => console.log('ok') },
  7. ]);
  8. setTimeout(() => {
  9. // 可以调用close方法以在外部close
  10. console.log('auto close');
  11. alertInstance.close();
  12. }, 2000);
  13. };
  14. const App = () => (
  15. <WingBlank size="lg">
  16. <WhiteSpace size="lg" />
  17. <Button onClick={showAlert}> 自定义按钮 </Button>
  18. <WhiteSpace size="lg" />
  19. <Button onClick={() => alert('删除', '确定删除么???', [
  20. { text: '取消', onPress: () => console.log('cancel') },
  21. { text: '确定', onPress: () => console.log('ok') },
  22. ])}
  23. >确认对话框</Button>
  24. <WhiteSpace size="lg" />
  25. <Button onClick={() => alert('多个按钮情况', <div>这里有好多个按钮, 你试试</div>, [
  26. { text: '按钮一', onPress: () => console.log('第0个按钮被点击了') },
  27. { text: '按钮二', onPress: () => console.log('第1个按钮被点击了') },
  28. { text: '按钮三', onPress: () => console.log('第2个按钮被点击了') },
  29. ])}
  30. >弹出多个按钮 </Button>
  31. <WhiteSpace size="lg" />
  32. <Button onClick={() => alert('删除', '确定删除么???', [
  33. { text: '取消', onPress: () => console.log('cancel') },
  34. {
  35. text: '确定',
  36. onPress: () => new Promise((resolve) => {
  37. Toast.info('onPress Promise', 1);
  38. setTimeout(resolve, 1000);
  39. }),
  40. },
  41. ])}
  42. >按钮 Promise</Button>
  43. <WhiteSpace size="lg" />
  44. </WingBlank>
  45. );
  46. ReactDOM.render(<App />, mountNode);

输入弹窗

包含输入普通文字, 密码, 登录信息样式。

  1. import { Modal, Button, WingBlank, WhiteSpace, Toast } from 'antd-mobile';
  2. const prompt = Modal.prompt;
  3. const App = () => (
  4. <WingBlank size="lg">
  5. <WhiteSpace size="lg" />
  6. <Button onClick={() => prompt('输入名字', '这是名字的 message',
  7. [
  8. { text: '取消' },
  9. {
  10. text: '提交',
  11. onPress: value => new Promise((resolve) => {
  12. Toast.info('onPress promise', 1);
  13. setTimeout(() => {
  14. resolve();
  15. console.log(`value:${value}`);
  16. }, 1000);
  17. }),
  18. },
  19. ], 'default', null, ['请输入你的名字'])}
  20. >按钮 Promise</Button>
  21. <WhiteSpace size="lg" />
  22. <Button onClick={() => prompt('默认值', '默认值 defaultValue 类型', [
  23. { text: '取消' },
  24. { text: '提交', onPress: value => console.log(`输入的内容:${value}`) },
  25. ], 'plain-text', '100')}
  26. >输入框默认值 </Button>
  27. <WhiteSpace size="lg" />
  28. <Button onClick={() => prompt(
  29. '输入密码',
  30. '这是密码message,可以不要',
  31. password => console.log(`password: ${password}`),
  32. 'secure-text',
  33. )}
  34. >输入框密码形式 </Button>
  35. <WhiteSpace size="lg" />
  36. <Button onClick={() => prompt(
  37. '输入密码',
  38. '这是密码message,可以不要',
  39. [
  40. { text: '取消' },
  41. { text: '提交', onPress: password => console.log(`密码为:${password}`) },
  42. ],
  43. 'secure-text',
  44. )}
  45. >自定义按钮形式 </Button>
  46. <WhiteSpace size="lg" />
  47. <Button onClick={() => prompt(
  48. '登录',
  49. '输入用户名和密码',
  50. (login, password) => console.log(`login: ${login}, password: ${password}`),
  51. 'login-password',
  52. null,
  53. ['请输入用户名', '请输入密码'],
  54. )}
  55. >输入框登录形式 </Button>
  56. <WhiteSpace size="lg" />
  57. </WingBlank>
  58. );
  59. ReactDOM.render(<App />, mountNode);

操作弹窗

操作对话框。

  1. import { Modal, Button, WhiteSpace, WingBlank } from 'antd-mobile';
  2. const operation = Modal.operation;
  3. const App = () => (
  4. <WingBlank size="lg">
  5. <WhiteSpace size="lg" />
  6. <Button onClick={() => operation([
  7. { text: '标为未读', onPress: () => console.log('标为未读被点击了') },
  8. { text: '置顶聊天', onPress: () => console.log('置顶聊天被点击了') },
  9. ])}
  10. >操作按钮</Button>
  11. <WhiteSpace size="lg" />
  12. </WingBlank>
  13. );
  14. ReactDOM.render(<App />, mountNode);

Modal对话框 - 图1

API

适用平台:WEB、React-Native

Modal

属性说明类型默认值
prefixCls (web only)样式类名前缀Stringam-modal
visible对话框是否可见Booleanfalse
onClose点击 x 或 mask 回调(): void
title (only transparent)标题React.Element
closable是否显示关闭按钮Booleanfalse
maskClosable (only transparent)点击蒙层是否允许关闭Booleantrue
footer (only not transparent)底部内容Array {text, onPress}[]
transparent是否弹窗模式Booleanfalse
animationType (rn only)可选: 'slide-down/up'(transparent 模式下) / 'fade' / 'slide'(仅非 tranparent)Stringfade
style (web only)样式Object透明模式下: {width: '286px', height: 'cross'}, 非透明模式: {width: '100%', height: '100%'} (web)
platform (web only)设定组件的平台特有样式, 可选值为 android, ios, 默认为 cross, 即组件会自动检测设备 UA 应用不同平台的样式String'cross'

Modal.alert(title, message, actions?)

属性说明类型默认值
title标题String 或 React.Element
message提示信息String 或 React.Element
actions按钮组, {text, onPress, style}Array

Modal.alert(title, message, actions?).close() 可以在外部关闭 Alert

Modal.prompt(title, message, callbackOrActions, type?, defaultValue?)

属性说明类型默认值
title标题String 或 React.Element
message提示信息String 或 React.Element
callbackOrActions按钮组 {text, onPress} 或回调函数Array or Function
typeprompt 的样式String (default, secure-text, login-password)default
defaultValue默认值(input 为 password 类型不支持)String-
placeholders'', ''String[]-
Modal.prompt(title, message, callbackOrActions, type?, defaultValue?, placeholders?).close()` 可以在外部关闭 prompt

Modal.operation(actions?)

属性说明类型默认值
actions按钮组, {text, onPress, style}Array
Modal.operation(actions?).close()` 可以在外部关闭 operation