博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
React组件懒加载
阅读量:5948 次
发布时间:2019-06-19

本文共 1996 字,大约阅读时间需要 6 分钟。

React组件懒加载

Web应用一个重要的优势就在于可以只加载我们想要的功能,而不必每次打开都把整个系统载入

那么,在React里我们怎样实现当用到我们需求的功能时再请求对应的组件,而不是一次性的请求全部代码呢?

bundle-loader

新版的React建议我们使用进行代码的分离,下面我们看下它的用法:

// 当你用到这个函数时,这个chunk才会被请求var waitForChunk = require("bundle-loader!./file.js");//  当请求的chunk加载完成才会执行传入的回调函数,并将请求的模块作为参数传入回调函数waitForChunk(function(file) {    // 接收到懒加载模块,类似于下面代码    // var file = require("./file.js");});

这个插件使用非常简单,只是对require.ensure的封装,使用起来类似于AMD的方式,

只需在回调函数里接收到懒加载的模块即可。

结合React

React 组件也是模块,因此可以使用bundle-loader进行代码分离,只是需要在合适的地方请求调用即可。

怎样知道何时需要请求这个组件呢?社区建议的是先加载一个bundle容器组件(这个bundle容器组件本身非常小),当这个容器组件被渲染到dom时则可认为我们需要请求对应的懒加载组件了。

我们可以为所有的懒加载组件封装一个通用的容器组件:

(这里也有已经封装好的:,直接安装即可)

import React, { Component } from "react";class Bundle extends Component {  state = {    // 因为module被占用了,我们用mod定义变量    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(mod => {      this.setState({        // 为了兼容es module 和 AMD module        mod: mod.default ? mod.default : mod      });    });  }  render() {    //若加载完成则渲染对应懒加载的组件,反之加载beforeLoad传入的组件    return this.state.mod      ? 
:
; }}export default Bundle;

如上封装,使用时我们只需如下即可:

import React, { Component } from "react";import Bundle from "./Bundle";import Test from "bundle-loader?lazy&name=[name]!./test";const BeforeLoadComponent = props =>  
before load {props.name}
;class HomePage extends Component { render() { return (
); }}export default HomePage;

怎么样,是不是特别简单

结合React Router

结合React Router也非常简单,因为已经把Bundle作为Route的component参数了,

所以要再封装一层,把load和beforeLoad预先传入即可。

import Bundle from "./Bundle";import About from "bundle-loader?lazy&name=[name]!./About";const AboutWrapper = props => 
;class App extends Component { render() { return (

Welcome!

) }}

转载地址:http://aebxx.baihongyu.com/

你可能感兴趣的文章
mysql系统变量
查看>>
svn cleanup failed–previous operation has not finished; run cleanup if it was interrupted
查看>>
JavaScript 编码规范(中文/Airbnb公司版)
查看>>
DNX/ASP.NET 5的xUnit入门向导
查看>>
正则表达式—匹配连续重复的字符
查看>>
如何在一个月内改善你的生活
查看>>
beyond compare比较工具设置
查看>>
Java中的事务
查看>>
Spring Ajax一个简单样例
查看>>
传递给数据库 'master' 中的日志扫描操作的日志扫描号无效
查看>>
导入https证书
查看>>
SAP R3和JAVA交换数据之JCO
查看>>
近期给朋友推荐的笔记本型号
查看>>
sqlserver使用存储过程发送http请求
查看>>
oracle 相关操作
查看>>
JAVA WEB快速入门之通过一个简单的Spring项目了解Spring的核心(AOP、IOC)
查看>>
activeMQ安全配置及常见问题解决
查看>>
实作 ASP.NET 多笔数据离线编辑(转)
查看>>
solr的用分布式搜索(转)
查看>>
多媒体开发之rtmp---rtmp client 编译
查看>>