vue3.0 + elementUI 弹窗二次封装

该文章展示了如何在Vue.js中封装一个自定义的弹窗组件<page-dialog>,该组件使用了el-dialog并支持自定义头部图标、标题和脚部按钮,包括关闭和保存操作。组件还包含了状态管理和父子组件间的通信,以及TS类型定义。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 使用组件:

 <page-dialog v-model:dialogShow="gisLock" footerCustom>
        {{gisLock}}
 </page-dialog>


 <page-dialog v-model:dialogShow="gisLock">
        {{gisLock}}
        <template #dialog-button>
          <el-button type="primary" plain @click="handleClose">
            <el-icon class="el-icon--left">
              <Close />
            </el-icon>返回
          </el-button>
        </template>
 </page-dialog>

 组件封装:

<template v-if="dialogVisible">
  <el-dialog v-model="dialogVisible" :width="width" :before-close="handleClose">
    <template #header>
      <div class="dialogTitle">
        // 弹窗名称前面都有一个icon  名称不icon也不一样, #header 可以根据自己的需求调整
        <el-icon v-if="header.icon" :class="selectClass()"></el-icon>
        <span>{{ header.title }}</span>
      </div>
    </template> 
    <slot></slot>  
     <template #footer v-if="footerCustom">
      <div class="dialog-footer">
        <el-button type="primary" plain @click="handleClose">
          <el-icon class="el-icon--left">
            <Close />
          </el-icon>取消
        </el-button>
        <el-button type="primary" @click="saveBtnFn">
          <el-icon class="el-icon--left">
            <Check />
          </el-icon>确定
        </el-button>
      </div>
    </template>
    <template #footer v-else>
      <div class="dialog-footer">
        <slot name="dialog-button"></slot>
      </div>
    </template> 
  </el-dialog>
</template>
<script lang="ts">
import { defineComponent, reactive, toRefs, watch } from "vue";
export default defineComponent({
  name: "PageDialog",
  props: {
    dialogShow: {
      type: Boolean,
      default: false,
    },
    header: {
      type: Object,
      default: {
        icon: "",
        title: "",
      },
    },
    width: {
      type: String,
      default: "40%",
    },
    footerCustom: {
      type: Boolean,
      default: false,
    },
  },  
  setup(props, { emit }) {
    // 数据
    const state = reactive({
      dialogVisible: false,
    });
    // 方法
    const methods = reactive({ 
      selectClass: () => {
        let icon = "";
        if (props.header.icon) {
          icon = "iconfont " + props.header.icon;
        }
        return icon;
      },
      handleClose: () => {
        state.dialogVisible = false;
      },
      saveBtnFn: () => {
        emit("saveBtnFn");
      },
    });
    watch(
      () => state.dialogVisible,
      (val) => { 
        //查看子组件值是否变化,在赋值给父组件
        emit("update:dialogShow", val);
      }
    );
    watch(
      () => props.dialogShow,
      (val) => {
        //查看父组件值是否变化,在赋值给子组件
        state.dialogVisible = val;
      }
    );
    return {
      ...toRefs(state),
      ...toRefs(methods),
    };
  },
});
</script> 
<style scoped>
.dialog-footer{
    text-align: center;
}
</style>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值