在每次使用confirm组件时都要写个标签,再一顿操作,感觉很繁琐
今天我便花了一点时间封装了一个函数式调用的confirm组件
成果:
实现代码:
1. confirm组件
// confirm.vue
<script lang="ts" setup>
const props = withDefaults(
defineProps<{
title?: string
content?: string
confirmText?: string
closeText?: string
outClose?: boolean
confirmFn: Function
closeFn: Function
}>(),
{
title: '提醒',
content: '确认删除?',
confirmText: '确认',
closeText: '取消',
outClose: true,
confirmFn: () => {
console.log('confirm')
},
closeFn: () => {
console.log('cancel')
}
}
)
const show = ref(true)
const cancelPop = (value = false) => {
if(value && props.outClose) {
show.value = false
}
}
</script>
2.实例化组件:
// confirm.js
import confirm from '@/components/confirm/confirm.vue'
import { createApp } from 'vue'
export default ({ title, content, confirmText, closeText, outClose }) => {
return new Promise((reslove, reject) => {
const instance = createApp(confirm, {
title,
content,
confirmText,
closeText,
outClose,
confirmFn: () => {
closeUnmount()
reslove()
},
closeFn: () => {
closeUnmount()
reject()
}
})
// 创建一个节点
const vnode = document.createElement('div')
// 添加到body元素上
document.body.appendChild(vnode)
// 实例挂载到节点上
instance.mount(vnode)
// 关闭状态
// 注册实例并移除节点
function closeUnmount() {
instance.unmount(vnode)
document.body.removeChild(vnode)
}
})
}
3.使用组件:
// 使用弹窗
const openConfirm = () => {
confirm({title: '我是传进来的title', confirmText: '自定义确认文字'}).then(() => {
console.log('点击确认了');
}).catch(() => {
console.log('点击取消了');
})
}