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实现划词标记+划词搜索功能
Mar 06 Javascript
商城常用滚动的焦点图效果代码简单实用
Mar 28 Javascript
tangram框架响应式加载图片方法
Nov 21 Javascript
jquery序列化表单去除指定元素示例代码
Apr 10 Javascript
原生js实现图片层叠轮播切换效果
Feb 02 Javascript
codeMirror插件使用讲解
Jan 16 Javascript
JQuery页面随滚动条动态加载效果的简单实现(推荐)
Feb 08 Javascript
angular中使用Socket.io实例代码
Jun 03 Javascript
分分钟学会vue中vuex的应用(入门教程)
Sep 14 Javascript
AJAX在JQuery中的应用详解
Jan 30 jQuery
layui 实现二级弹窗弹出之后 关闭一级弹窗的方法
Sep 18 Javascript
nuxt 服务器渲染动态设置 title和seo关键字的操作
Nov 05 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
动态网站web开发 PHP、ASP还是ASP.NET
2006/10/09 PHP
PHP导出Excel实例讲解
2016/01/24 PHP
PHP实现数组的笛卡尔积运算示例
2017/12/15 PHP
js 幻灯片的实现
2011/12/06 Javascript
Jquery图形报表插件 jqplot简介及参数详解
2012/10/10 Javascript
javascript继承之为什么要继承
2012/11/10 Javascript
通过复制Table生成word和excel的javascript代码
2014/01/20 Javascript
jQuery中cookie插件用法实例分析
2015/12/04 Javascript
基于JavaScript创建动态Dom
2015/12/08 Javascript
详细讲解JavaScript中的this绑定
2016/10/10 Javascript
vue使用iframe嵌入网页的示例代码
2020/06/09 Javascript
JS简单判断是否在微信浏览器打开的方法示例
2019/01/08 Javascript
深入理解JS异步编程-Promise
2019/06/03 Javascript
详解element-ui设置下拉选择切换必填和非必填
2019/06/17 Javascript
jquery.pager.js实现分页效果
2019/07/29 jQuery
不刷新网页就能链接新的js文件方法总结
2020/03/01 Javascript
[03:14]辉夜杯主赛事 12月25日每日之星
2015/12/26 DOTA
python设置windows桌面壁纸的实现代码
2013/01/28 Python
python中实现指定时间调用函数示例代码
2017/09/08 Python
python 爬虫一键爬取 淘宝天猫宝贝页面主图颜色图和详情图的教程
2018/05/22 Python
python pandas 时间日期的处理实现
2019/07/30 Python
Python时间序列缺失值的处理方法(日期缺失填充)
2019/08/11 Python
python计算导数并绘图的实例
2020/02/29 Python
Python request中文乱码问题解决方案
2020/09/17 Python
Python文件名匹配与文件复制的实现
2020/12/11 Python
《鞋匠的儿子》教学反思
2014/03/02 职场文书
综治宣传月活动总结
2014/04/28 职场文书
小学教师个人先进事迹材料
2014/05/17 职场文书
要账委托书范本
2014/09/15 职场文书
绿色校园广播稿
2014/10/13 职场文书
小学安全工作总结2015
2015/05/18 职场文书
2015年统战工作总结
2015/05/19 职场文书
初中政治教学工作总结
2015/08/13 职场文书
深入理解Vue的数据响应式
2021/05/15 Vue.js
一文了解Java动态代理的原理及实现
2022/07/07 Java/Android
mysql sock文件存储了什么信息
2022/07/15 MySQL