React Router:Loading Routes Lazily

Load component when needed

在被用到时load component;

asyncComponent.js
传入的function为import();

import React,{Component} from 'react';

const asyncComponent = (importComponent)=>{
  return class extends Component{
    state={
      component:null
    }

    componentDidMount(){
      importComponent()  //作为一个异步函数传入
        .then(cmp=>{
          this.setState({component:cmp.default});
        });
    }

    render(){
      const C = this.state.component;

      return C?<C{...this.props}/>:null;
    }
  }
}

export default asyncComponent;

Blog.js
用AsyncNewPost替代NewPost;

import asyncComponent from '../../hoc/asyncComponent';
const AsyncNewPost= asyncComponent(()=>{
    return import('./NewPost/NewPost');
            //动态import
            //当该函数执行时,进行import
    //当AsyncNewPost被render时,此函数被调用
});

16.6以上的react新特性

引入Suspense和Route;

import React, { Component ,Suspense} from 'react';
import { BrowserRouter, Route, NavLink } from 'react-router-dom';

使用React.lazy(()=>import(‘’))设置动态引入;
使用Suspense fallback进行load的JSX控制;
此时< Posts />为动态load;

const Posts = React.lazy(()=>import('./containers/Posts')); //必须使用default exports

当进入/posts时,对< Posts />进行动态render;

          <Route path="/posts" render={()=>(
            <Suspense fallback={<div>Loading...</div>}>
              <Posts/>
            </Suspense>
            )
          }/>

使用lazy动态显示

const Posts = React.lazy(()=>import('./containers/Posts')); //必须使用default exports
  state={show:false};
  modeHandler=()=>{
    this.setState(prevState=>{
      return {show :!prevState.show};
    });
  };

此时当state.show为true时,post被调用,< Post />被render,则该component被loaded;

    return (
      <React.Fragment>
        <button onClick={this.modeHandler}>Toggle Mode</button>
        {this.state.show?(
          <Suspense fallback={<div>Loading...</div>}>
            <Posts/>
          </Suspense>
        ):<User/>}
      </React.Fragment>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值