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

yizhihongxing

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日

相关文章

  • 详解CSS选择符之子代选择符

    我们来详细讲解一下CSS的子代选择符。 子代选择符 子代选择符是CSS中的一种选择符,可以选择指定元素的所有子元素。子元素是指直接嵌套在父元素内的元素,孙子元素不算。 使用子代选择符的方法是在父元素的选择器后面加上一个空格,然后再加上子元素选择器。例如,想要选择<div>元素内所有的<span>元素,可以使用如下的子代选择符: div…

    css 2023年6月10日
    00
  • 纯CSS3发光分享按钮的实现教程

    分步骤实现纯CSS3发光分享按钮: 1. 创建分享图标 首先,我们需要创建出我们的分享图标,图标的制作可以使用知名的图标字库如FontAwesome和Iconfont,或者使用自己的图片制作. 2. HTML布局 我们需要一个div元素来包裹我们的分享图标,然后给这个div设置一个id和一些基本的样式. <div id="share&quot…

    css 2023年6月11日
    00
  • CSS教程(1):学习CSS背景相关知识

    下面是详细讲解“CSS教程(1):学习CSS背景相关知识”的完整攻略。 标题 CSS教程(1):学习CSS背景相关知识 概述 本教程将带领读者深入学习CSS中与背景相关的知识,包括背景颜色、背景图片以及背景定位等内容。 具体内容 1. 背景颜色 在CSS中,可以通过background-color属性来设置背景颜色。该属性可以接受任何有效的CSS颜色值。 示…

    css 2023年6月9日
    00
  • vue3新拟态组件库开发流程之table组件源码分析

    Vue3新拟态组件库开发流程之table组件源码分析攻略 1. 前言 Vue3作为一款优秀的前端框架,不断地为前端开发者带来更加方便和高效的开发模式。其中,拟态风格越来越受到大家的关注,为此,我们今天就来学习一下Vue3新拟态组件库开发流程中的table组件源码分析。 2. 源码分析 2.1. 源文件结构 table组件的源码位于/src/component…

    css 2023年6月9日
    00
  • CSS滤镜同时过滤文字的问题的解决方法

    没问题! CSS滤镜同时过滤文字的问题 在实际项目中,我们可能会用到 CSS 滤镜来美化图片。但有时候,滤镜会同时作用于文本,导致文字变得不清晰或者不易阅读。下面就让我们来探讨一下如何解决这个问题。 问题原因 首先,我们需要了解一下为什么 CSS 滤镜会影响文本。CSS 滤镜是基于层的,也就是说滤镜会作用于元素的整个对象,而不仅仅是背景或者边框等。所以,如果…

    css 2023年6月11日
    00
  • CSS文本超出2行就隐藏并且显示省略号

    CSS提供了一个非常方便的属性text-overflow,可以用于超出指定行数的文本隐藏并显示省略号。 下面是一个完整的示例: <style> .text { width: 200px; overflow: hidden; display: -webkit-box; /* 为了兼容性,需要加上前缀 */ -webkit-line-clamp: 2…

    css 2023年6月10日
    00
  • jquery 操作css样式、位置、尺寸方法汇总

    当使用 jQuery 操作 DOM 元素时,修改 CSS 样式、位置和尺寸是非常常见的需求,本文将会详细讲解 jQuery 如何操作 DOM 元素的这些属性。 操作 CSS 样式 添加样式类 使用 jQuery 的 addClass() 方法可以向目标元素添加一个或多个 CSS 类。例如: $(‘#my-ele’).addClass(‘highlight’)…

    css 2023年6月9日
    00
  • 兼容IE与firefox的css 线性渐变(linear-gradient)

    实现兼容IE与Firefox的线性渐变,可以通过使用CSS的filter属性和渐变图像background-image属性进行实现。具体步骤如下: 1.使用CSS的filter属性实现IE浏览器中的线性渐变: 在IE中,我们可以使用下面的代码实现线性渐变: background: linear-gradient(to right, #ff0000, #000…

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