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日

相关文章

  • CSS3实现简易版的刮刮乐效果

    下面是CSS3实现简易版的刮刮乐效果的完整攻略: 1. 确定HTML结构 首先,我们需要确定HTML的结构,一般来说一个简单的刮刮乐效果可以采用以下HTML结构: <div class="scratch-card"> <img src="image/bg.jpg" alt="背景图&quot…

    css 2023年6月10日
    00
  • CSS3中的transform属性进行2D和3D变换的基本用法

    当我们在使用CSS3对网页进行样式设计时,Transform属性是非常常用而强大的属性。它可以实现元素的平移、旋转、缩放等基本的2D和3D变换效果,从而能够增强页面的视觉效果和交互体验。 在此我们将详细讲解Transform属性的基本用法。 基本语法 Transform属性的基本语法如下: transform: none|transform-function…

    css 2023年6月10日
    00
  • 纯css3实现鼠标经过图片显示描述的动画效果

    接下来我将详细讲解如何使用纯CSS3实现鼠标经过图片显示描述的动画效果: Step 1: HTML结构首先我们需要建立一个基本的HTML结构,包括一个包裹图片和描述文字的div以及对应的图片和描述文字: <div class="image-box"> <img src="image.jpg" alt=…

    css 2023年6月10日
    00
  • 基于CSS制作创意端午节专属加载特效

    下面是基于CSS制作创意端午节专属加载特效的完整攻略: 一、准备工作 在开始制作之前,我们需要先准备好一些基本的工具与环境: 编辑器:例如 Visual Studio Code、Sublime Text 等。 浏览器:建议使用 Google Chrome 浏览器,因为其中包含了强大的开发者工具,可以更方便地调试CSS。 图片素材:下载几张端午节相关的图片,例…

    css 2023年6月11日
    00
  • CSS scroll-snap滚动事件停止及元素位置检测实现

    当我们在网页中使用滚动条进行滚动时,如果需要滚动到特定的元素位置停止滚动,这时候就可以使用CSS scroll-snap属性来实现。本攻略将介绍如何使用CSS scroll-snap实现有停止效果的滚动以及如何使用JavaScript检测元素位置。 CSS scroll-snap概述 CSS scroll-snap是一个CSS属性,它可以为容器或内部元素定义…

    css 2023年6月9日
    00
  • dreamweaver8插入网页布局框架并全部保存方法介绍

    下面为您详细讲解“dreamweaver8插入网页布局框架并全部保存方法介绍”的完整攻略。 一、背景 在网页设计或开发过程中,网页框架可以帮助设计者或开发者快速构建网页骨架和布局。Dreamweaver 8是一款常用的网页设计软件,它提供了方便易用的网页布局框架插入功能。本文将详细介绍如何在Dreamweaver 8中插入网页布局框架并全部保存。 二、插入网…

    css 2023年6月9日
    00
  • JS获取各种宽度、高度的简单介绍

    JS 获取各种宽度、高度的简单介绍,我们可以分为以下几类:元素的尺寸、元素的位置和窗口的尺寸。 元素的尺寸 获取元素的宽度和高度 offsetWidth 和 offsetHeight: 元素的盒模型的宽度和高度,包括元素的边框和滚动条、但不包括外边距和内边距。 clientWidth 和 clientHeight:元素的盒模型的宽度和高度,包括内边距、但不包…

    css 2023年6月10日
    00
  • jquery输入数字随机抽奖特效的简单实现代码

    下面是关于“jquery输入数字随机抽奖特效的简单实现代码”的完整攻略: 1. 确定页面布局 该抽奖效果需要一个输入框(用于输入抽奖人数)、抽奖按钮(用于触发抽奖)、一个抽奖区域(用于展示抽奖结果)、一个候选人列表(用于存储所有候选人信息)。 HTML 代码示例: <!DOCTYPE html> <html> <head>…

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