当前位置:首页 > React

react如何实现跳转过渡

2026-01-25 03:38:17React

实现跳转过渡的方法

在React中实现页面跳转过渡效果,可以通过以下方法完成:

使用React Router和CSS过渡 React Router结合CSS动画是实现路由跳转过渡的常见方式。在SwitchRoutes组件外包裹CSSTransitionTransitionGroup,通过CSS定义进入和离开的动画效果。

import { CSSTransition, TransitionGroup } from 'react-transition-group';
import { Route, Switch } from 'react-router-dom';

function App() {
  return (
    <Route render={({ location }) => (
      <TransitionGroup>
        <CSSTransition
          key={location.key}
          timeout={300}
          classNames="fade"
        >
          <Switch location={location}>
            <Route path="/" exact component={Home} />
            <Route path="/about" component={About} />
          </Switch>
        </CSSTransition>
      </TransitionGroup>
    )} />
  );
}

配套CSS需定义过渡效果:

react如何实现跳转过渡

.fade-enter {
  opacity: 0;
}
.fade-enter-active {
  opacity: 1;
  transition: opacity 300ms;
}
.fade-exit {
  opacity: 1;
}
.fade-exit-active {
  opacity: 0;
  transition: opacity 300ms;
}

使用Framer Motion库 Framer Motion提供声明式动画API,可轻松实现复杂过渡效果。通过AnimatePresence组件包裹路由,配合motion.div定义动画属性。

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

function App() {
  const location = useLocation();
  return (
    <AnimatePresence exitBeforeEnter>
      <Switch location={location} key={location.pathname}>
        <Route path="/" exact>
          <motion.div
            initial={{ opacity: 0 }}
            animate={{ opacity: 1 }}
            exit={{ opacity: 0 }}
          >
            <Home />
          </motion.div>
        </Route>
      </Switch>
    </AnimatePresence>
  );
}

React Router v6的过渡实现 在v6版本中,可通过useOutlet配合动画库实现嵌套路由过渡:

react如何实现跳转过渡

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

function Layout() {
  const outlet = useOutlet();
  const location = useLocation();
  return (
    <AnimatePresence>
      <motion.div
        key={location.pathname}
        initial={{ x: 100, opacity: 0 }}
        animate={{ x: 0, opacity: 1 }}
        exit={{ x: -100, opacity: 0 }}
      >
        {outlet}
      </motion.div>
    </AnimatePresence>
  );
}

自定义useTransitionHook 封装自定义Hook管理过渡状态,适用于需要精细控制动画的场景:

function usePageTransition() {
  const [isTransitioning, setIsTransitioning] = useState(false);

  const startTransition = useCallback(() => {
    setIsTransitioning(true);
    return new Promise(resolve => {
      setTimeout(() => {
        setIsTransitioning(false);
        resolve();
      }, 500);
    });
  }, []);

  return { isTransitioning, startTransition };
}

使用时在路由跳转前调用startTransition

const { startTransition } = usePageTransition();

const navigateWithTransition = async (to) => {
  await startTransition();
  navigate(to);
};

注意事项

  • 过渡时间需与路由切换同步,避免组件卸载过早导致动画中断
  • 对于复杂路由结构,需确保每个路由层级都有唯一的key属性
  • 性能优化:对于移动设备,优先使用GPU加速的CSS属性(如transformopacity
  • 服务端渲染(SSR)场景下,需考虑动画的hydration处理

分享给朋友:

相关文章

vue如何实现目录组件

vue如何实现目录组件

实现目录组件的基本思路 在Vue中实现目录组件通常需要结合页面内容的结构化数据(如标题层级),通过动态渲染生成可交互的目录。核心步骤包括提取标题、生成目录结构、实现滚动联动等。 提取标题信息 通过d…

vue中如何实现循环

vue中如何实现循环

循环渲染列表数据 在Vue中,使用v-for指令实现循环渲染。基本语法为v-for="(item, index) in items",其中items是数据源数组,item是当前遍历的元素,index是…

jquery 跳转

jquery 跳转

jQuery 页面跳转方法 使用 jQuery 实现页面跳转可以通过多种方式完成,以下是几种常见的方法: 修改 window.location 属性 // 直接跳转到指定 URL window.l…

jquery跳转

jquery跳转

jQuery 页面跳转方法 使用 jQuery 实现页面跳转有多种方式,以下是几种常见的方法: 使用 window.location.href $(document).ready(function…

java如何实现跨平台

java如何实现跨平台

Java实现跨平台的原理 Java通过“一次编写,到处运行”的设计理念实现跨平台能力。其核心机制包括: Java虚拟机(JVM) Java源代码编译为字节码(.class文件),由JVM解释执行。不…

vue如何实现分离

vue如何实现分离

Vue 实现代码分离的方法 Vue 提供了多种方式实现代码分离,提升项目的可维护性和模块化程度。以下是常见的几种方法: 组件化开发 将功能拆分为独立的 Vue 组件,每个组件包含自己的模板、逻辑和样…