vue3构建Dialog通用组件

Dialog组件和上篇Confirm组件的思路类似,区别在于:1、内容可以自定义;2、不需要使用函数式构建方法。这里利用vue3提供的Teleport组件将其插入到body中,代码如下:

<template>
  <Teleport to="body">
    <div class="dialog">
      <transition name="fade">
        <div class="mask" v-if="modelValue" @click="close"></div>
      </transition>
      <transition name="upsd">
        <div class="detail" v-if="modelValue">
          <div class="title" v-if="title">
            {{ title }}
          </div>
          <div class="content">
            <slot />
          </div>

          <div class="btn-group" v-if="cancelHandle || confirmHandle">
            <m-button type="primary" @click="cancel">{{ cancelText }}</m-button>
            <m-button @click="confirm">{{ confirmText }}</m-button>
          </div>
        </div>
      </transition>
    </div>
  </Teleport>
</template>
<script lang="ts" setup>
import { onMounted, ref, watch } from 'vue'
const props = defineProps({
  modelValue: {
    type: Boolean,
    required: true
  },
  title: String,
  cancelText: {
    type: String,
    default: '取消'
  },
  confirmText: {
    type: String,
    default: '确定'
  },
  cancelHandle: Function,
  confirmHandle: Function,
  close: Function
})
const emit = defineEmits(['update:modelValue'])
const close = () => {
  emit('update:modelValue', false)
  props.close && props.close()
}
const cancel = () => {
  props.cancelHandle && props.cancelHandle()
  close()
}
const confirm = () => {
  props.confirmHandle && props.confirmHandle()
  close()
}
</script>

调用时

    <m-dialog
      v-model="isVisible"
      title="标题"
      :cancel-handle="test('取消')"
      :confirm-handle="test('确定')"
      :close="test('关闭')"
    >
      <span>内容</span>
    </m-dialog>

效果如下

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值