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 相关文章推荐
jquery 简单导航实现代码
Sep 11 Javascript
js借助ActiveXObject实现创建文件
Sep 29 Javascript
jQuery遮罩层效果实例分析
Jan 14 Javascript
基于jquery实现智能提示控件intellSeach.js
Mar 17 Javascript
js实现的xml对象转json功能示例
Dec 24 Javascript
详解vuelidate 对于vueJs2.0的验证解决方案
Mar 09 Javascript
bootstrap警告框示例代码分享
May 17 Javascript
基于vue.js实现的分页
Mar 13 Javascript
原生js+ajax分页组件
Jan 30 Javascript
微信小程序实现发微博功能的示例代码
Jun 24 Javascript
vue将文件/图片批量打包下载zip的教程
Oct 21 Javascript
jQuery列表动态增加和删除的实现方法
Nov 05 jQuery
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
YB217、YB235、YB400浅听
2021/03/02 无线电
用Flash图形化数据(二)
2006/10/09 PHP
PHP中替换换行符的几种方法小结
2012/10/15 PHP
jquery radio 操作代码
2011/03/16 Javascript
iphone safari不支持position fixed的解决方法
2012/05/04 Javascript
地址栏传递中文参数乱码在js里用escape转码
2013/08/28 Javascript
js判断元素是否隐藏的方法
2014/06/09 Javascript
Nodejs实现批量下载妹纸图
2015/05/28 NodeJs
简介JavaScript中setUTCSeconds()方法的使用
2015/06/12 Javascript
jQuery时间轴插件使用详解
2015/07/16 Javascript
Java遍历集合方法分析(实现原理、算法性能、适用场合)
2016/04/25 Javascript
基于JavaScript实现树形下拉框
2016/08/10 Javascript
JS中使用 after 伪类清除浮动实例
2017/03/01 Javascript
Angular父组件调用子组件的方法
2018/04/02 Javascript
vue给组件传递不同的值方法
2018/09/29 Javascript
详解Vue 动态组件与全局事件绑定总结
2018/11/11 Javascript
详解django模板与vue.js冲突问题
2019/07/07 Javascript
SSM+layUI 根据登录信息显示不同的页面方法
2019/09/20 Javascript
用python实现的可以拷贝或剪切一个文件列表中的所有文件
2009/04/30 Python
python循环监控远程端口的方法
2015/03/14 Python
低版本中Python除法运算小技巧
2015/04/05 Python
举例讲解Python的lambda语句声明匿名函数的用法
2016/07/01 Python
Python的mysql数据库的更新如何实现
2017/07/31 Python
python给微信好友定时推送消息的示例
2019/02/20 Python
CSS3 选择器 基本选择器介绍
2012/01/21 HTML / CSS
HTML5的video标签的浏览器兼容性增强方案分享
2016/05/19 HTML / CSS
html5开发之viewport使用
2013/10/17 HTML / CSS
Canvas中设置width与height的问题浅析
2018/11/01 HTML / CSS
Myprotein加拿大官网:欧洲第一的运动营养品牌
2018/01/06 全球购物
锐步香港官方网上商店:Reebok香港
2020/11/05 全球购物
如何客观的进行自我评价
2013/12/17 职场文书
通信工程专业毕业生推荐信
2013/12/25 职场文书
教师四风对照检查材料思想汇报
2014/09/17 职场文书
2014年为民办实事工作总结
2014/12/20 职场文书
董事长秘书岗位职责
2015/02/13 职场文书
Oracle11g R2 安装教程完整版
2021/06/04 Oracle