Vuetify 3 | v-dialog:在通过代码打开后将对话框关闭

前端开发 2026-07-11

我有这个 v-dialog 组件:

<v-dialog v-model="dialog" @afterEnter="open">        
    <template #activator="{ props: activatorProps }">
            <slot name="activator" v-bind="activatorProps">
                <v-btn
                    v-bind="activatorProps"
                    :disabled="!Boolean(props.itemId)"
                    class="my-auto"
                >
                    Container Management
                </v-btn>
            </slot>
        </template>
</v-dialog>
<script lang="ts" setup>
const dialog = ref(false)
const open = async () => {
    try {
        // Some API calls
    } catch(){
        dialog.value = false
    }
}
</script>

当我尝试在API调用失败时关闭它,它不会关闭。我是通过activator插槽打开对话框的(不确定这是否会有影响)。

解决方案

afterEnter 并不是用来控制对话框显示与否的好地方。它主要用于副作用,而不是用于取消对话框。

要修复它,你可以改用 watch 代替 afterEnter

watch(dialog, async (val) => {
if (!val) return

try {
    await someApi()
} catch {
    dialog.value = false
}
})

或者更好的做法是在打开对话框之前就执行你的逻辑,将API调用移出对话框的生命周期,大致像这样:

<template #activator="{ props: activatorProps }">
<v-btn
  v-bind="activatorProps"
 :disabled="!Boolean(props.itemId)"
    class="my-auto"
    @click="handleOpen"
  >
    Container Management
</v-btn>
</template>
const dialog = ref(false)

const handleOpen = async () => {
try {
    // API call first
    await someApi()

    // Only open if success
    dialog.value = true
} catch {
    dialog.value = false
  }
}
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章