react-router 路由切换动画的实现示例

React Router 是 React 官方推出的用于构建单页应用(SPA)的路由库。

实现路由切换动画的过程可以分为以下几个步骤:

  1. 安装 react-router-dom 和 react-transition-group
npm install react-router-dom react-transition-group
  1. 使用 BrowserRouterHashRouter 组件包裹应用

在应用的入口文件中,使用 BrowserRouterHashRouter 组件包裹应用。BrowserRouter 使用 HTML5 API,需要服务器支持,而 HashRouter 只使用 URL 中的锚点来模拟路由,不需要特殊服务器支持。

import React from "react";
import ReactDOM from "react-dom";
import { BrowserRouter } from "react-router-dom";

import App from "./App";

ReactDOM.render(
  <BrowserRouter>
    <App />
  </BrowserRouter>,
  document.getElementById("root")
);
  1. 创建路由配置

在创建路由配置时,我们可以使用 Route 组件来指定路径和对应的组件。

import React from "react";
import { Switch, Route } from "react-router-dom";
import Home from "./Home";
import About from "./About";
import Contact from "./Contact";

const Routes = () => {
  return (
    <Switch>
      <Route exact path="/" component={Home} />
      <Route path="/about" component={About} />
      <Route path="/contact" component={Contact} />
    </Switch>
  );
};

export default Routes;
  1. 使用 CSSTransition 包裹组件

在路由切换时添加动画效果,可以使用 react-transition-group 库中的 CSSTransition 组件。

import React from "react";
import { CSSTransition } from "react-transition-group";
import "./fade.css";

const Fade = ({ children, ...props }) => (
  <CSSTransition {...props} timeout={300} classNames="fade">
    {children}
  </CSSTransition>
);

export default Fade;

timeout 属性指定动画时间,classNames 属性指定 CSS 类名前缀,children 属性为组件的子节点。

  1. 在路由组件中使用 Fade 组件
import React from "react";
import { Route, Switch, withRouter } from "react-router-dom";
import Fade from "./Fade";
import Home from "./Home";
import About from "./About";
import Contact from "./Contact";

const AnimatedSwitch = withRouter(({ location }) => (
  <div className="App">
    <Fade key={location.pathname}>
      <Switch location={location}>
        <Route exact path="/" component={Home} />
        <Route path="/about" component={About} />
        <Route path="/contact" component={Contact} />
      </Switch>
    </Fade>
  </div>
));

export default AnimatedSwitch;

在路由组件中使用 Fade 组件包裹 Route 组件,并使用 location 属性指定当前路由路径。

示例1:实现左右滑动切换动画

/* fade.css */
.fade-enter {
  opacity: 0;
  transform: translateX(100%);
}

.fade-enter-active {
  opacity: 1;
  transform: translateX(0%);
  transition: all 300ms ease-in-out;
}

.fade-exit {
  opacity: 1;
  transform: translateX(0%);
}

.fade-exit-active {
  opacity: 0;
  transform: translateX(-100%);
  transition: all 300ms ease-in-out;
}
/* Slide.js */
import React from "react";
import { CSSTransition } from "react-transition-group";
import "./slide.css";

const Slide = ({ children, ...props }) => (
  <CSSTransition {...props} timeout={300} classNames="slide">
    {children}
  </CSSTransition>
);

export default Slide;
/* slide.css */
.slide-enter {
  opacity: 0;
  transform: translateX(100%);
}

.slide-enter-active {
  opacity: 1;
  transform: translateX(0%);
  transition: all 300ms ease-in-out;
}

.slide-exit {
  opacity: 1;
  transform: translateX(0%);
}

.slide-exit-active {
  opacity: 0;
  transform: translateX(-100%);
  transition: all 300ms ease-in-out;
}
/* AnimatedSwitch.js */
import React from "react";
import { Route, Switch, withRouter } from "react-router-dom";
import Slide from "./Slide";
import Home from "./Home";
import About from "./About";
import Contact from "./Contact";

const AnimatedSwitch = withRouter(({ location }) => (
  <div className="App">
    <Slide key={location.pathname}>
      <Switch location={location}>
        <Route exact path="/" component={Home} />
        <Route path="/about" component={About} />
        <Route path="/contact" component={Contact} />
      </Switch>
    </Slide>
  </div>
));

export default AnimatedSwitch;

示例2:实现淡入淡出切换动画

/* fade.css */
.fade-enter {
  opacity: 0;
}

.fade-enter-active {
  opacity: 1;
  transition: opacity 300ms ease-in-out;
}

.fade-exit {
  opacity: 1;
}

.fade-exit-active {
  opacity: 0;
  transition: opacity 300ms ease-in-out;
}
/* AnimatedSwitch.js */
import React from "react";
import { Route, Switch, withRouter } from "react-router-dom";
import Fade from "./Fade";
import Home from "./Home";
import About from "./About";
import Contact from "./Contact";

