createNode.js 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. // 1. 用于解决keep-alive需要name的问题,动态生成随机name供keep-alive使用
  2. // 2. 用于解决transition动画内部结点只能为根元素的问题,单文件可写多结点
  3. import { defineComponent, h, createVNode, ref, nextTick } from 'vue'
  4. import reload from './reload.vue'
  5. import NProgress from '@/utils/system/nprogress'
  6. export function createNameComponent(component) {
  7. return () => {
  8. return new Promise((res) => {
  9. component().then((comm) => {
  10. const name = (comm.default.name || 'vueAdminBox') + '$' + Date.now();
  11. const tempComm = defineComponent({
  12. name,
  13. setup() {
  14. const isReload = ref(false);
  15. let timeOut = null;
  16. const handleReload = () => {
  17. isReload.value = true;
  18. timeOut && clearTimeout(timeOut);
  19. NProgress.start();
  20. timeOut = setTimeout(() => {
  21. nextTick(() => {
  22. NProgress.done();
  23. isReload.value = false;
  24. });
  25. }, 260);
  26. };
  27. return {
  28. isReload,
  29. handleReload
  30. };
  31. },
  32. render: function () {
  33. if (this.isReload) {
  34. return h('div', { class: 'el-main-box' }, [h(reload)]);
  35. } else {
  36. return h('div', { class: 'el-main-box' }, [createVNode(comm.default)]);
  37. }
  38. }
  39. });
  40. res(tempComm);
  41. });
  42. });
  43. };
  44. }