Modal 对话框

模态对话框。

何时使用

需要用户处理事务,又不希望跳转页面以致打断工作流程时,可以使用 Modal 在当前页面正中打开一个浮层,承载相应的操作。

另外当需要一个简洁的确认框询问用户时,可以使用精心封装好的 Vue.$modal.confirm() 等方法。

代码演示

基本

第一个对话框。

  1. <template>
  2. <v-button type="primary" @click="showModal">显示对话框</v-button>
  3. <v-modal title="第一个 Modal"
  4. :visible="visible"
  5. @ok="handleOk"
  6. @cancel="handleCancel">
  7. <p>对话框的内容</p>
  8. <p>对话框的内容</p>
  9. <p>对话框的内容</p>
  10. </v-modal>
  11. </template>
  12. <script >
  13. export default {
  14. data () {
  15. return {
  16. visible: false
  17. }
  18. },
  19. methods: {
  20. showModal () {
  21. this.visible = true;
  22. },
  23. handleOk () {
  24. this.visible = false;
  25. },
  26. handleCancel () {
  27. this.visible = false;
  28. }
  29. }
  30. }
  31. </script>

异步关闭

点击确定后异步关闭对话框,例如提交表单。

  1. <template>
  2. <v-button type="primary" @click="showAsyncModal">显示对话框</v-button>
  3. <v-modal title="异步关闭的 Modal 对话框"
  4. :visible="asyncModalVisible"
  5. @ok="handleAsyncOk"
  6. @cancel="handleAsyncCancel"
  7. :confirm-loading="asyncConfirmLoading">
  8. <p>对话框的内容</p>
  9. <p>对话框的内容</p>
  10. <p>对话框的内容</p>
  11. </v-modal>
  12. </template>
  13. <script>
  14. export default {
  15. data () {
  16. return {
  17. asyncModalVisible: false,
  18. asyncConfirmLoading: false
  19. }
  20. },
  21. methods: {
  22. showAsyncModal () {
  23. this.asyncModalVisible = true;
  24. },
  25. handleAsyncOk () {
  26. /* 对话框将在两秒后关闭 */
  27. this.asyncConfirmLoading = true;
  28. setTimeout(() => {
  29. this.asyncModalVisible = false;
  30. this.asyncConfirmLoading = false;
  31. }, 2000);
  32. },
  33. handleAsyncCancel () {
  34. this.asyncModalVisible = false;
  35. }
  36. }
  37. }
  38. </script>

自定义页脚

更复杂的例子,自定义了页脚的按钮,点击提交后进入 loading 状态,完成后关闭。

  1. <template>
  2. <v-button type="primary" @click="showCustomFooter">显示对话框</v-button>
  3. <v-modal title="自定义页脚的 Modal 对话框"
  4. :visible="customFooterVisible"
  5. @cancel="customFooterCancel">
  6. <p>对话框的内容</p>
  7. <p>对话框的内容</p>
  8. <p>对话框的内容</p>
  9. <div slot="footer">
  10. <v-button key="cancel" type="ghost" size="large" @click="customFooterCancel">
  11. 返 回
  12. </v-button>
  13. <v-button key="confirm" type="primary" size="large" :loading="customFooterLoading" @click="customFooterOk">
  14. 提 交
  15. </v-button>
  16. </div>
  17. </v-modal>
  18. </template>
  19. <script>
  20. export default {
  21. data () {
  22. return {
  23. customFooterVisible: false,
  24. customFooterLoading: false
  25. }
  26. },
  27. methods: {
  28. customFooterOk () {
  29. /* 对话框将在两秒后关闭 */
  30. this.customFooterLoading = true;
  31. setTimeout(() => {
  32. this.customFooterVisible = false;
  33. this.customFooterLoading = false;
  34. }, 2000);
  35. },
  36. customFooterCancel () {
  37. this.customFooterVisible = false;
  38. }
  39. }
  40. }
  41. </script>

确认对话框

