Modal 对话框

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

规则

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

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

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

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

代码演示

基本

基本使用方式, 弹出一个浮层

  1. import { Modal, Button, WhiteSpace, WingBlank } from 'antd-mobile';
  2. const App = React.createClass({
  3. getInitialState() {
  4. return { visible: false };
  5. },
  6. showModal() {
  7. this.setState({
  8. visible: true,
  9. });
  10. },
  11. onClose() {
  12. this.setState({
  13. visible: false,
  14. });
  15. },
  16. render() {
  17. return (
  18. <div>
  19. <WhiteSpace size="lg" />
  20. <WingBlank>
  21. <Button type="ghost" onClick={this.showModal}>
  22. 显示全屏对话框
  23. </Button>
  24. <Modal visible={this.state.visible} closable={false}>
  25. <div style={{ height: '50%', paddingTop: 200 }}>
  26. 这是内容...<br />
  27. 这是内容...<br />
  28. </div>
  29. <Button type="primary" inline onClick={this.onClose}>close modal</Button>
  30. </Modal>
  31. </WingBlank>
  32. <WhiteSpace size="lg" />
  33. </div>
  34. );
  35. },
  36. });
  37. ReactDOM.render(
  38. <App />
  39. , mountNode);

可关闭

可关闭的浮层

  1. import { Modal, Button, WhiteSpace, WingBlank } from 'antd-mobile';
  2. const App = React.createClass({
  3. getInitialState() {
  4. return { visible: false };
  5. },
  6. showModal() {
  7. this.setState({
  8. visible: true,
  9. });
  10. },
  11. onClose() {
  12. this.setState({
  13. visible: false,
  14. });
  15. },
  16. render() {
  17. return (
  18. <div>
  19. <WhiteSpace size="lg" />
  20. <WingBlank>
  21. <Button type="ghost" onClick={this.showModal}>
  22. 可关闭对话框
  23. </Button>
  24. <Modal
  25. title="这是 title"
  26. closable
  27. maskClosable
  28. transparent
  29. onClose={this.onClose}
  30. visible={this.state.visible}
  31. >
  32. 这是内容...<br />
  33. 这是内容...<br />
  34. </Modal>
  35. </WingBlank>
  36. <WhiteSpace size="lg" />
  37. </div>
  38. );
  39. },
  40. });
  41. ReactDOM.render(
  42. <App />
  43. , mountNode);

自定义

可自定义的浮层

  1. import { Modal, Button, WhiteSpace, WingBlank } from 'antd-mobile';
  2. const App = React.createClass({
  3. getInitialState() {
  4. return { visible: false };
  5. },
  6. showModal() {
  7. this.setState({
  8. visible: true,
  9. });
  10. },
  11. onClose() {
  12. this.setState({
  13. visible: false,
  14. });
  15. },
  16. render() {
  17. return (
  18. <div>
  19. <WhiteSpace size="lg" />
  20. <WingBlank>
  21. <Button type="ghost" onClick={this.showModal}>
  22. 自定义对话框
  23. </Button>
  24. <Modal
  25. onClose={this.onClose}
  26. transparent
  27. visible={this.state.visible}
  28. footer={[{ text: '确定', onPress: () => { console.log('ok'); this.onClose(); } }]}
  29. >
  30. <div className="modal-demo-content">
  31. <div className="demo-image">图片</div>
  32. <div className="demo-title">标题文字标题文字</div>
  33. <div className="demo-content">辅助说明文字辅助说明文字辅助说明文字辅助说明文字辅助说明文字辅助说明文字</div>
  34. </div>
  35. </Modal>
  36. </WingBlank>
  37. <WhiteSpace size="lg" />
  38. </div>
  39. );
  40. },
  41. });
  42. ReactDOM.render(
  43. <App />
  44. , mountNode);
  1. .demo-image {
  2. width: 1.5rem;
  3. height: 1.5rem;
  4. border-radius: 0.75rem;
  5. margin: 0 auto;
  6. background-color: #108ee9;
  7. line-height: 1.5rem;
  8. color: white;
  9. }
  10. .demo-title {
  11. margin-top: 0.3rem;
  12. margin-bottom: 0.3rem;
  13. font-size: 0.32rem;
  14. color: #000;
  15. }
  16. .demo-content {
  17. font-size: 0.26rem;
  18. color: #333;
  19. }

