| 1234567891011121314151617181920212223242526272829303132333435363738394041 |
- 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,
- index: ref(-1)
- }
- }
|