使用 Vue.$modal.confirm() 可以快捷地弹出确认框。

  1. <template>
  2. <v-button @click="showConfirm">显示确认对话框</v-button>
  3. </template>
  4. <script>
  5. export default {
  6. data () {
  7. return {}
  8. },
  9. methods: {
  10. showConfirm () {
  11. this.$modal.confirm({
  12. title: '您是否确认要删除这项内容',
  13. content: '一些解释内容',
  14. onOk: function () {
  15. console.log('确定')
  16. },
  17. onCancel: function () {}
  18. })
  19. }
  20. }
  21. }
  22. </script>

异步关闭

使用 Vue.$modal.confirm() 可以快捷地弹出确认框。onCancel/onOk 返回 promise 可以延迟关闭

  1. <template>
  2. <v-button @click="showAsyncConfirm">显示确认对话框</v-button>
  3. </template>
  4. <script>
  5. export default {
  6. data () {
  7. return {}
  8. },
  9. methods: {
  10. showAsyncConfirm () {
  11. this.$modal.confirm({
  12. title: '您是否确认要删除这项内容',
  13. content: '点确认 1 秒后关闭',
  14. onOk: async () => {
  15. await new Promise(function (resolve) {
  16. setTimeout(resolve, 1000);
  17. })
  18. },
  19. onCancel: function () {
  20. return new Promise(function (resolve) {
  21. setTimeout(resolve, 1000);
  22. })
  23. }
  24. })
  25. },
  26. }
  27. }
  28. </script>

信息提示

各种类型的信息提示,只提供一个按钮用于关闭。

  1. <template>
  2. <v-button @click="info">信息提示</v-button>
  3. <v-button @click="success">成功提示</v-button>
  4. <v-button @click="error">失败提示</v-button>
  5. <v-button @click="warning">警告提示</v-button>
  6. </template>
  7. <script>
  8. export default {
  9. data () {
  10. return {}
  11. },
  12. methods: {
  13. info() {
  14. this.$modal.info({
  15. maskClosable: true,
  16. title: '这是一条通知信息',
  17. content: '一些附加信息',
  18. onOk: function () {
  19. }
  20. })
  21. },
  22. success() {
  23. this.$modal.success({
  24. maskClosable: true,
  25. title: '这是一条成功信息',
  26. content: '一些附加信息'
  27. })
  28. },
  29. error() {
  30. this.$modal.error({
  31. title: '这是一条失败信息',
  32. content: '一些附加信息'
  33. })
  34. },
  35. warning() {
  36. this.$modal.warning({
  37. title: '这是一条警告信息',
  38. content: '一些附加信息'
  39. })
  40. }
  41. }
  42. }
  43. </script>

国际化

设置 okTextcancelText 以自定义按钮文字。

  1. <template>
  2. <v-button type="primary" @click="showCustomTextModal">显示对话框</v-button>
  3. <v-modal title="Modal"
  4. :visible="customTextVisible"
  5. @ok="customTextOk"
  6. @cancel="customTextCancel"
  7. ok-text="ok"
  8. cancel-text="Cancel">
  9. <p>Bla bla ...</p>
  10. <p>Bla bla ...</p>
  11. <p>Bla bla ...</p>
  12. </v-modal>
  13. <br/>
  14. <v-button @click="showCustomTextConfirm">显示确认对话框</v-button>
  15. </template>
  16. <script>
  17. export default {
  18. data () {
  19. return {
  20. customTextVisible: false
  21. }
  22. },
  23. methods: {
  24. showCustomTextModal () {
  25. this.customTextVisible = true;
  26. },
  27. customTextOk () {
  28. this.customTextVisible = false;
  29. },
  30. customTextCancel () {
  31. this.customTextVisible = false;
  32. },
  33. showCustomTextConfirm() {
  34. this.$modal.confirm({
  35. title: 'Confirm',
  36. content: 'Bla bla ...',
  37. okText: 'OK',
  38. cancelText: 'Cancel'
  39. })
  40. }
  41. }
  42. }
  43. </script>

自定义样式

