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


Posted in Javascript onDecember 03, 2018

路由切换动画

因为项目的需求,需要在路由切换的时候,加入一些比较 zb 的视觉效果,所以研究了一下。把这些学习的过程记录下来,以便以后回顾。同时也希望这些内容能够帮助一些跟我一样的菜鸟,让他们少走些坑。可能我对代码的表述不是很到位,希望大家不要介意。机智的你们一定可以看明白。

参考内容:

  • react 路由动画
  • react-router Switch 组件
  • react 动画插件

1.插件依赖

使用的插件是react-transition-group。先简单介绍一下动画插件的使用方式。

CSSTransition这个组件有两个比较主要的属性:key和in

in:Boolean属性其实可以理解为是否显示当前内容节点。true则显示,false则不显示。

key:String这个属性是配合TransitionGroup组件来使用的。在一般的列表组件中(列如 todolist),可以通过key来判断列表中的子节点需要被插入还是移除,然后触发动画。

2. Switch 组件

这个组件有一个很重要的属性:location。同时这个属性也是路由切换动画的关键所在。Switch组件的子组件(一般是 Route 和 Redirect)会根据当前浏览器的location作为匹配依据来进行路由匹配。但是如果Switch组件定义了location属性,其中的子组件就会以定义的location作为匹配依据。

3.代码部分

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

@withRouter
class Routes extends Component {
  render() {
    const location = this.props.location
    return (
      <TransitionGroup>
        <CSSTransition key={location.key} timeout={1000} classNames="fade">
          <Switch location={location}>
            <Route path="/route-1" component={Route1} />
            <Route path="/route-2" component={Route2} />
          </Switch>
        </CSSTransition>
      </TransitionGroup>
    )
  }
}

export default Routes

4.原理分析

先确定需求:当切换路由的时候,旧的路由内容在一定时间内过渡消失,新的路由内容过渡显示。

在这个需要里面有两个重要的部分:

  • 过渡期间,会同时存在两个节点:新节点和旧节点
  • 旧节点应该显示旧的路由内容,新的节点应该显示新的路由内容

4.1 同时存在两节点

刚刚提到的CSSTransitionkey属性可以决定该节点是否需要显示。

Router中的location属性会在路由发生变化的时候,进行更新,而location里面的key则可以作为CSSTransitionkey

关于 history 对象,可以理解为一个数组,当页面的 location 发生变化时,或者刷新页面,history 就会push一个新的历史信息。在这个历史信息里面,有一个key属性,用来区分不同的历史记录(跳转新页面或者是刷新页面)

当路由切换的时候,location对象就会改变,新的key会使得页面重新渲染时出现两个CSSTransition(新旧节点)。

4.2 新旧节点对应新旧路由内容

如果只是配置key属性,会发现旧的节点会去匹配新的路由内容。这是因为Route组件默认根据当前location进行匹配。为了让旧节点中的Route根据旧的location进行匹配,就需要设置Switchlocation属性。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript动态改变img的src属性图片不显示的解决方法
Oct 20 Javascript
JavaScript前端图片加载管理器imagepool使用详解
Dec 29 Javascript
Node.js中的流(Stream)介绍
Mar 30 Javascript
JavaScript中各种引用类型的常用操作方法小结
May 05 Javascript
百度地图去掉marker覆盖物或者去掉maker的label文字方法
Jan 26 Javascript
微信小程序实现自定义加载图标功能
Jul 19 Javascript
判断iOS、Android以及PC端的示例代码
Nov 15 Javascript
vue router 组件的高级应用实例代码
Apr 08 Javascript
使用Layui搭建后台管理界面的操作方法
Sep 20 Javascript
ckeditor一键排版功能实现方法分析
Feb 06 Javascript
JavaScript设计模式--简单工厂模式定义与应用案例详解
May 23 Javascript
vue中提示$index is not defined错误的解决方式
Sep 02 Javascript
Vue.js 中的 v-model 指令及绑定表单元素的方法
Dec 03 #Javascript
ng-zorro-antd 入门初体验
Dec 03 #Javascript
如何使用 vue + d3 画一棵树
Dec 03 #Javascript
Vue.js中 v-model 指令的修饰符详解
Dec 03 #Javascript
浅谈ng-zorro使用心得
Dec 03 #Javascript
JS跨域请求的问题解析
Dec 03 #Javascript
VueJS 组件参数名命名与组件属性转化问题
Dec 03 #Javascript
You might like
PHP下对字符串的递增运算代码
2010/08/21 PHP
php实现批量删除挂马文件及批量替换页面内容完整实例
2016/07/08 PHP
基于jQuery的表格操作插件
2010/04/22 Javascript
使用jQuery轻松实现Ajax的实例代码
2010/08/16 Javascript
腾讯的ip接口 方便获取当前用户的ip地理位置
2010/11/25 Javascript
js操作label给label赋值及取label的值示例
2013/11/07 Javascript
JS延时器提示框的应用实例代码解析
2016/04/27 Javascript
AngularJS基础 ng-disabled 指令详解及简单示例
2016/08/01 Javascript
深入理解React中何时使用箭头函数
2017/08/23 Javascript
微信小程序之滚动视图容器的实现方法
2017/09/26 Javascript
微信小程序中的店铺评分组件及vue中用svg实现的评分显示组件
2018/11/16 Javascript
JQuery样式与属性设置方法分析
2019/12/07 jQuery
vue.js iview打包上线后字体图标不显示解决办法
2020/01/20 Javascript
js实现消灭星星(web简易版)
2020/03/24 Javascript
vue设置全局访问接口API地址操作
2020/08/14 Javascript
JS+JQuery实现无缝连接轮播图
2020/12/30 jQuery
[01:37]DOTA2超级联赛专访ChuaN 传奇般的电竞之路
2013/06/19 DOTA
简化Python的Django框架代码的一些示例
2015/04/20 Python
深入学习python的yield和generator
2016/03/10 Python
Python实现Mysql数据库连接池实例详解
2017/04/11 Python
python 通过字符串调用对象属性或方法的实例讲解
2018/04/21 Python
opencv python 基于KNN的手写体识别的实例
2018/08/03 Python
Python对excel文档的操作方法详解
2018/12/10 Python
如何使用python进行pdf文件分割
2019/11/11 Python
如何表示python中的相对路径
2020/07/08 Python
Python模拟键盘输入自动登录TGP
2020/11/27 Python
伦敦一家领先的精品零售商:IRIS Fashion
2019/05/24 全球购物
Spartoo美国:欧洲排名第一的在线时装零售商
2019/12/12 全球购物
个人找工作求职简历的自我评价
2013/10/20 职场文书
咖啡店自主创业商业计划书
2014/01/22 职场文书
公司活动邀请函
2014/01/24 职场文书
建议书格式
2015/02/04 职场文书
绵山导游词
2015/02/05 职场文书
2015年底工作总结范文
2015/05/15 职场文书
收入证明范本
2015/06/12 职场文书
10大幻兽系恶魔果实 蝙蝠果实上榜,第一自愈能力强
2022/03/18 日漫