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 相关文章推荐
DOM 事件流详解
Jan 20 Javascript
自己编写的支持Ajax验证的JS表单验证插件
May 15 Javascript
在浏览器中打开或关闭JavaScript的方法
Jun 03 Javascript
jquery+php实现滚动的数字特效
Nov 29 Javascript
详解JavaScript跨域总结与解决办法
Oct 31 Javascript
js实现滑动到页面底部自动加载更多功能
Feb 15 Javascript
EasyUI为Numberbox添加blur事件的方法
Mar 05 Javascript
addEventListener()与removeEventListener()解析
Apr 20 Javascript
解决微信小程序云开发中获取数据库的内容为空的方法
May 15 Javascript
微信小程序iBeacon测距及稳定程序的实现解析
Jul 31 Javascript
小程序实现点击tab切换左右滑动
Nov 16 Javascript
介绍一下28个JS常用数组方法
May 06 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导出excel格式数据问题
2014/03/11 PHP
php通过array_merge()函数合并两个数组的方法
2015/03/18 PHP
PHP使用flock实现文件加锁的方法
2015/07/01 PHP
PHP 使用 Imagick 裁切/生成缩略图/添加水印自动检测和处理 GIF
2016/02/19 PHP
PHP使用第三方即时获取物流动态实例详解
2017/04/27 PHP
javascript XMLHttpRequest对象全面剖析
2010/04/24 Javascript
兼容IE和Firefox火狐的上下、左右循环无间断滚动JS代码
2013/04/19 Javascript
如何获取网站icon有哪些可行的方法
2014/06/05 Javascript
11种ASP连接数据库的方法
2015/09/18 Javascript
BootStrap实现树形目录组件代码详解
2016/06/21 Javascript
AngularJs  Creating Services详解及示例代码
2016/09/02 Javascript
react.js组件实现拖拽复制和可排序的示例代码
2018/08/20 Javascript
微信小程序ibeacon三点定位详解
2018/10/31 Javascript
vuejs简单验证码功能完整示例
2019/01/08 Javascript
jQuery使用ajax传递json对象到服务端及contentType的用法示例
2020/03/12 jQuery
jdk1.8+vue elementui实现多级菜单功能
2020/09/24 Javascript
解决vue 使用axios.all()方法发起多个请求控制台报错的问题
2020/11/09 Javascript
如何在Express4.x中愉快地使用async的方法
2020/11/18 Javascript
python字典get()方法用法分析
2015/04/17 Python
python执行等待程序直到第二天零点的方法
2015/04/23 Python
Python写入数据到MP3文件中的方法
2015/07/10 Python
python搭建服务器实现两个Android客户端间收发消息
2018/04/12 Python
python实现输入数字的连续加减方法
2018/06/22 Python
Python3.5实现的三级菜单功能示例
2019/03/25 Python
python list数据等间隔抽取并新建list存储的例子
2019/11/27 Python
python3 xpath和requests应用详解
2020/03/06 Python
Windows 下更改 jupyterlab 默认启动位置的教程详解
2020/05/18 Python
如何利用python检测图片是否包含二维码
2020/10/15 Python
美国克罗格超市在线购物:Kroger
2019/06/21 全球购物
教师求职自荐信
2014/03/09 职场文书
大学班级文化建设方案
2014/05/06 职场文书
奥巴马的演讲稿
2014/05/15 职场文书
民间借贷协议书范本
2014/10/01 职场文书
SpringBoot项目中控制台日志的保存配置操作
2021/06/18 Java/Android
Go语言基础切片的创建及初始化示例详解
2021/11/17 Golang
大脑的记忆过程在做数据压缩,不同图形也有共同的记忆格式
2022/04/29 数码科技