美文网首页
React项目中组件懒加载的四种方式

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

作者: 潇湘轮回 | 来源:发表于2020-05-19 09:25 被阅读0次
    什么是懒加载?

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

    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'));
    

    相关文章

      网友评论

          本文标题:React项目中组件懒加载的四种方式

          本文链接:https://www.haomeiwen.com/subject/nrdvohtx.html