const AnimatedSwitch = withRouter(({ location }) => (
  <div className="App">
    <Fade key={location.pathname}>
      <Switch location={location}>
        <Route exact path="/" component={Home} />
        <Route path="/about" component={About} />
        <Route path="/contact" component={Contact} />
      </Switch>
    </Fade>
  </div>
));

export default AnimatedSwitch;

综上所述,我们可以通过 react-router-domreact-transition-group 库来实现路由切换动画。在创建路由时,将需要进行动画切换的组件包裹在 CSSTransition 组件中,通过添加 CSS 类名和设置动画时间来实现不同的动画效果。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:react-router 路由切换动画的实现示例 - Python技术站

(0)
上一篇 2023年6月11日
下一篇 2023年6月11日

相关文章

  • 如何减少网页的内存与CPU占用

    减少网页的内存与CPU占用是很重要的,因为它可以提高用户的浏览体验,避免网页加载缓慢、卡顿甚至崩溃等问题。以下是几个实用的方法: 1. 压缩图片和使用CSS Sprites 在网页中使用大量图片会导致页面变得很重,从而增加内存和CPU占用。为了减少网页的加载时间和内存占用,可以使用以下两个方法: 压缩图片:使用图片压缩工具(如TinyPNG)将图片压缩至较小…

    css 2023年6月11日
    00
  • Three.js+React实现3D文字悬浮效果

    下面是实现“Three.js+React实现3D文字悬浮效果”的完整攻略。 准备工作 在进行这个项目之前,需要了解React和Three.js的基础知识,建议先学习React和Three.js的相关知识并熟悉它们的使用方式。 具体的准备工作如下: 安装必要的工具和依赖,包括Node.js、Webpack、Babel、React、Three.js等; 创建一个…

    css 2023年6月10日
    00
  • CSS实现聊天气泡效果

    让我为您详细讲解如何使用CSS实现聊天气泡效果。 1. 基本思路 聊天气泡效果是一个非常常见的UI设计样式,它通常由两部分组成:聊天内容和气泡形状的容器。在CSS中,我们可以使用伪元素 :before 和 :after 来创建气泡形状的容器。然后再使用 border 属性来控制容器的边框,使用 background-color 属性来设置背景颜色,并使用 t…

    css 2023年6月9日
    00
  • 浅谈styled-components的用法

    浅谈styled-components的用法 什么是styled-components styled-components 是 React 应用程序中使用的一种 CSS-in-JS 库。这意味着您可以在组件中编写 CSS,而不是在样式表文件中编写 CSS。这可以防止 CSS 的样式冲突问题,使得代码易于理解和维护。除此之外,styled-components…

    css 2023年6月9日
    00
  • js Canvas实现圆形时钟教程

    下面我来详细讲解一下“js Canvas实现圆形时钟教程”的完整攻略。 1. 前言 本教程将介绍如何使用HTML5中的Canvas绘制一个圆形时钟,并实时更新显示当前时间。本教程需要一些基本的JavaScript和HTML5的知识,也会用到Canvas的基本操作,如果您对这些知识还不是很熟悉,建议在开始本教程之前,先学习一下相关的基础知识。 2. 实现方法 …

    css 2023年6月10日
    00
  • 运用比较纯的CSS打造很Web2.0的按钮

    运用比较纯的CSS打造很Web2.0的按钮 Web2.0风格的按钮通常具有简洁、明亮、立体感强等特点,可以通过CSS来实现。本攻略将详细讲解如何运用比较纯的CSS打造很Web2.0的按钮,并提供两个示例说明。 1. 基本样式 Web2.0风格的按钮通常具有简洁、明亮、立体感强等特点。下面是一个基本的Web2.0风格按钮的样式: .button { displ…

    css 2023年5月18日
    00
  • css 块状元素和内联元素

    CSS块状元素和内联元素 在CSS中,元素可以分为块状元素和内联元素。本攻略将详细讲解CSS块状元素和内联元素的特点、使用方法和示例说明。 1. 块状元素 块状元素是指在HTML中以块的形式显示的元素,如div、h1、p等。块状元素通常会独占一行,可以设置宽度、高度、内边距和外边距等属性。块状元素可以包含其他块状元素和内联元素。 使用块状元素的方法如下: d…

    css 2023年5月18日
    00
  • 浅谈CSS中的继承性,特殊性,层叠性和重要性

    浅谈CSS中的继承性、特殊性、层叠性和重要性攻略 继承性 在CSS中,当某个元素没有设置特定的属性时,它会从其父元素中继承该属性。这种继承称为CSS的“继承性”。CSS属性根据其继承性可以分为两类: 可以继承的属性,如color、font-size、text-indent等; 不可继承的属性,如border、margin、padding等。 所有可继承的属性…

    css 2023年6月10日
    00
合作推广
合作推广
分享本页
返回顶部