Flowbite下拉菜单Bug:为何点击两次才弹出编辑模态框?
问题原因
你的编辑按钮通过v-bind:data-modal-target和v-bind:data-modal-toggle绑定了contentToEdit的状态,第一次点击时会出现以下问题:
contentToEdit刚被赋值,按钮上的data-modal-target和data-modal-toggle属性还未生成(绑定表达式是contentToEdit ? modalEditId : undefined)- 模态框通过
v-if="contentToEdit"渲染,此时DOM还未完成更新,模态框尚未存在于页面中 - 依赖data属性的模态框触发逻辑找不到目标元素,所以点击无反应
第二次点击时,contentToEdit已有值,按钮的data属性已生成,模态框也已渲染完成,因此能正常触发。
解决方案
方案1:移除按钮的条件绑定,直接固定data属性
modalEditId是固定值,不需要依赖contentToEdit的状态,直接给按钮绑定固定的目标ID:
<button @click="openModalEdit(el)" :key="el.id" type="button" :data-modal-target="modalEditId" :data-modal-toggle="modalEditId" class="flex w-full items-center px-4 py-2 text-gray-700 hover:bg-gray-100 dark:text-gray-200 dark:hover:bg-gray-600 dark:hover:text-white" > <!-- 图标和文字内容不变 --> </button>
模态框保持v-if="contentToEdit"即可,第一次点击后contentToEdit赋值完成,模态框渲染出来,触发逻辑就能找到目标元素。
方案2:改用v-show渲染模态框
把模态框的v-if改成v-show,让模态框始终存在于DOM中(仅隐藏状态):
<ModalCreateEdit v-show="contentToEdit" :key="contentToEdit?.id" type="edit" :id="modalEditId" :content-to-edit="contentToEdit" />
第一次点击时,contentToEdit赋值完成后,nextTick确保DOM更新,按钮的data属性生成,模态框已在DOM中,触发逻辑能直接找到并显示它。
方案3:手动调用模态框显示方法(推荐)
不依赖data属性的自动触发,通过代码直接控制模态框显隐。首先给模态框添加ref:
<ModalCreateEdit ref="editModalRef" v-if="contentToEdit" :key="contentToEdit.id" type="edit" :id="modalEditId" :content-to-edit="contentToEdit" />
然后在openModalEdit中手动调用模态框的显示方法(需确保ModalCreateEdit组件提供了对应的方法,比如show):
const editModalRef = ref<InstanceType<typeof ModalCreateEdit>>(); const contentToEdit = ref<Content>(); const openModalEdit = async (newContent: Content) => { contentToEdit.value = { ...newContent }; await nextTick(); editModalRef.value?.show(); };
这种方式完全绕过data属性的依赖,逻辑更直接可靠。
内容的提问来源于stack exchange,提问作者Risan
相关产品推荐
相关产品推荐

