Files
certd/packages/ui/certd-client/src/vben/menu-ui/hooks/use-menu-context.ts
T
2025-06-29 14:09:09 +08:00

51 lines
1.2 KiB
TypeScript

import type { MenuProvider, SubMenuProvider } from "../types";
import { getCurrentInstance, inject, provide } from "vue";
import { findComponentUpward } from "../utils";
const menuContextKey = Symbol("menuContext");
/**
* @zh_CN Provide menu context
*/
function createMenuContext(injectMenuData: MenuProvider) {
provide(menuContextKey, injectMenuData);
}
/**
* @zh_CN Provide menu context
*/
function createSubMenuContext(injectSubMenuData: SubMenuProvider) {
const instance = getCurrentInstance();
provide(`subMenu:${instance?.uid}`, injectSubMenuData);
}
/**
* @zh_CN Inject menu context
*/
function useMenuContext() {
const instance = getCurrentInstance();
if (!instance) {
throw new Error("instance is required");
}
const rootMenu = inject(menuContextKey) as MenuProvider;
return rootMenu;
}
/**
* @zh_CN Inject menu context
*/
function useSubMenuContext() {
const instance = getCurrentInstance();
if (!instance) {
throw new Error("instance is required");
}
const parentMenu = findComponentUpward(instance, ["Menu", "SubMenu"]);
const subMenu = inject(`subMenu:${parentMenu?.uid}`) as SubMenuProvider;
return subMenu;
}
export { createMenuContext, createSubMenuContext, useMenuContext, useSubMenuContext };