将el-dialog封装成函数调用

1、 使用Vue实例化方法

javascript 复制代码
// MyDialog.js
import Vue from 'vue'
export const openFormDialog = function ({ props = {}, events = {} }) {
  const vm = new Vue({
    data () {
      return {
        form: {}
      }
    },
    render () {
      return (
        <el-dialog
          visible={true}
          {...{ props }}
          {...{ on: events }}
          onClose={() => handleEvent('close')}
        >
          <el-form label-width='80px'>
            <el-form-item label='活动名称'>
              <el-input v-model={this.form.name}></el-input>
            </el-form-item>
            <el-form-item label='活动区域'>
              <el-select v-model={this.form.region} placeholder='请选择活动区域'>
                <el-option label='区域一' value='shanghai'></el-option>
                <el-option label='区域二' value='beijing'></el-option>
              </el-select>
            </el-form-item>
          </el-form>
          <span slot='footer' class="dialog-footer">
            <el-button onClick={() => { handleEvent('cancel') } }>取 消</el-button>
            <el-button type="primary" onClick={() => handleEvent('confirm', this.form) }>确 定</el-button>
          </span>
        </el-dialog>
      )
    }
  }).$mount()

  const close = () => {
    document.body.removeChild(vm.$el)
    vm.$destroy()
  }

  const handleEvent = async (eventName, form) => {
    await events[eventName] && typeof events[eventName] === 'function' && events[eventName](form)
    close()
  }

  document.body.appendChild(vm.$el)
}

2、使用Vue.extend方法

javascript 复制代码
// MyDialog.vue
<template>
  <el-dialog
    :visible.sync="dialogVisible"
    v-bind="options.props"
    v-on="options.events"
  >
    <el-form label-width='80px'>
      <el-form-item label='活动名称'>
        <el-input v-model="form.name"></el-input>
      </el-form-item>
      <el-form-item label='活动区域'>
        <el-select v-model="form.region" placeholder='请选择活动区域'>
          <el-option label='区域一' value='shanghai'></el-option>
          <el-option label='区域二' value='beijing'></el-option>
        </el-select>
      </el-form-item>
    </el-form>
    <span slot="footer" class="dialog-footer">
      <el-button @click="dialogVisible = false">取 消</el-button>
      <el-button type="primary" @click="onConfirm">确 定</el-button>
    </span>
  </el-dialog>
</template>

<script>
export default {
  data () {
    return {
      dialogVisible: true,
      options: {
        props: {
          width: '30%'
        },
        events: {}
      },
      form: {}
    }
  },
  methods: {
    setAttrs (options) {
      this.options = { ...options }
    },
    async onConfirm () {
      await this.options.events.confirm && typeof this.options.events.confirm === 'function' && this.options.events.confirm(this.form)
      this.dialogVisible = false
    }
  }
}
</script>
javascript 复制代码
// MyDialog.js
import Vue from 'vue'
import Dialog from './VDialog.vue'
export const openFormDialog = function (options) {
  const DialogConstructor = Vue.extend(Dialog)
  const instance = new DialogConstructor()
  instance.setAttrs(options)
  instance.$mount()
  document.body.appendChild(instance.$el)
}

3、注册使用

javascript 复制代码
// main.js
import { openFormDialog } from './components/MyDialog.js'
Vue.prototype.$openFormDialog = openFormDialog
javascript 复制代码
// 调用方法
this.$openFormDialog({
   props: {
     title: '测试标题',
     width: '30%',
     beforeClose (done) {
       done()
     }
   },
   events: {
     close () {
       console.log('close')
     },
     cancel () {
       console.log('cancel')
     },
     confirm (form) {
       console.log(form)
     }
   }
 })

以上为简单例子,可根据场景进行优化,期望各位留言告知是否有更好的实现方法

相关推荐
人工智能训练42 分钟前
【极速部署】Ubuntu24.04+CUDA13.0 玩转 VLLM 0.15.0:预编译 Wheel 包 GPU 版安装全攻略
运维·前端·人工智能·python·ai编程·cuda·vllm
会跑的葫芦怪1 小时前
若依Vue 项目多子路径配置
前端·javascript·vue.js
xiaoqi9222 小时前
React Native鸿蒙跨平台如何进行狗狗领养中心,实现基于唯一标识的事件透传方式是移动端列表开发的通用规范
javascript·react native·react.js·ecmascript·harmonyos
jin1233223 小时前
React Native鸿蒙跨平台剧本杀组队消息与快捷入口组件,包含消息列表展示、快捷入口管理、快捷操作触发和消息详情预览四大核心功能
javascript·react native·react.js·ecmascript·harmonyos
烬头88214 小时前
React Native鸿蒙跨平台实现二维码联系人APP(QRCodeContactApp)
javascript·react native·react.js·ecmascript·harmonyos
pas1364 小时前
40-mini-vue 实现三种联合类型
前端·javascript·vue.js
摇滚侠4 小时前
2 小时快速入门 ES6 基础视频教程
前端·ecmascript·es6
2601_949833394 小时前
flutter_for_openharmony口腔护理app实战+预约管理实现
android·javascript·flutter
珑墨5 小时前
【Turbo】使用介绍
前端
军军君015 小时前
Three.js基础功能学习十三:太阳系实例上
前端·javascript·vue.js·学习·3d·前端框架·three