Vue+Element实现封装抽屉弹框

 更新时间:2023年06月12日 09:00:54   作者:山水有轻音  
这篇文章主要为大家详细介绍了如何利用Vue和Element实现简单的抽屉弹框效果,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

一进行showDrawer()封装

新建dialog.js

// 弹框模板
import Vue from 'vue';
import { Drawer } from 'element-ui';
const modalTemplate = `
  <el-drawer :visible.sync="visible" :title="title" :size="size" :direction="direction">
    <component :is="component" v-bind="props" @ok="handleOk" @cancel="handleCancel"></component>
  </el-drawer>
`
// 弹框构造函数
const ModalConstructor = Vue.extend({
  template: modalTemplate,
  data() {
    return {
      visible: false,
      title: '',
      size: '70%',
      direction: 'rtl',
      component: null,
      props: null,
      resolve: null,
      reject: null,
    }
  },
  methods: {
    show(component, props, options) {
      this.visible = true
      this.component = component
      this.props = props || {}
      this.title = options.title || '提示'
      this.size = options.width || '70%'
      this.direction = options.direction || 'rtl'
      return new Promise((resolve, reject) => {
        this.resolve = resolve
        this.reject = reject
      })
    },
    hide() {
      this.visible = false
    },
    handleOk(res) {
      this.resolve(res)
      this.hide()
    },
    handleCancel() {
      this.reject()
      this.hide()
    },
  },
})
// 创建组件实例并挂载到文档中
const Modal = new ModalConstructor().$mount()
document.body.appendChild(Modal.$el)
// $showDrawer 方法
Vue.prototype.$showDrawer = function (component, props, options) {
  return Modal.show(component, props, options)
}
// $showDialog 方法
Vue.prototype.$showDialog = function (component, props, options) {
  return new Promise((resolve, reject) => {
    let MyDialogConstructor = Vue.extend({
      components: {
        'my-dialog': component
      },
      template: `<el-dialog :visible.sync="visible" :title="title" :width="width" :before-close="beforeClose">
                    <my-dialog :props="props" @ok="handleOk" @cancel="handleCancel"></my-dialog>
                  </el-dialog>`,
      data() {
        return {
          visible: true,
          title: options.title || '提示',
          width: options.width || '50%',
          props: props,
          resolve: resolve,
          reject: reject,
        }
      },
      methods: {
        hide() {
          this.visible = false
        },
        handleOk(res) {
          this.resolve(res)
          this.hide()
        },
        handleCancel() {
          this.reject()
          this.hide()
        },
        beforeClose(done) {
          ElementUI.MessageBox.confirm('确认关闭?').then(() => {
            done()
          }).catch(() => {})
        },
      },
    })
    let MyDialog = new MyDialogConstructor().$mount()
    document.body.appendChild(MyDialog.$el)
  })
}

在上面的代码中,我们首先定义了一个 modalTemplate 模板,使用 Element UI 的 Drawer 和组件插槽来实现弹框内容的展示,并添加了一些我们需要的属性和方法。 然后定义了一个 ModalConstructor 构造函数,通过 show 方法来打开弹框,并返回 Promise 来等待用户的操作,最后返回用户的操作结果。

在 show 方法中,我们通过传入组件和 props 的方式来动态渲染组件,并设置其他选项,如弹框的标题、大小、方向等。

## 2在main.js里引入dialog.js
```js
import '@util/dialog'

如何使用

// 调用 $showDrawer 方法
this.$showDrawer(ExamDetail, {
  examId: rowId
}, {
  title: '考试详情',
  width: '1200px',
}).then(() => {
  this.searchForm()
})
// 调用 $showDialog 方法
this.$showDialog(ExamDetail, {
  examId: rowId
}, {
  title: '考试详情',
  width: '1200px',
}).then(() => {
  this.searchForm()
})

到此这篇关于Vue+Element实现封装抽屉弹框的文章就介绍到这了,更多相关Vue Element抽屉弹框内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 解决Vue.js由于延时显示了{{message}}引用界面的问题

    解决Vue.js由于延时显示了{{message}}引用界面的问题

    今天小编就为大家分享一篇解决Vue.js由于延时显示了{{message}}引用界面的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-08-08
  • 如何在Vue3和Vite项目中用SQLite数据库进行数据存储

    如何在Vue3和Vite项目中用SQLite数据库进行数据存储

    SQLite是一种嵌入式关系型数据库管理系统,是一个零配置、无服务器的、自给自足的、事务性的SQL数据库引擎,这篇文章主要给大家介绍了关于如何在Vue3和Vite项目中用SQLite数据库进行数据存储的相关资料,需要的朋友可以参考下
    2024-03-03
  • vue.js 实现a标签href里添加参数

    vue.js 实现a标签href里添加参数

    今天小编就为大家分享一篇vue.js 实现a标签href里添加参数,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • Vue下载不同文件的几种方式总结

    Vue下载不同文件的几种方式总结

    在Vue项目中实现文件下载有多种方式,包括使用window.open、<a>标签、axios、FetchAPI、自定义$download方法以及创建a标签等,每种方法都有其适用场景,开发者可以根据项目需求选择最合适的方式
    2025-01-01
  • vue中使用console.log打印的实现

    vue中使用console.log打印的实现

    这篇文章主要介绍了vue中使用console.log打印的实现方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-04-04
  • Vue项目启动时的端口占用问题分析与解决方案

    Vue项目启动时的端口占用问题分析与解决方案

    你有没有遇到过这种情况:当你满怀期待地输入 npm run serve,准备启动 Vue 项目时,突然蹦出一堆红色错误信息,其中最显眼的就是 EADDRINUSE?本文我们就来深入分析这个问题,并手把手教你如何解决它,需要的朋友可以参考下
    2025-09-09
  • Vue组件的渲染流程详细讲解

    Vue组件的渲染流程详细讲解

    在Vue核心中除了响应式原理外,视图渲染也是重中之重,下面这篇文章主要给大家介绍了关于Vue组件的渲染流程,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-06-06
  • Vue 打包后相对路径的引用问题

    Vue 打包后相对路径的引用问题

    这篇文章主要介绍了VUE 打包后相对路径的引用问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • sockjs-node/info跨域请求问题及解决过程

    sockjs-node/info跨域请求问题及解决过程

    这篇文章主要介绍了sockjs-node/info跨域请求问题及解决过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2026-03-03
  • Vue的Scroll滚动事件触发方式

    Vue的Scroll滚动事件触发方式

    这篇文章主要介绍了Vue的Scroll滚动事件触发方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-04-04

最新评论