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 this 深入理解
Jul 30 Javascript
JQuery Ajax 跨域访问的解决方案
Mar 12 Javascript
jQuery Ajax 仿AjaxPro.Utility.RegisterTypeForAjax辅助方法
Sep 27 Javascript
js 自动播放的实例代码
Nov 19 Javascript
初步了解javascript面向对象
Nov 09 Javascript
javascript如何实现360度全景照片问题汇总
Apr 04 Javascript
js 获取站点应用名的简单实例
Aug 18 Javascript
过期软件破解办法实例详解
Jan 04 Javascript
react-native组件中NavigatorIOS和ListView结合使用的方法
Sep 30 Javascript
AngularJS实现的获取焦点及失去焦点时的表单验证功能示例
Oct 25 Javascript
JS关闭子窗口并且刷新上一个窗口的实现示例
Mar 10 Javascript
javascript设计模式 ? 组合模式原理与应用实例分析
Apr 14 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 mssql 时间格式问题
2009/01/13 PHP
Joomla下利用configuration.php存储简单数据
2010/05/19 PHP
PHP为表单获取的URL 地址预设 http 字符串函数代码
2010/05/26 PHP
php计算到指定日期还有多少天的方法
2015/04/14 PHP
php使用Jpgraph绘制柱形图的方法
2015/06/10 PHP
laravel实现查询最后执行的一条sql语句的方法
2019/10/09 PHP
JScript内置对象Array中元素的删除方法
2007/03/08 Javascript
jquery动画1.加载指示器
2012/08/24 Javascript
javascript验证邮件地址和MX记录的方法
2015/06/16 Javascript
jquery实现简单的表单验证
2015/11/17 Javascript
星期几的不同脚本写法(推荐)
2016/06/01 Javascript
浅谈JS中json数据的处理
2016/06/30 Javascript
jQuery.form.js插件不能解决连接超时(timeout)的原因分析及解决方法
2016/10/14 Javascript
jQuery插件ajaxFileUpload异步上传文件
2016/10/19 Javascript
微信小程序商城项目之侧栏分类效果(1)
2017/04/17 Javascript
在Vue组件上动态添加和删除属性方法
2018/02/23 Javascript
Vue-router 中hash模式和history模式的区别
2018/07/24 Javascript
vue-router 手势滑动触发返回功能
2018/09/30 Javascript
浅谈在vue-cli3项目中解决动态引入图片img404的问题
2020/08/04 Javascript
小程序实现上传视频功能
2020/08/18 Javascript
新手该如何学python怎么学好python?
2008/10/07 Python
Python描述器descriptor详解
2015/02/03 Python
手把手教你python实现SVM算法
2017/12/27 Python
Python实现的读取电脑硬件信息功能示例
2018/05/30 Python
Python3.5字符串常用操作实例详解
2019/05/01 Python
python判断字符串以什么结尾的实例方法
2020/09/18 Python
使用pandas实现筛选出指定列值所对应的行
2020/12/13 Python
CSS3 Calc实现滚动条出现页面不跳动问题
2017/09/14 HTML / CSS
css3实现画半圆弧线的示例代码
2017/11/06 HTML / CSS
H5 canvas中width、height和style的宽高区别详解
2018/11/02 HTML / CSS
ABOUT YOU匈牙利:500个最受欢迎的时尚品牌
2019/07/19 全球购物
商务英语本科生的自我评价分享
2013/11/15 职场文书
酒店节能减排方案
2014/05/26 职场文书
2014年人事科工作总结
2014/11/19 职场文书
项目建议书
2015/02/04 职场文书
Python Pandas pandas.read_sql_query函数实例用法分析
2021/06/21 Python