Vue弹窗封装

一、vue2.0

<template>
  <div class="na-dialog">
    <el-dialog :title="datas.title" v-model="innerVisible" :width="datas.width" @close="btnClick(datas.close)"
      @opened="btnClick(datas.open)">
      <slot></slot>
      <template #footer>
        <span class="dialog-footer">
          <el-button @click="innerVisible = false" size="small">取消</el-button>
          <template v-for="item in datas.btns">
            <el-button type="primary" @click="btnClick(item.methods)" size="small">{{ item.label }}</el-button>
          </template>
        </span>
      </template>
    </el-dialog>
  </div>
</template>
<script>
  export default {
    props: {
      visible: { //绑定显隐的字段
        type: Boolean,
        default: false
      },
      datas: {
        type: Object,
        default: { //弹窗数据
          title: '弹窗名称', //弹窗名称
          width: '70%', //弹窗宽度
          close: 'closeDialog', //弹窗关闭后调用
          btns: [ //按钮-取消不需要
            {
              label: '保存',
              methods: 'save'
            }
          ]
        }
      }
    },
    computed: {
      innerVisible: {
        get() {
          return this.visible
        },
        set(val) {
          debugger
          this.$emit('update:visible', val)
        }
      },
    },
    methods: {
      btnClick(key) {
        if (key) {
          this.$nextTick(() => {
            this.$parent[key]();
          })
        }
      },
    },
  }
</script>

<style lang="scss" scoped>
  .na-dialog {
    :deep(.el-dialog) {
      .el-dialog__body {
        padding: 0 !important;
        height: calc(100% - 90px);
      }
    }
  }
</style>
<na-dialog :visible.sync="visible" :data="dialog"></na-dialog>

父组件需要加入closeDialog方法、save方法

二、vue3.0弹窗封装

 

<template>
  <div class="na-dialog">
    <el-dialog :title="datas.title" v-model="innerVisible" :width="datas.width"
      @close="btnClick(datas.close)" @opened="btnClick(datas.open)">
      <slot></slot>
      <template #footer>
        <span class="dialog-footer">
          <el-button @click="innerVisible= false" size="small">取消</el-button>
          <template v-for="item in datas.btns">
            <el-button type="primary" @click="btnClick(item.methods)" size="small">{{ item.label }}</el-button>
          </template>
        </span>
      </template>
    </el-dialog>
  </div>
</template>
<script>
  import {
    reactive,
    toRefs,
    computed,
    getCurrentInstance,
    nextTick,
  } from "vue";
  export default {
    props: {
      visible: {//绑定显隐的字段
        type: Boolean,
        default: false
      },
      datas: {
        type: Object,
        default: {//弹窗数据
          title: '弹窗名称',//弹窗名称
          width: '70%', //弹窗宽度
          close: 'closeDialog', //弹窗关闭后调用
          btns: [ //按钮-取消不需要
            {
              label: '保存',
              methods: 'save'
            }
          ]
        }
      }
    },
    setup(props, context) {
      const state = reactive({});
      const instance = getCurrentInstance();
      const {
        proxy
      } = instance;
      const {
        visible
      } = toRefs(props);
      let innerVisible = computed({
        get: () => visible.value,
        set: (val) => {
          context.emit("update:visible", val);
        },
      })
      //按钮按下
      const btnClick = (key) => {
        if (key) {
          nextTick(()=>{
            proxy.$parent[key]();
          })
        }
      }
      return {
        ...toRefs(state),
        innerVisible,
        btnClick
      };
    }
  }
</script>

<style lang="scss" scoped>
  .na-dialog {
    :deep(.el-dialog) {
      .el-dialog__body {
        padding: 0 !important;
        height: calc(100% - 90px);
      }
    }
  }
</style>
<na-dialog v-model:visible="dialog.visible" :data="dialog"></na-dialog>

引入没什么不同,只是参数有一点区别,一个是参数后加.sync一个是参数前加v-model:

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值