use-menu-context.ts 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. import type { MenuProvider, SubMenuProvider } from '../types';
  2. import { getCurrentInstance, inject, provide } from 'vue';
  3. import { findComponentUpward } from '../utils';
  4. const menuContextKey = Symbol('menuContext');
  5. /**
  6. * @zh_CN Provide menu context
  7. */
  8. function createMenuContext(injectMenuData: MenuProvider) {
  9. provide(menuContextKey, injectMenuData);
  10. }
  11. /**
  12. * @zh_CN Provide menu context
  13. */
  14. function createSubMenuContext(injectSubMenuData: SubMenuProvider) {
  15. const instance = getCurrentInstance();
  16. provide(`subMenu:${instance?.uid}`, injectSubMenuData);
  17. }
  18. /**
  19. * @zh_CN Inject menu context
  20. */
  21. function useMenuContext() {
  22. const instance = getCurrentInstance();
  23. if (!instance) {
  24. throw new Error('instance is required');
  25. }
  26. const rootMenu = inject(menuContextKey) as MenuProvider;
  27. return rootMenu;
  28. }
  29. /**
  30. * @zh_CN Inject menu context
  31. */
  32. function useSubMenuContext() {
  33. const instance = getCurrentInstance();
  34. if (!instance) {
  35. throw new Error('instance is required');
  36. }
  37. const parentMenu = findComponentUpward(instance, ['Menu', 'SubMenu']);
  38. const subMenu = inject(`subMenu:${parentMenu?.uid}`) as SubMenuProvider;
  39. return subMenu;
  40. }
  41. export {
  42. createMenuContext,
  43. createSubMenuContext,
  44. useMenuContext,
  45. useSubMenuContext,
  46. };