UNPKG

@tplc/wot

Version:

42 lines (34 loc) 852 B
import { ref, inject, computed, onUnmounted, type InjectionKey, getCurrentInstance, type ComponentPublicInstance, type ComponentInternalInstance, } from 'vue' type ParentProvide<T> = T & { link(child: ComponentInternalInstance): void unlink(child: ComponentInternalInstance): void children: ComponentPublicInstance[] internalChildren: ComponentInternalInstance[] } export function useParent<T>(key: InjectionKey<ParentProvide<T>>) { 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 as any, index: ref(-1), } }