@@ -94,7 +95,7 @@ export default defineComponent({
default: () => ({})
}
},
- emits: ['update:open', 'open', 'close'],
+ emits: ['update:open'],
setup (props, { emit }) {
const { ui, attrs } = useUI('popover', toRef(props, 'ui'), config, toRef(props, 'class'))
@@ -102,8 +103,8 @@ export default defineComponent({
const [trigger, container] = usePopper(popper.value)
- // https://github.com/tailwindlabs/headlessui/blob/f66f4926c489fc15289d528294c23a3dc2aee7b1/packages/%40headlessui-vue/src/components/popover/popover.ts#L151
const popover = ref
(null)
+ // https://github.com/tailwindlabs/headlessui/blob/f66f4926c489fc15289d528294c23a3dc2aee7b1/packages/%40headlessui-vue/src/components/popover/popover.ts#L151
const popoverApi = ref(null)
let openTimeout: NodeJS.Timeout | null = null
@@ -116,6 +117,10 @@ export default defineComponent({
}
const popoverProvidesSymbols = Object.getOwnPropertySymbols(popoverProvides)
popoverApi.value = popoverProvidesSymbols.length && popoverProvides[popoverProvidesSymbols[0]]
+
+ if (props.open) {
+ popoverApi.value?.togglePopover()
+ }
})
const containerStyle = computed(() => {
@@ -170,9 +175,22 @@ export default defineComponent({
}, props.closeDelay)
}
+ watch(() => props.open, (newValue: boolean, oldValue: boolean) => {
+ if (!popoverApi.value) return
+ if (oldValue === undefined || newValue === oldValue) return
+
+ if (newValue) {
+ // No `openPopover` method and `popoverApi.value.togglePopover` won't work because of the `watch` below
+ popoverApi.value.popoverState = 0
+ } else {
+ popoverApi.value.closePopover()
+ }
+ })
+
watch(() => popoverApi.value?.popoverState, (newValue: number, oldValue: number) => {
- if (oldValue === undefined) return
- emit(newValue === 0 ? 'open' : 'close')
+ if (oldValue === undefined || newValue === oldValue) return
+
+ emit('update:open', newValue === 0)
})
return {