react-router4.2.0实用例子

  1. 代码分割

    官网上面写的代码分割是不支持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
  2. 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>
  3. 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>
    )
    }
    }
  4. 路由之间的动画切换

    结合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 实用例子(路由过渡动画、代码分割)的更多相关文章

  1. Vue - 解决路由过渡动画抖动问题

    前言 Vue-Router 作为 Vue 的核心模块,它为我们提供了基于组件的路由配置.路由参数等功能,让单页面应用变得更易于管理.良好的路由管理尤为重要,比如路由拦截.路由懒加载.路由权限等都在开发 ...

  2. 基于 React 实现一个 Transition 过渡动画组件

    过渡动画使 UI 更富有表现力并且易于使用.如何使用 React 快速的实现一个 Transition 过渡动画组件? 基本实现 实现一个基础的 CSS 过渡动画组件,通过切换 CSS 样式实现简单的 ...

  3. iOS学习笔记-自定义过渡动画

    代码地址如下:http://www.demodashi.com/demo/11678.html 这篇笔记翻译自raywenderlick网站的过渡动画的一篇文章,原文用的swift,由于考虑到swif ...

  4. 067——VUE中vue-router之使用transition设置酷炫的路由组件过渡动画效果

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. react过渡动画效果的实现,react-transition-group

    本文介绍react相关的过渡动画效果的实现 有点类似vue的transition组件,主要用于组件mount和unmount之前切换时应用动画效果 安装 cnpm install react-tran ...

  6. Vue 路由知识三(过渡动画及路由钩子函数)

    路由的过渡动画:让路由有过渡动画,需要在<router-view>标签的外部添加<transition>标签,标签还需要一个name属性. <transition nam ...

  7. 12 react 基础 的 css 过渡动画 及 动画效果 及 使用 react-transition-group 实现动画

    一. 过渡动画 # index.js import React from 'react';import ReactDOM from 'react-dom';import App from './app ...

  8. 基于ReactCSSTransitionGroup实现react-router过渡动画

      此前,我使用了react-router库来完成单页应用的路由,从而实现组件之间的切换能力.然而,默认页面的切换是非常生硬的,为了让页面切换更加缓和与舒适,通常的方案就是过渡动画. 这里我调研了2种 ...

  9. react-router 路由切换动画

    路由切换动画 因为项目的需求,需要在路由切换的时候,加入一些比较 zb 的视觉效果,所以研究了一下.把这些学习的过程记录下来,以便以后回顾.同时也希望这些内容能够帮助一些跟我一样的菜鸟,让他们少走些坑 ...

随机推荐

  1. 【P2629】好消息,坏消息(前缀和+单调队列优化DP)

    一激动一颓就会忘了总结... 前面的大黄题就不总结了. 这个题我只想说一声艹,一开始的思路就是正确的,然后计算的时候有了一个瑕疵,不过很快也就改过来了.然后却一直连样例都过不了.仔仔细细看了老半天,经 ...

  2. 【bzoj4765】普通计算姬(双重分块)

    题目传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4765 这道题已经攒了半年多了...因为懒,一直没去写...所以今天才把这道题写出来... ...

  3. ZSTU 4241 圣杯战争(线段树+经典)

    题意:CS召唤了n个实验怪兽,第i号怪兽在i这个位置出.并把KI召唤出的第i位从者安排在pos(i)处,总共有m位从者. 第i只怪兽有战斗力atk(i), 而i号从者的体力为AP(i).如果从者想要移 ...

  4. 用TinyXml做XML解析示例 TinyXml查找唯一节点及修改节点操作

    // 读者对象:对TinyXml有一定了解的人.本文是对TinyXml工具的一些知识点的理解. // 1 TinyXml中对TiXmlNode进行了分类,是用一个枚举进行描述的. // enum No ...

  5. Codeforces Round #435 (Div. 2) c+d

    C:给n和k要求,找出n个不同的数,使得亦或起来等于k 可以先预处理从1到1e5,找亦或起来等于(11111111111111111)(二进制)的所有对数,然后四个一起亦或就是0了,再和k亦或 可以看 ...

  6. java常用封装方法

    public Map<String,String> getDateByStr(String str,String startDate,String endTime){ Map<Str ...

  7. hdu-2544-最短路(Floyd算法模板)

    题目链接 题意很清晰,入门级题目,适合各种模板,可用dijkstra, floyd, Bellman-ford, spfa Dijkstra链接 Floyd链接 Bellman-Ford链接 SPFA ...

  8. HDU - 5730 :Shell Necklace(CDQ分治+FFT)

    Perhaps the sea‘s definition of a shell is the pearl. However, in my view, a shell necklace with n b ...

  9. [BZOJ1242]Fishing Net

    dbzoj vjudge1 vjudge2 sol 给一个无向图,求判定是不是弦图. sol 还是弦图那套理论. 复杂度是\(O(n^2)\)的,因为\(m\)本质上和\(n^2\)是同级的. cod ...

  10. LeetCode Can Place Flowers

    原题链接在这里:https://leetcode.com/problems/can-place-flowers/description/ 题目: Suppose you have a long flo ...