v6路由切换动画实现方法

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

React Router v6路由切换动画实现方法

最近在项目中将React Router从v5升级到v6,遇到了不少兼容性问题,其中最头疼的就是路由切换动画的实现。v6版本对路由组件的渲染方式做了重大调整,导致之前在v5中使用的动画方案完全失效。

问题分析

在v5中,我们通常使用<TransitionGroup><CSSTransition>来实现路由动画,但v6采用了新的useNavigateuseLocation hooks,并且路由组件的渲染机制发生了变化。直接使用之前的动画方案会报错,提示找不到相关组件。

解决方案

经过多次踩坑,最终采用以下方案实现平滑的路由切换动画:

// 1. 创建自定义动画组件
import { useEffect, useRef } from 'react';
import { useLocation, useNavigate } from 'react-router-dom';
import { motion, AnimatePresence } from 'framer-motion';

function AnimatedRoutes() {
  const location = useLocation();
  const navigate = useNavigate();
  
  // 监听路由变化
  useEffect(() => {
    // 可以在这里添加路由切换的额外逻辑
  }, [location]);
  
  return (
    <AnimatePresence mode="wait">
      <motion.div
        key={location.pathname}
        initial={{ opacity: 0 }}
        animate={{ opacity: 1 }}
        exit={{ opacity: 0 }}
        transition={{ duration: 0.3 }}
      >
        <Routes>
          <Route path="/" element={<Home />} />
          <Route path="/about" element={<About />} />
        </Routes>
      </motion.div>
    </AnimatePresence>
  );
}

实际应用

在项目中,我们还遇到了一个关键问题:如何在组件卸载时执行动画。通过useEffectuseNavigate的配合使用,可以实现更精确的动画控制。

注意事项

  1. 确保安装了framer-motion依赖
  2. 保持路由组件结构的一致性
  3. 考虑不同设备的性能表现

这个方案虽然需要额外引入第三方库,但效果稳定可靠,推荐在v6项目中使用。

推广
广告位招租

讨论

0/2000
ColdGuru
ColdGuru · 2026-01-08T10:24:58
v6的动画实现确实比v5复杂不少,但用framer-motion配合AnimatePresence还是挺好用的,关键是要理解key的变化机制。
Xavier88
Xavier88 · 2026-01-08T10:24:58
别直接套用代码,先理解key={location.pathname}这行的作用,不然动画会卡住或者不触发。
ThickMaster
ThickMaster · 2026-01-08T10:24:58
我试过用css transition + useLocation监听,但不如motion流畅,建议还是用motion库,兼容性好。
Ethan723
Ethan723 · 2026-01-08T10:24:58
注意路由层级问题,如果嵌套路由太多,可能需要在每个子路由都加动画组件,别图省事。
Ethan186
Ethan186 · 2026-01-08T10:24:58
exit动画要设置好时间,太快用户没感知,太慢又卡顿,0.3秒是经验数据,可调。
RoughNora
RoughNora · 2026-01-08T10:24:58
别忘了在动画组件外层包个div,否则motion可能找不到DOM节点导致报错。
Kevin918
Kevin918 · 2026-01-08T10:24:58
实际项目中建议把动画逻辑抽成hooks,比如useRouteAnimation,复用性高而且维护方便。
LoudOliver
LoudOliver · 2026-01-08T10:24:58
动画性能优化方面,可以加个shouldAnimate的条件判断,避免不必要的渲染开销。
Bob918
Bob918 · 2026-01-08T10:24:58
测试时多在不同路由间切换,观察是否有白屏或卡顿现象,这往往是key或transition配置问题。