use-content-spinner.ts 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. import { computed, ref } from 'vue';
  2. import { useRouter } from 'vue-router';
  3. import { preferences } from '@vben-core/preferences';
  4. function useContentSpinner() {
  5. const spinning = ref(false);
  6. const startTime = ref(0);
  7. const router = useRouter();
  8. const minShowTime = 500; // 最小显示时间
  9. const enableLoading = computed(() => preferences.transition.loading);
  10. // 结束加载动画
  11. const onEnd = () => {
  12. if (!enableLoading.value) {
  13. return;
  14. }
  15. const processTime = performance.now() - startTime.value;
  16. if (processTime < minShowTime) {
  17. setTimeout(() => {
  18. spinning.value = false;
  19. }, minShowTime - processTime);
  20. } else {
  21. spinning.value = false;
  22. }
  23. };
  24. // 路由前置守卫
  25. router.beforeEach((to) => {
  26. if (to.meta.loaded || !enableLoading.value || to.meta.iframeSrc) {
  27. return true;
  28. }
  29. startTime.value = performance.now();
  30. spinning.value = true;
  31. return true;
  32. });
  33. // 路由后置守卫
  34. router.afterEach((to) => {
  35. if (to.meta.loaded || !enableLoading.value || to.meta.iframeSrc) {
  36. return true;
  37. }
  38. onEnd();
  39. return true;
  40. });
  41. return { spinning };
  42. }
  43. export { useContentSpinner };