vue中封装el-dialog弹窗(对话框)

index.vue

<template>
  <div>
    <PopUp v-if="visible" :visible.sync="visible" :obejct-data="obejctData" @updateVisible="updateVisibleId" />
  </div>
</template>

<script>
import PopUp from './PopUp.vue'
export default {
  components: {
    PopUp
  },
  data() {
    return {
      visible: false,
      obejctData: {}
    }
  },
  created() {
    setTimeout(() => {
      //弹出
      this.visible = true
      this.obejctData = {
        type: 'add'
      }
    }, 1000)
  },
  methods: {
    updateVisibleId(val) {
      this.visible = val
    }
  }
}
</script>

<style></style>

popup.vue

<template>
  <div>
    <el-dialog :visible.sync="dialogVisible" width="70%">
      <div class="center">
        <p>my name is popup</p>
      </div>
    </el-dialog>
  </div>
</template>

<script>
export default {
  props: {
    visible: {
      type: Boolean,
      default: false
    },
    //传递的参数信息
    obejctData: {
      type: Object,
      default: () => {}
    }
  },
  computed: {
    dialogVisible: {
      get() {
        return this.visible
      },
      set(val) {
        this.$emit('updateVisible', val)
      }
    }
  },
  created() {
    console.log(this.obejctData)
  }
}
</script>

### 封装 `el-dialog` 组件以创建可复用的弹窗 #### 1. 创建基础 Dialog 组件 为了使 `el-dialog` 更加灵活并适用于不同的业务逻辑,可以将其封装成一个新的组件。这不仅提高了代码的重用率,还简化了后续维护工作。 ```vue <!-- BaseDialog.vue --> <template> <el-dialog :visible.sync="dialogVisible" @close="handleClose"> <!-- 对话框标题插槽 --> <template v-slot:title> <slot name="title"></slot> </template> <!-- 对话框主体内容插槽 --> <div class="dialog-body"> <slot></slot> </div> <!-- 底部操作按钮区插槽,默认提供取消和确认两个按钮 --> <span slot="footer" class="dialog-footer"> <el-button @click="handleCancel">取 消</el-button> <el-button type="primary" @click="handleSubmit">确 定</el-button> </span> </el-dialog> </template> <script setup lang="ts"> import { defineProps, defineEmits } from 'vue'; const props = defineProps({ modelValue: Boolean, }); // 使用 emit 来触发父级更新可见状态的方法 const emit = defineEmits(['update:modelValue', 'submit']); function handleClose() { emit('update:modelValue', false); } function handleCancel() { emit('update:modelValue', false); } function handleSubmit() { emit('submit'); } </script> <style scoped> .dialog-body { padding: 20px; } </style> ``` 此部分描述了一个基本结构化的对话框模板[^2],其中包含了三个主要区域:标题、正文以及底部的操作按钮,并且允许外部传入自定义的内容。 #### 2. 在父组件中使用封装后的 Dialog 接下来,在实际应用中调用这个新的 `BaseDialog` 组件: ```vue <!-- ParentComponent.vue --> <template> <div> <el-button @click="showDialog = true">打开对话框</el-button> <!-- 调用封装好的 dialog 组件 --> <base-dialog :model-value="showDialog" @update:modelValue="val => showDialog = val" @submit="onSubmit"> <template #title>提示信息</template> 这里是对话框的具体内容... </base-dialog> </div> </template> <script setup lang="ts"> import { ref } from 'vue'; import BaseDialog from './components/BaseDialog.vue'; // 引入刚才创建的基础 Dialog 组件 let showDialog = ref(false); async function onSubmit() { console.log('提交表单...'); await new Promise(resolve => setTimeout(resolve, 1000)); console.log('处理完成!'); } </script> ``` 上述代码展示了如何在一个具体的页面上引入之前构建的 `BaseDialog` 并配置其行为方式。当点击“打开对话框”的按钮时,将会展示出一个带有默认样式的模态窗口;而一旦用户选择了“确定”,则会执行相应的回调函数来进行进一步的数据交互或其他动作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值