You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在React Router Dom的RouterProvider中配置Framer Motion?退出动画异常求助

React Router Dom 6.8 + Framer Motion 首页退出动画失效解决方案

你的问题核心在于AnimatePresence的放置位置错误,导致路由切换时首页组件和AnimatePresence一起被卸载,无法触发exit动画。以下是修复步骤:

1. 重构路由结构,统一包裹AnimatePresence

将AnimatePresence提升到父路由的element中,用<Outlet />渲染所有子页面,确保所有页面组件都在同一个AnimatePresence容器内:

import { createBrowserRouter, RouterProvider, Outlet } from 'react-router-dom';
import { AnimatePresence } from 'framer-motion';
import Home from './Home';
import About from './About'; // 其他页面组件

const router = createBrowserRouter([
  {
    path: '/',
    element: (
      <AnimatePresence mode='wait'>
        <Outlet />
      </AnimatePresence>
    ),
    children: [
      { path: '/', element: <Home /> },
      { path: '/about', element: <About /> },
      // 添加其他页面路由
    ]
  }
]);

ReactDOM.createRoot(document.getElementById('root')).render(
  <RouterProvider router={router} />
);

2. 确保页面组件的motion元素配置正确

在Home组件中,通过useLocation获取路由路径作为key,同时检查exit动画变体是否正确定义:

import { useLocation } from 'react-router-dom';
import { motion } from 'framer-motion';

// 定义过渡动画变体,必须包含exit状态
const pageTransition = {
  initial: { opacity: 0, y: 20 },
  animate: { opacity: 1, y: 0 },
  exit: { opacity: 0, y: -20 }
};

function Home() {
  const location = useLocation();

  return (
    <motion.main
      key={location.pathname}
      variants={pageTransition}
      initial="initial"
      animate="animate"
      exit="exit"
      className="home"
      transition={{ duration: 0.5 }} // 明确过渡时长,避免动画不明显
    >
      {/* 页面内容 */}
    </motion.main>
  );
}

export default Home;

关键原理说明

之前的写法中,每个路由单独包裹AnimatePresence,跳转时首页的AnimatePresence会随Home组件一起被销毁,Framer Motion没有时间执行exit动画。将AnimatePresence统一放在父路由后,所有子页面组件都在同一个容器内,路由切换时旧组件的exit动画会被完整执行后再卸载,新组件才会挂载。

内容的提问来源于stack exchange,提问作者mike

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 17:13:26