弹出框

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

  1. import { Modal, Button, WhiteSpace, WingBlank } from 'antd-mobile';
  2. const alert = Modal.alert;
  3. function showAlert() {
  4. alert('删除', '确定删除么???', [
  5. { text: 'cancel', onPress: () => console.log('cancel') },
  6. { text: 'ok', onPress: () => console.log('ok') },
  7. ]);
  8. }
  9. function showConfirm() {
  10. alert('删除', '确定删除么???', [
  11. { text: '取消', onPress: () => console.log('cancel') },
  12. { text: '确定', onPress: () => console.log('ok') },
  13. ]);
  14. }
  15. function showMoreBtn() {
  16. alert('多个按钮情况', <div>这里有好多个按钮, 你试试</div>, [
  17. { text: '按钮一', onPress: () => console.log('第0个按钮被点击了') },
  18. { text: '按钮二', onPress: () => console.log('第1个按钮被点击了') },
  19. { text: '按钮三', onPress: () => console.log('第2个按钮被点击了') },
  20. ]);
  21. }
  22. const App = React.createClass({
  23. render() {
  24. return (
  25. <div>
  26. <WhiteSpace size="lg" />
  27. <WingBlank size="lg">
  28. <Button type="ghost" onClick={showAlert}>自定义按钮 </Button>
  29. </WingBlank>
  30. <WhiteSpace size="lg" />
  31. <WingBlank size="lg">
  32. <Button type="ghost" onClick={showConfirm}>确认对话框</Button>
  33. </WingBlank>
  34. <WhiteSpace size="lg" />
  35. <WingBlank size="lg">
  36. <Button type="ghost" onClick={showMoreBtn}>弹出多个按钮 </Button>
  37. </WingBlank>
  38. <WhiteSpace size="lg" />
  39. </div>
  40. );
  41. },
  42. });
  43. ReactDOM.render(
  44. <App />
  45. , mountNode);

输入框

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

  1. import { Modal, Button, WingBlank, WhiteSpace } from 'antd-mobile';
  2. const prompt = Modal.prompt;
  3. function plainTextPrompt() {
  4. prompt('输入名字', '这是名字的 message', [
  5. { text: '取消' },
  6. { text: '提交', onPress: value => console.log(`输入的内容:${value}`) },
  7. ]);
  8. }
  9. function passwordPrompt() {
  10. prompt(
  11. '输入密码',
  12. '这是密码message,可以不要',
  13. password => console.log(`password: ${password}`),
  14. 'secure-text',
  15. );
  16. }
  17. function customBtnPrompt() {
  18. prompt(
  19. '输入密码',
  20. '这是密码message,可以不要',
  21. [
  22. { text: '取消' },
  23. { text: '提交', onPress: password => console.log(`密码为:${password}`) },
  24. ],
  25. 'secure-text',
  26. );
  27. }
  28. function loginPwdPrompt() {
  29. prompt(
  30. '登录',
  31. '输入用户名和密码',
  32. (login, password) => console.log(`login: ${login}, password: ${password}`),
  33. 'login-password',
  34. );
  35. }
  36. const App = React.createClass({
  37. render() {
  38. return (
  39. <div>
  40. <WhiteSpace size="lg" />
  41. <WingBlank size="lg">
  42. <Button type="ghost" onClick={plainTextPrompt}>输入框按钮按钮 </Button>
  43. </WingBlank>
  44. <WhiteSpace size="lg" />
  45. <WingBlank size="lg">
  46. <Button type="ghost" onClick={passwordPrompt}>输入框密码形式 </Button>
  47. </WingBlank>
  48. <WhiteSpace size="lg" />
  49. <WingBlank size="lg">
  50. <Button type="ghost" onClick={customBtnPrompt}>自定义按钮形式 </Button>
  51. </WingBlank>
  52. <WhiteSpace size="lg" />
  53. <WingBlank size="lg">
  54. <Button type="ghost" onClick={loginPwdPrompt}>输入框登录形式 </Button>
  55. </WingBlank>
  56. <WhiteSpace size="lg" />
  57. </div>
  58. );
  59. },
  60. });
  61. ReactDOM.render(
  62. <App />
  63. , mountNode);

Modal对话框 - 图1

API

Modal web & react native

参数说明类型默认值
prefixCls (web only)样式类名前缀Stringam-modal
visible对话框是否可见Booleanfalse
onClose点击 x 或 mask 回调Function
title (only transparent)标题React.Element
closable是否显示右上角的关闭按钮Booleanfalse
maskClosable (only transparent)点击蒙层是否允许关闭Booleanfalse
footer (only not transparent)底部内容Array [{text, onpress}][]
transparent是否弹窗模式Booleantrue
style样式Object透明模式下: {width: '286px', height: 'auto'}, 非透明模式: {width: '100%', height: '100%'} (web)

Modal.alert(title, message, actions?) web only

参数说明类型默认值
title标题String 或 React.Element
message提示信息String 或 React.Element
actions按钮组, [{text, onpress}]Array

Modal.prompt(title?, message?, callbackOrActions, type?) web only

参数说明类型默认值
title标题String 或 React.Element
message提示信息String 或 React.Element
callbackOrActions按钮组 [{text, onpress}] 或回调函数Array or Function
typeprompt 的样式String (default, secure-text, login-password)default