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 相关文章推荐
判断多个元素(RADIO,CHECKBOX等)是否被选择的原理说明
Feb 18 Javascript
IE6、IE7中setAttribute不支持class/for/rowspan/colspan等属性
Aug 28 Javascript
使用js声明数组,对象在jsp页面中(获得ajax得到json数据)
Nov 05 Javascript
JQuery以JSON方式提交数据到服务端示例代码
May 05 Javascript
生成二维码方法汇总
Dec 26 Javascript
Javascript递归打印Document层次关系实例分析
May 15 Javascript
JS实现的打字机效果完整实例
Jun 20 Javascript
JS简单生成随机数(随机密码)的方法
May 11 Javascript
Angular中管道操作符(|)的使用方法
Dec 15 Javascript
cnpm加速Angular项目创建的方法
Sep 07 Javascript
详解axios中封装使用、拦截特定请求、判断所有请求加载完毕)
Apr 09 Javascript
原生JS实现pc端轮播图效果
Dec 21 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
NOT NULL 和NULL
2007/01/15 PHP
php实现给一张图片加上水印效果
2016/01/02 PHP
Yii2.0框架behaviors方法使用实例分析
2019/09/30 PHP
js各种验证文本框输入格式(正则表达式)
2010/10/22 Javascript
jquery无缝向上滚动实现代码
2013/03/29 Javascript
table行随鼠标移动变色示例
2014/05/07 Javascript
JQuery教学之性能优化
2014/05/14 Javascript
jQuery实现磁力图片跟随效果完整示例
2016/09/16 Javascript
Bootstrap Table表格一直加载(load)不了数据的快速解决方法
2016/09/17 Javascript
关于Sequelize连接查询时inlude中model和association的区别详解
2017/02/27 Javascript
javascript实现的图片预览功能
2017/03/25 Javascript
jqgrid实现简单的单行编辑功能
2017/09/30 Javascript
深入浅析Node环境和浏览器的区别
2018/08/14 Javascript
vue(2.x,3.0)配置跨域代理
2019/11/27 Javascript
详解vue-cli项目在IE浏览器打开报错解决方法
2020/12/10 Vue.js
Python  __getattr__与__setattr__使用方法
2008/09/06 Python
pandas 对series和dataframe进行排序的实例
2018/06/09 Python
Python continue继续循环用法总结
2018/06/10 Python
python修改txt文件中的某一项方法
2018/12/29 Python
python读取并定位excel数据坐标系详解
2019/06/26 Python
python实现的爬取电影下载链接功能示例
2019/08/26 Python
python模块如何查看
2020/06/16 Python
解决tensorflow读取本地MNITS_data失败的原因
2020/06/22 Python
python开发入门——set的使用
2020/09/03 Python
python将下载到本地m3u8视频合成MP4的代码详解
2020/11/24 Python
详解前端HTML5几种存储方式的总结
2016/12/27 HTML / CSS
html5响应式开发自动计算fontSize的方法
2020/01/13 HTML / CSS
Erwin Müller穆勒家居瑞士官网:您整个家庭的邮购公司
2019/12/28 全球购物
Monki官网:斯堪的纳维亚的独立时尚品牌
2020/11/09 全球购物
写出二分查找算法的两种实现
2013/05/13 面试题
双语教学实施方案
2014/03/23 职场文书
村干部承诺书
2014/03/28 职场文书
《故乡》教学反思
2014/04/10 职场文书
工作分析计划书
2014/04/30 职场文书
工商干部先进事迹
2014/05/14 职场文书
go语言求任意类型切片的长度操作
2021/04/26 Golang