React项目中组件懒加载的四种方式

什么是懒加载?

懒加载顾名思义就是延时加载,即当对象需要用到的时候再去加载。

react中组件的懒加载的4种方法
  • webpack+es6的import(this.props.children为回调函数)

  • webpack+es6的import纯粹的高阶组件

  • webpack+es6的import +async(高阶函数)

  • webpack+require.ensure (高阶组件)

方法一:webpack+es6的import(this.props.children为回调函数)
import React , { Component } from 'react';

export default class  extends Component {

    constructor ( props ) {

        super ( props );

        this.load(props); //调用下面load

        this.state={

            Com:null

        };

    };

    load(props){ //this.props.load()就是调用indexrou.jsx传过来的函数

        props.load().then((Com)=>{

           console.log(Com.default);//得到的就是传过来的函数

            this.setState({

                Com:Com.default?Com.default:null

            });

        });

    };

    render () {

        if(!this.state.Com){

            return null;

        }else{

            return this.props.children(this.state.Com);

        }

    };

};

在路由中使用:

import Load from '../components/lazy';

let Demo2=function(){

    return <Load load={()=>import('../components/demo2')}>

        {(Com)=><Com/>} 

    </Load>;

};
方法二:webpack+es6的import纯粹的高阶组件
import React , { Component } from 'react';

export default function(loading){//传过来一个函数

    return class extends Component {

        constructor ( props ) {

            super ( props );

            this.state={

                Com:null

            };

            this.load();

        };

        load(props){

            loading().then((Com)=>{  //调用函数获取它传过来的路径

                this.setState({

                    Com:Com.default?Com.default:null

                });

            });

        };

        render () {

            let Com=this.state.Com;

            return Com?<Com/>:null;

        };

    };

}

在路由中使用:

import Load from '../components/lazy';

let Demo2=Load(()=>import('../components/demo2'));
方法三:webpack+es6的import +async(高阶函数)
import React , { Component } from 'react'

export default function(loading){

    return class extends Component {

        constructor ( props ) {

            super ( props );

            this.state={

                Com:null

            };

        };

        //即使是同步的话执行的也是promise.resolve这个方法,将同步代码包装一层,进行同步

        //await后面接收的是值或promise

        async componentWillMount(){

            let Com=await loading();  //依次执行,只有一个await往下走,Com是有值的

            this.setState({

                Com:Com.default?Com.default:null

            });

        };

        render () {

            let Com=this.state.Com;

            return Com?<Com/>:null;

        };

    };

}

在路由中使用:

import Load from '../components/lazy';

let Demo2=Load(()=>import('../components/demo2'));
方法四:webpack+require.ensure (高阶组件)
import React , { Component } from 'react';

export default function(loading){

    return class extends Component {

        constructor ( props ) {

            super ( props );

            this.state={

                Com:null

            };

        };

        componentWillMount(){

            new Promise((resolve,reject)=>{

                require.ensure([], function(require) {//[]依赖项

                    var c = loading().default;

                    console.log(c);

                    resolve(c);

                });

            }).then((data)=>{

                this.setState({

                    Com:data

                });

            });

        };

        render(){

            let Com=this.state.Com;

            return Com?<Com/>:null;

        };

    };

}

在路由中使用:

import Load from '../components/lazy';

let Demo2=Load(()=>require('../components/demo2'));
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。