1.0 之后,Modal 的 align 属性被移除,您可以直接使用 style.top 或配合其他样式来设置对话框位置。

  1. <template>
  2. <v-button type="primary" @click="showCustomStyleModal">显示距离顶部 20px 的对话框</v-button>
  3. <v-button type="primary" @click="showCustomStyleModal1">显示垂直居中的对话框</v-button>
  4. <v-button @click="showCustomStyleConfirm">显示自定义确认对话框</v-button>
  5. <v-modal
  6. title="对话框"
  7. :width="300"
  8. :visible="customStyleVisible"
  9. @ok="customStyleOK"
  10. @cancel="customStyleCancel"
  11. :modal-style="modalStyle">
  12. <p>对话框的内容</p>
  13. <p>对话框的内容</p>
  14. <p>对话框的内容</p>
  15. </v-modal>
  16. <v-modal
  17. title="对话框"
  18. :visible="customStyleVisible1"
  19. @ok="customStyleOK1"
  20. @cancel="customStyleCancel1"
  21. wrap-class-name="vertical-center-modal">
  22. <p>对话框的内容</p>
  23. <p>对话框的内容</p>
  24. <p>对话框的内容</p>
  25. </v-modal>
  26. </template>
  27. <script>
  28. export default {
  29. data () {
  30. return {
  31. modalStyle: {
  32. top: '20px'
  33. },
  34. customStyleVisible: false,
  35. customStyleVisible1: false
  36. }
  37. },
  38. methods: {
  39. showCustomStyleModal () {
  40. this.customStyleVisible = true;
  41. },
  42. customStyleOK () {
  43. this.customStyleVisible = false;
  44. },
  45. customStyleCancel () {
  46. this.customStyleVisible = false;
  47. },
  48. showCustomStyleModal1 () {
  49. this.customStyleVisible1 = true;
  50. },
  51. customStyleOK1 () {
  52. this.customStyleVisible1 = false;
  53. },
  54. customStyleCancel1 () {
  55. this.customStyleVisible1 = false;
  56. },
  57. showCustomStyleConfirm () {
  58. this.$modal.confirm({
  59. iconType: 'frown',
  60. title: '确认删除',
  61. content: '一些解释内容',
  62. okText: '是的',
  63. cancelText: '我再想想',
  64. width: 300
  65. })
  66. }
  67. }
  68. }
  69. </script>
  70. <style>
  71. .vertical-center-modal {
  72. display: flex;
  73. align-items: center;
  74. justify-content: center;
  75. }
  76. </style>

手动移除

手动关闭modal。

  1. <template>
  2. <v-button @click="_confirmDestroy">显示成功提示</v-button>
  3. </template>
  4. <script>
  5. export default {
  6. data () {
  7. return {}
  8. },
  9. methods: {
  10. _confirmDestroy() {
  11. const modal = this.$modal.success({
  12. title: '这是一条通知信息',
  13. content: '一秒后自动移除'
  14. });
  15. setTimeout(() => modal.destroy(), 1000);
  16. }
  17. }
  18. }
  19. </script>

API

Modal Props

参数说明类型默认值
visible对话框是否可见booleanfalse
title标题string-
closable是否显示右上角的关闭按钮booleantrue
hasMask是否显示蒙层booleantrue
maskClosable点击蒙层是否允许关闭booleantrue
confirmLoading确定按钮 loadingbooleanfalse
okText确认按钮文字string确定
cancelText取消按钮文字string取消
slot:footer底部内容string确定取消按钮
wrapClassName对话框外层容器的类名string-
width宽度number520
modalStyle可用于设置浮层的样式,调整浮层位置等object-

Modal Events

事件名称说明回调参数
ok点击确定时触发-
cancel点击遮罩层或右上角叉或取消按钮时触发-

Vue.$modal.xxx()

包括:

  • Modal.info
  • Modal.success
  • Modal.error
  • Modal.warning
  • Modal.confirm
    以上均为一个函数,参数为 object,具体属性如下:
参数说明类型默认值
iconType图标 Icon 类型stringquestion-circle
title标题string-
content内容string-
width宽度number416
okText确认按钮文字string确定(只有确定按钮时为知道了)
cancelText取消按钮文字string取消
onOk点击确定回调,参数为关闭函数,返回 promise 时 resolve 后自动关闭function-
onCancel取消回调,参数为关闭函数,返回 promise 时 resolve 后自动关闭function-
maskClosable点击蒙层是否允许关闭booleanfalse
modalStyle可用于设置浮层的样式,调整浮层位置等object-