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 相关文章推荐
Array的push与unshift方法性能比较分析
Mar 05 Javascript
Jquery遍历节点的方法小集
Jan 22 Javascript
JavaScript调用ajax获取文本文件内容实现代码
Mar 28 Javascript
jQuery插件uploadify实现ajax效果的图片上传
Jun 18 Javascript
bootstrap table小案例
Oct 21 Javascript
详解JS异步加载的三种方式
Mar 07 Javascript
JavaScript实现三级联动效果
Jul 15 Javascript
jQuery实现表格冻结顶栏效果
Aug 20 jQuery
vue使用Google地图的实现示例代码
Dec 19 Javascript
vue.js实现备忘录demo
Jun 26 Javascript
浅谈v-for 和 v-if 并用时筛选条件方法
Nov 07 Javascript
vue项目配置sass及引入外部scss文件
Apr 14 Vue.js
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数组函数序列之array_splice() - 在数组任意位置插入元素
2011/11/07 PHP
php excel reader读取excel内容存入数据库实现代码
2012/12/06 PHP
PHP中ini_set与ini_get用法实例
2014/11/04 PHP
以实例全面讲解PHP中多进程编程的相关函数的使用
2015/08/18 PHP
php生成与读取excel文件
2016/10/14 PHP
Javascript中的相等与不等运算
2010/04/25 Javascript
jquery简单瀑布流实现原理及ie8下测试代码
2013/01/23 Javascript
js实现鼠标拖动图片并兼容IE/FF火狐/谷歌等主流浏览器
2013/06/06 Javascript
Javascript中的回调函数和匿名函数的回调示例介绍
2014/05/12 Javascript
javascript的日期对象、数组对象、二维数组使用说明
2014/12/22 Javascript
JavaScript中的Promise使用详解
2015/06/24 Javascript
jQuery模拟360浏览器切屏效果幻灯片(附demo源码下载)
2016/01/29 Javascript
Node.js Streams文件读写操作详解
2016/07/04 Javascript
jQuery实现的选择商品飞入文本框动画效果完整实例
2016/08/10 Javascript
将鼠标焦点定位到文本框最后(代码分享)
2017/01/11 Javascript
js实现下拉框效果(select)
2017/03/28 Javascript
javascript 初学教程及五子棋小程序的简单实现
2017/07/04 Javascript
javaScript 连接打印机,打印小票的实例
2017/12/29 Javascript
解决vue中使用Axios调用接口时出现的ie数据处理问题
2018/08/13 Javascript
bootstrap table表格插件之服务器端分页实例代码
2018/09/12 Javascript
antd组件Upload实现自己上传的实现示例
2018/12/18 Javascript
Vue2.0实现组件之间数据交互和通信操作示例
2019/05/16 Javascript
使用IPython下的Net-SNMP来管理类UNIX系统的教程
2015/04/15 Python
python 识别图片中的文字信息方法
2018/05/10 Python
Python正则表达式匹配日期与时间的方法
2019/07/07 Python
Django学习之文件上传与下载
2019/10/06 Python
全球知名的珠宝首饰品牌:Kay Jewelers
2018/02/11 全球购物
世界汽车零件:World Car Parts
2019/09/04 全球购物
马德里运动鞋商店:Nigra Mercato
2020/02/16 全球购物
MAC彩妆澳洲官网:M·A·C AU
2021/01/17 全球购物
How TDD works
2012/09/30 面试题
服务员岗位责任制
2014/02/11 职场文书
员工拓展培训方案
2014/02/15 职场文书
护士节演讲稿开场白
2014/08/25 职场文书
MySQL 如何设计统计数据表
2021/06/15 MySQL
我国拿下天问一号火星着陆区附近 22 个地理实体命名:平乐、西柏坡、古田、漠河等
2022/04/29 数码科技