createNode.ts 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. // 1. 用于解决keep-alive需要name的问题,动态生成随机name供keep-alive使用
  2. // 2. 用于解决transition动画内部结点只能为根元素的问题,单文件可写多结点
  3. import {defineComponent, h, createVNode, defineAsyncComponent} from 'vue'
  4. import {useUserStore} from "@/pinia/user-store";
  5. const no404 = defineAsyncComponent(() => import('@/views/system/404.vue'))
  6. export function createNameComponent(component: Promise<any>, componentName: string, needUserInfo = false) {
  7. return () => {
  8. return new Promise(async (resolve, reject) => {
  9. const name = componentName ?? 'vueAdminBox' + Date.now()
  10. function next() {
  11. // @ts-ignore
  12. component().then(async (comm) => {
  13. resolve(createBlank(comm.default, name))
  14. })
  15. }
  16. if (needUserInfo) {
  17. await useUserStore().getUserInfo.then((res) => {
  18. if (res) {
  19. next();
  20. } else {
  21. resolve(createBlank(no404, name))
  22. return
  23. }
  24. })
  25. }
  26. next()
  27. })
  28. }
  29. }
  30. function createBlank(defaultComponent: any, name: string) {
  31. return defineComponent({
  32. name,
  33. render() {
  34. const children = [createVNode(defaultComponent)]
  35. return h('div', {
  36. style: {
  37. height: '100%',
  38. width: '100%'
  39. }
  40. }, children)
  41. },
  42. })
  43. }