You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
33 lines
811 B
TypeScript
33 lines
811 B
TypeScript
import { ref, inject, computed, onUnmounted, InjectionKey, getCurrentInstance, ComponentPublicInstance, 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)
|
|
}
|
|
}
|