v6路由动画效果实现

BoldHero +0/-0 0 0 正常 2025-12-24T07:01:19 React-Router

React Router v6 路由动画效果实现踩坑记录

最近在项目中将 React Router 从 v5 升级到 v6,过程中遇到了路由动画实现的难题。v6 版本移除了 Switch 组件,改用 Routes,这让我原有的动画方案完全失效。

问题分析

升级后发现,v6 中 useLocation() 返回的 location 对象结构发生变化,且组件卸载逻辑需要重新处理。最开始尝试直接在路由组件上添加 transition 动画,结果动画不生效。

解决方案

最终采用以下方式实现平滑的路由过渡动画:

import { Routes, Route, useLocation } from 'react-router-dom';
import { AnimatePresence } from 'framer-motion';

function App() {
  const location = useLocation();
  
  return (
    <AnimatePresence>
      <Routes location={location} key={location.pathname}>
        <Route path="/" element={<Home />} />
        <Route path="/about" element={<About />} />
      </Routes>
    </AnimatePresence>
  );
}

// 在具体页面组件中
function Home() {
  return (
    <motion.div 
      initial={{ opacity: 0 }}
      animate={{ opacity: 1 }}
      exit={{ opacity: 0 }}
      transition={{ duration: 0.3 }}
    >
      <h1>首页</h1>
    </motion.div>
  );
}

关键点

  1. 需要使用 AnimatePresence 包裹 Routes
  2. 设置 key={location.pathname} 确保路由切换时触发动画
  3. 页面组件内添加 framer-motion 的 motion 组件

踩坑提醒:v6 升级后别忘了检查所有路由相关逻辑,特别是动画和过渡效果。

推广
广告位招租

讨论

0/2000
开发者故事集
开发者故事集 · 2026-01-08T10:24:58
v6升级确实坑不少,路由动画这块得重新梳理逻辑,别直接 copy v5 的代码。
YoungWolf
YoungWolf · 2026-01-08T10:24:58
关键是要理解 key={location.pathname} 这个点,不然动画根本触发不了。
SourGhost
SourGhost · 2026-01-08T10:24:58
用 AnimatePresence 包裹 Routes 是必须的,我一开始漏了这步卡了半天。
灵魂画家
灵魂画家 · 2026-01-08T10:24:58
页面组件里用 motion 包裹内容,initial/exit/animate 配置要清晰,别贪快。
时光倒流
时光倒流 · 2026-01-08T10:24:58
transition duration 设置 0.3s 刚好,太快用户没感觉,太慢又显拖沓。
Diana73
Diana73 · 2026-01-08T10:24:58
建议先在 demo 里测试动画逻辑,再集成到主项目,避免出问题难排查。
DeadLaugh
DeadLaugh · 2026-01-08T10:24:58
别忘了处理嵌套路由的动画,v6 里结构变化后很容易忽略这个细节。
Nora962
Nora962 · 2026-01-08T10:24:58
如果用自定义动画库,记得兼容 v6 的 location 结构,不然直接报错。
BrightBrain
BrightBrain · 2026-01-08T10:24:58
可以封装一个通用的路由动画组件,复用性高,避免每次都要写一堆代码。
Ethan723
Ethan723 · 2026-01-08T10:24:58
动画性能优化别忽视,特别是复杂页面,卡顿会影响用户体验。