index.tsx 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. import { useEffect } from 'react'
  2. import NProgress from 'nprogress'
  3. import 'nprogress/nprogress.css'
  4. import './index.css'
  5. // 配置 NProgress
  6. NProgress.configure({
  7. showSpinner: false,
  8. minimum: 0.1,
  9. trickleSpeed: 200
  10. })
  11. export default function ProgressBar() {
  12. useEffect(() => {
  13. let lastHref = window.location.href
  14. const handleRouteChange = () => {
  15. NProgress.start()
  16. const timer = setTimeout(() => NProgress.done(), 100)
  17. return () => {
  18. clearTimeout(timer)
  19. NProgress.done()
  20. }
  21. }
  22. // 监听 href 变化
  23. const observer = new MutationObserver(() => {
  24. const currentHref = window.location.href
  25. if (currentHref !== lastHref) {
  26. lastHref = currentHref
  27. handleRouteChange()
  28. }
  29. })
  30. // 观察整个文档的变化
  31. observer.observe(document, {
  32. subtree: true,
  33. childList: true
  34. })
  35. // 监听 popstate 事件(处理浏览器前进后退)
  36. window.addEventListener('popstate', handleRouteChange)
  37. // 初始加载时触发一次
  38. handleRouteChange()
  39. // 清理监听器
  40. return () => {
  41. observer.disconnect()
  42. window.removeEventListener('popstate', handleRouteChange)
  43. }
  44. }, [])
  45. return null
  46. }