当前位置:   article > 正文

vue封装一个简单的modal对话框_vue modal

vue modal

1、在conpmonents新建一个Modal.vue

 2、在main.js注册成全局组件

  1. // 全局可用的组件
  2. import Modal from './components/Modal'
  3. Vue.component('lx-modal', Modal)

3、在app.vue中使用组件 

  1. <div v-if="modalFlag">
  2. <lx-modal></lx-modal>
  3. </div>

 4、编写Modal的代码逻辑

  1. <template>
  2. <div class="lx-modal" v-if="value">
  3. <div class="lx-modal-bg"></div>
  4. <div class="lx-modal-main" :style="{ width: width + 'px', top: top + 'px' }">
  5. <i class="iconfont icon-guanbi-close" @click="close"></i>
  6. <div class="lx-modal-main-header">
  7. <slot name="header">{{ title ? title : '我是header' }}</slot>
  8. </div>
  9. <div class="lx-modal-main-content" :style="{ height: height + 'px' }">
  10. <slot>我是content</slot>
  11. </div>
  12. <div class="lx-modal-main-footer">
  13. <slot name="footer">
  14. <div style="display: flex;flex-direction: row-reverse;">
  15. <lx-button type="info" @click="save">确认</lx-button>
  16. <lx-button @click="cancel">取消</lx-button>
  17. </div>
  18. </slot>
  19. </div>
  20. </div>
  21. </div>
  22. </template>
  23. <script>
  24. export default {
  25. // eslint-disable-next-line vue/multi-word-component-names
  26. name: 'Modal',
  27. props: {
  28. value:Boolean,
  29. title: String,
  30. width: String,
  31. height: String,
  32. top: String
  33. },
  34. data() {
  35. return {
  36. modal: true
  37. }
  38. },
  39. methods: {
  40. close() {
  41. this.$emit('input', false)
  42. },
  43. cancel() {
  44. this.$emit('on-cancel')
  45. },
  46. save() {
  47. this.$emit('on-ok')
  48. }
  49. }
  50. }
  51. </script>
  52. <style scoped>
  53. @import url('../assets/icon/iconfont.css');
  54. </style>
  55. <style scoped lang="less">
  56. .lx-modal {
  57. position: fixed;
  58. top: 0;
  59. left: 0;
  60. bottom: 0;
  61. right: 0;
  62. z-index: 1000;
  63. }
  64. .lx-modal-bg {
  65. position: fixed;
  66. top: 0;
  67. left: 0;
  68. bottom: 0;
  69. right: 0;
  70. z-index: 1000;
  71. background-color: rgba(55,55,55,.6);
  72. }
  73. .lx-modal-main {
  74. position: relative;
  75. top: 100px;
  76. width: 520px;
  77. margin: 0 auto;
  78. background-color: #fff;
  79. z-index: 1001;
  80. border-radius: 10px;
  81. overflow: auto;
  82. }
  83. .iconfont {
  84. font-size: 22px;
  85. position: absolute;
  86. top: 10px;
  87. right: 10px;
  88. }
  89. .lx-modal-main-header {
  90. padding: 14px 20px;
  91. border-bottom: 1px solid #e8eaec;
  92. font-weight: 500;
  93. }
  94. .lx-modal-main-content {
  95. padding: 14px 20px;
  96. border-bottom: 1px solid #e8eaec;
  97. height: 200px;
  98. overflow: auto;
  99. &::-webkit-scrollbar {
  100. display: none;
  101. }
  102. }
  103. .lx-modal-main-footer {
  104. padding: 14px 20px;
  105. }
  106. @media (max-width: 800px) {
  107. .lx-modal-main {
  108. width: auto !important;
  109. }
  110. }
  111. </style>

在modal.vue中,我们在props中接受四个参数,title:标题,width:宽度, height:高度,top:距离顶部的高度,不传则是默认的值;并提供了两个具名插槽,header和footer,以及一个默认插槽slot显示里面的内容;并添加了三个自定义事件控制modal的显示和隐藏;v-if默认展示组件

注意一下:关于字体图标使用和用到的button组件、message提示组件可以看我之前发的封装button组件和message组件那个作品。message提示组件讲到了字体的引用以及封装,这几个自己封装的组件一起连着使用了

message组件及字体引入:https://blog.csdn.net/qq_55491577/article/details/136044309?spm=1001.2014.3001.5502

button组件 :

https://blog.csdn.net/qq_55491577/article/details/136029304?spm=1001.2014.3001.5502

5、来到App.vue

传递一些需要的参数,宽高就用默认的 代码如下:

  1. <template>
  2. <div id="#app">
  3. <div v-if="modalFlag">
  4. <lx-modal v-model="modalFlag" @on-cancel="cancel" @on-ok="ok" :title="title" top="50">
  5. <template #header>
  6. <div>
  7. <h3>我是标题</h3>
  8. </div>
  9. </template>
  10. <p>Content of dialog</p>
  11. <p>Content of dialog</p>
  12. <p>Content of dialog</p>
  13. <p>Content of dialog</p>
  14. <p>Content of dialog</p>
  15. </lx-modal>
  16. </div>
  17. </div>
  18. </template>
  19. <script>
  20. export default {
  21. data() {
  22. return {
  23. // modal是否显示
  24. modalFlag: false,
  25. // 标题
  26. title: '我是标题'
  27. }
  28. },
  29. methods:{
  30. cancel() {
  31. this.modalFlag = false
  32. this.$Message.warning('取消成功')
  33. },
  34. ok() {
  35. this.$Message.loading('正在保存')
  36. this.$api.get('http://127.0.0.1:4000/api/list').then(res => {
  37. if(res.status >= 200) {
  38. this.$Message.success('保存成功')
  39. this.modalFlag = false
  40. }
  41. })
  42. }
  43. }
  44. }
  45. </script>

在上面使用了header那个具名插槽 和默认插槽 更改了插槽中原本的内容:关于插槽的知识点

效果如下:

点击打开modal那个按钮弹出对话框

点击右上角的xx, 取消、确定都会把对话框隐藏,并使用message组件提示用户 ,可以再这三个事件写自己的逻辑,比如点击确定发起请求等;

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号