import { getCurrentInstance, type Ref, reactive } from 'vue'; import { useRoute, useRouter } from 'vue-router'; import { service } from '../service'; import { useBrowser } from './browser'; import { useMitt } from './mitt'; // 创建一个响应式的 refs 对象,并提供设置 refs 的方法 export function useRefs() { const refs = reactive<{ [key: string]: any }>({}); // 设置 refs 的方法,返回一个函数用于更新特定 ref function setRefs(name: string) { return (el: any) => { refs[name] = el; return () => refs[name]; // 返回一个函数用于获取当前 ref }; } return { refs, setRefs }; } // 获取指定名称的父组件实例,并将其暴露的属性赋值给传入的 Ref export function useParent(name: string, r: Ref) { const instance = getCurrentInstance(); if (instance) { let parent = instance.proxy?.$.parent; // 遍历父组件链,直到找到匹配的组件名称 while (parent && parent.type?.name !== name) { parent = parent?.parent; } // 如果找到匹配的父组件,将其暴露的属性赋值给 Ref if (parent && parent.type.name === name) { r.value = parent.exposed; } } return r; } // 组合多个功能模块,返回一个包含服务、路由、事件总线等的对象 export function useCool() { return { service, route: useRoute(), router: useRouter(), mitt: useMitt(), ...useBrowser(), ...useRefs() }; } // 导出其他模块的功能 export * from './browser'; export * from './hmr'; export * from './mitt';