react-router4.x 实用例子(路由过渡动画、代码分割)
react-router4.2.0实用例子
代码分割
官网上面写的代码分割是不支持create-react-app脚手架的,要使用import实现
创建一个bundle.js文件
import { Component } from 'react'
class Bundle extends Component {
constructor(props) {
super(props);
this.state = {
mod: null
};
}
componentWillMount() {
this.load(this.props)
}
componentWillReceiveProps(nextProps) {
if (nextProps.load !== this.props.load) {
this.load(nextProps)
}
}
load(props) {
this.setState({
mod: null
});
props.load().then((mod) => {
this.setState({
mod: mod.default ? mod.default : mod
});
});
}
render() {
return this.state.mod ? this.props.children(this.state.mod) : null;
}
}
export default Bundle
假设有一个自己的子组件需要代码分割
demo.js
import React from 'react'
const MyComponent = () => (
<div>我是子组件</div>
)
export default MyComponent;
在需要代码分割的文件中导入这个Bundle
import Bundle from './test.js'
const MyComponent = (props) => (
<Bundle load={() => import('./demo.js')}>
{(MyComponent) => <MyComponent {...props} />}
</Bundle>
)
只有当MyComponent在文件中使用到了,才会去异步加载需要的组件
** 补充
如果你要和代码分割一起使用建议将Bundle.js文件修改成如下,如果不修改,亲测有bug
import React, { Component } from 'react'
class Bundle extends Component {
constructor() {
super()
this.state = {
mod: null
}
}
async componentDidMount() {
const {default: mod} = await this.props.load()
this.setState({
mod: mod.default || mod
})
}
render() {
return (
this.state.mod ? this.props.children(this.state.mod) : null
)
}
} export default Bundle
ScrollTop实现方式一
默认情况下,react中的组件在路由之间切换时不会默认回到页面的最顶部,这时需要自己动手编写一个组件实现这个功能
创建ScrollTop.js文件
import { Component } from 'react'
import { withRouter } from 'react-router'
class ScrollToTop extends Component {
componentDidUpdate(prevProps) {
if (this.props.location !== prevProps.location) {
window.scrollTo(0, 0)
}
}
render() {
return this.props.children
}
}
export default withRouter(ScrollToTop)
使用
import ScrollTop from './ScrollTop.js'
将router内部的子元素全部使用ScrollTop包裹即可
<Router>
<ScrollTop>
<div>
<div style={{"position":"fixed","top": 0,"left": 0}}>
<Link to="/a">组件一</Link>
<Link to="/b">组件二</Link>
</div>
<Route path="/a" component={Demo} />
<Route path="/b" component={Demo1} />
</div>
</ScrollTop>
</Router>
ScrollTop实现方式二
创建ScrollTop.js文件,添加如下内容
import { Component } from 'react'
import { withRouter } from 'react-router'
class ScrollToTopOnMount extends Component {
componentDidMount(prevProps) {
window.scrollTo(0, 0)
}
render() {
return null
}
}
export default ScrollToTopOnMount
使用
import ScrollToTopOnMount from './scrollTop.js'
将你原本的组件重新封装一个组件来使用即可
class LongContent extends React.Component {
render() {
return (
<div>
<ScrollToTopOnMount/>
<Demo />
</div>
)
}
}
路由之间的动画切换
结合react-transition-group插件使用,官方推荐,详细点击http://www.cnblogs.com/ye-hcj/p/7723104.html
demo如下
import React from 'react'
import ReactDOM from 'react-dom'
import {TransitionGroup,CSSTransition } from 'react-transition-group'
import { withRouter } from 'react-router'
import './index.css'
import {
BrowserRouter as Router,
Route,
Link,
Switch
} from 'react-router-dom'
const MyComponent1 = () => (
<div style={{"height": "200px","width": "200px","background": "red","position": "absolute","top": 0, "left": 0}}>我是组件一</div>
)
const MyComponent2 = () => (
<div style={{"height": "200px","width": "200px","background": "yellow","position": "absolute","top": 0, "left": 0}}>我是组件二</div>
)
const MyComponent3 = () => (
<div style={{"height": "200px","width": "200px","background": "green","position": "absolute","top": 0, "left": 0}}>我是组件三</div>
)
const AnimateComponent = withRouter(( {location} ) => (
<div>
<p><Link to="/a">组件一</Link></p>
<p><Link to="/b">组件二</Link></p>
<p><Link to="/c">组件三</Link></p>
<hr />
<TransitionGroup>
{/*这里使用location.key会在所有的路由之间使用相同的动画效果,如果你不想子路由也应用动画效果请使用location.pathname.split('/')[1]*/}
<CSSTransition key={location.key} timeout={500} classNames="fade" mountOnEnter={true} unmountOnExit={true}>
<div style={{"position": "relative","top": 0,"left": 0}}>
<Switch location={location}>
<Route path="/a" exact component={MyComponent1}/>
<Route path="/b" component={MyComponent2}/>
<Route path="/c" component={MyComponent3}/>
</Switch>
</div>
</CSSTransition>
</TransitionGroup>
</div>
))
class MyComponent extends React.Component {
render () {
return (
<Router>
<AnimateComponent></AnimateComponent>
</Router>
)
}
}
ReactDOM.render(
<MyComponent/>,
document.getElementById('root')
)
注:
你可能使用的动画
.fade-enter {
opacity: 0;
z-index: 1;
}
.fade-enter.fade-enter-active {
opacity: 1;
transition: opacity 250ms ease-in;
}
react-router4.x 实用例子(路由过渡动画、代码分割)的更多相关文章
- Vue - 解决路由过渡动画抖动问题
前言 Vue-Router 作为 Vue 的核心模块,它为我们提供了基于组件的路由配置.路由参数等功能,让单页面应用变得更易于管理.良好的路由管理尤为重要,比如路由拦截.路由懒加载.路由权限等都在开发 ...
- 基于 React 实现一个 Transition 过渡动画组件
过渡动画使 UI 更富有表现力并且易于使用.如何使用 React 快速的实现一个 Transition 过渡动画组件? 基本实现 实现一个基础的 CSS 过渡动画组件,通过切换 CSS 样式实现简单的 ...
- iOS学习笔记-自定义过渡动画
代码地址如下:http://www.demodashi.com/demo/11678.html 这篇笔记翻译自raywenderlick网站的过渡动画的一篇文章,原文用的swift,由于考虑到swif ...
- 067——VUE中vue-router之使用transition设置酷炫的路由组件过渡动画效果
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- react过渡动画效果的实现,react-transition-group
本文介绍react相关的过渡动画效果的实现 有点类似vue的transition组件,主要用于组件mount和unmount之前切换时应用动画效果 安装 cnpm install react-tran ...
- Vue 路由知识三(过渡动画及路由钩子函数)
路由的过渡动画:让路由有过渡动画,需要在<router-view>标签的外部添加<transition>标签,标签还需要一个name属性. <transition nam ...
- 12 react 基础 的 css 过渡动画 及 动画效果 及 使用 react-transition-group 实现动画
一. 过渡动画 # index.js import React from 'react';import ReactDOM from 'react-dom';import App from './app ...
- 基于ReactCSSTransitionGroup实现react-router过渡动画
此前,我使用了react-router库来完成单页应用的路由,从而实现组件之间的切换能力.然而,默认页面的切换是非常生硬的,为了让页面切换更加缓和与舒适,通常的方案就是过渡动画. 这里我调研了2种 ...
- react-router 路由切换动画
路由切换动画 因为项目的需求,需要在路由切换的时候,加入一些比较 zb 的视觉效果,所以研究了一下.把这些学习的过程记录下来,以便以后回顾.同时也希望这些内容能够帮助一些跟我一样的菜鸟,让他们少走些坑 ...
随机推荐
- JAVA 中的集合框架
java集合框架提供了一套性能优良.使用方便的接口和类,它们位于java.util包中 一.集合与数组 数组:(可以存储基本数据类型)是用来存现对象的一种容器,但是数组的长度固定,不适合在对象数量未知 ...
- Don't add unneeded context不要加不需要的文本
- spring boot: 线程池ThreadPoolTaskExecutor, 多线程
由于项目里需要用到线程池来提高处理速度,记录一下spring的taskExecutor执行器来实现线程池. ThreadPoolTaskExecutor的配置在网上找了很多解释没找到,看了下Threa ...
- R文件报错:cannot resolve symbol ‘R’
今天仿照别人项目,因为不太熟悉Androidstudio,所以就照着他项目结构走,结果包名跟他的不一样,项目一直报标题这个错误,网上百度了很多也没用,不过先把网上的解决方案copy一下 请注意 ① E ...
- Microsoft SQL Server for Linux安装和配置
虽说mssql for linux早已经出来了,但原本没有打算这么早就去尝试的,无奈之下还是得先尝试用了,这里分几篇介绍我在用mssql for linux时遇到的问题,不得不说作为先吃螃蟹的人总是要 ...
- Codeforces 610D Vika and Segments 线段树+离散化+扫描线
可以转变成上一题(hdu1542)的形式,把每条线段变成宽为1的矩形,求矩形面积并 要注意的就是转化为右下角的点需要x+1,y-1,画一条线就能看出来了 #include<bits/stdc++ ...
- HDU 2203 kmp
http://acm.hdu.edu.cn/showproblem.php?pid=2203 亲和串 Time Limit: 3000/1000 MS (Java/Others) Memory ...
- RK30SDK开发板驱动分析(二):DDR频率配置
在内核配置界界面,我们可以很容易的配置DDR的频率,300M OR 600M, so easy! 那么它是如何起作用的呢? 回想 RK30SDK开发板驱动分析(一) 末尾提到MACHINE_START ...
- C++Builder XE5对于C++11的支持真蛋疼
好不容易下载个XE5,安装,破解,准备测试一下C++11中的lambda,写了一个最简单的表达式: [](){}; 居然编译通不过. 查了帮助文档,才晓得它的编译器分为BCC32和BCC64, BCC ...
- App自动化测试探索(二)MAC环境搭建iOS+Python+Appium测试环境
环境搭建要求,MAC 机器一台,要求 Xcode 8.0以上 1. 安装 Homebrew /usr/bin/ruby -e "$(curl -fsSL https://raw.github ...