This commit is contained in:
oneao committed 2025-09-21 21:52:08 +08:00
1 parent d37d92996a
commit a8f3e58a27
25 files changed
+1401 -399

No files matched your search

@@ -20,7 +20,7 @@ export default defineComponent({
type: [String, Object, Function] as unknown as () => string | VNode | (() => VNode),
required: false,
},
beforeConfirm: {
onBeforeConfirm: {
type: Function as PropType<
(done: (ok: boolean) => void) => void | boolean | Promise<boolean>
>,
@@ -69,23 +69,37 @@ export default defineComponent({
return val
}
let promiseNumber = 0
const handleConfirm = async () => {
const currentPromiseNumber = ++promiseNumber
let allow = true
if (props.beforeConfirm) {
if (props.onBeforeConfirm) {
confirmLoading.value = true
try {
allow = await new Promise<boolean>((resolve) => {
const result = props.beforeConfirm!(ok => resolve(ok))
let called = false
const done = (ok: boolean) => {
if (!called) {
called = true
resolve(ok)
}
}
const result = props.onBeforeConfirm!(done)
if (typeof result === 'boolean') {
resolve(result)
done(result)
}
else if (result instanceof Promise) {
result.then(ok => resolve(ok)).catch(() => resolve(false))
result
.then(ok => done(ok ?? true))
.catch(() => done(false))
}
// 如果是用 done 回调,就等调用方触发 resolve
// 如果使用 done 回调,resolve 会在调用方触发
})
}
catch {
@@ -93,12 +107,12 @@ export default defineComponent({
}
}
if (allow) {
popVisible.value = false
emit('confirm')
if (currentPromiseNumber === promiseNumber) {
if (allow) {
emit('confirm')
}
confirmLoading.value = false
}
confirmLoading.value = false
}
const handleCancel = () => {