import { ref, inject, computed, onUnmounted, type InjectionKey, getCurrentInstance, type ComponentPublicInstance, type ComponentInternalInstance } from 'vue' type ParentProvide = T & { link(child: ComponentInternalInstance): void unlink(child: ComponentInternalInstance): void children: ComponentPublicInstance[] internalChildren: ComponentInternalInstance[] } export function useParent(key: InjectionKey>) { const parent = inject(key, null) if (parent) { const instance = getCurrentInstance()! const { link, unlink, internalChildren } = parent link(instance) onUnmounted(() => unlink(instance)) const index = computed(() => internalChildren.indexOf(instance)) return { parent, index } } return { parent: null, index: ref(-1) } }