react-router4按需加载(踩坑填坑)


Posted in Javascript onJanuary 06, 2019

react-router4如何去实现按需加载Component,在router4以前,我们是使用getComponent的方式来实现按需加载的,router4中,getComponent方法已经被移除,网上有好几种方案大多都解决的不太彻底,下面我说一下我的方案:

一:创建asyncComponent.js

import React, { Component } from "react";

export default function asyncComponent(importComponent) {
 class AsyncComponent extends Component {
 constructor(props) {
  super(props);

  this.state = {
  component: null
  };
 }

 async componentDidMount() {
  if(this.hasLoadedComponent()){
   return;
  }
  const { default: component } = await importComponent();
  this.setState({
  component: component
  });
 }

 hasLoadedComponent() {
  return this.state.component !== null;
 }
 
 render() {
  const C = this.state.component;

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

 return AsyncComponent;
}

二:在引入asyncComponent.js,并导入需要按需加载的模块

import asyncComponent from "utils/asyncComponent"

 const Home = asyncComponent(() => import("./home"))
 const About = asyncComponent(() => import("./about"))

二:render部分

const routes = () => (
 <BrowserRouter>
  <Switch>
   <Route exact path="/" component={Home} />
   <Route exact path="/about" component={About} />
   <Redirect to="/" />
  </Switch>
 </BrowserRouter>
)

三:预览效果

react-router4按需加载(踩坑填坑)

可以看到有一个警告,内容是

Warning: Can't perform a React state update on an unmounted component. This is a no-op, but it indicates a memory leak in your application. To fix, cancel all subscriptions and asynchronous tasks in the componentWillUnmount method

这个警告其实是在组件卸载的时候执行了setState,虽然这个警告并不影响正常使用,但是看着总是不爽,所以我们要在组件卸载的时候结束setState,如下:

componentWillUnmount(){
 this.setState = (state,callback)=>{
  return
  }
}

四:完整版asyncComponent.js

import React, { Component } from "react";

export default function asyncComponent(importComponent) {
 class AsyncComponent extends Component {
 constructor(props) {
  super(props);

  this.state = {
  component: null
  };
 }

 async componentDidMount() {
  if(this.hasLoadedComponent()){
   return;
  }
  const { default: component } = await importComponent();
  this.setState({
  component: component
  });
 }

 hasLoadedComponent() {
  return this.state.component !== null;
 }
 componentWillUnmount(){
  this.setState = (state,callback)=>{
  return
  }
 }

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

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

 return AsyncComponent;
}

五: webpack部分配置需要配置chunkFilename

eturn {
 output: {
  path: path.resolve(CWD, config.build),
  publicPath: config.static[process.env.MODE],
  chunkFilename: 'js/[name]-[chunkhash:8].js',
  filename: 'js/[name].js',
 },

结尾推广一下我的react-native开源项目:https://github.com/duheng/Mozi

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript使用prototype定义对象类型
Feb 07 Javascript
详解JavaScript ES6中的Generator
Jul 28 Javascript
jQuery实现带延迟的二级tab切换下拉列表效果
Sep 01 Javascript
javascript日期处理函数,性能优化批处理
Sep 06 Javascript
requireJS使用指南
Apr 27 Javascript
JavaScript轻松创建级联函数的方法示例
Feb 10 Javascript
移动端web滚动分页的实现方法
May 05 Javascript
JavaScript在控件上添加倒计时功能的实现代码
Jul 04 Javascript
js实现录音上传功能
Nov 22 Javascript
JQuery中DOM节点的操作与访问方法实例分析
Dec 23 jQuery
快速解决element的autofocus失效问题
Sep 08 Javascript
js实现点击烟花特效
Oct 14 Javascript
React 实现拖拽功能的示例代码
Jan 06 #Javascript
Next.js实现react服务器端渲染的方法示例
Jan 06 #Javascript
vue.js引入外部CSS样式和外部JS文件的方法
Jan 06 #Javascript
Bootstrap4 gulp 配置详解
Jan 06 #Javascript
jQuery实现获取当前鼠标位置并输出功能示例
Jan 05 #jQuery
node.js连接mysql与基本用法示例
Jan 05 #Javascript
Node.js Buffer模块功能及常用方法实例分析
Jan 05 #Javascript
You might like
php中获得视频时间总长度的另一种方法
2011/09/15 PHP
php递归使用示例(php递归函数)
2014/02/14 PHP
php抽象方法和抽象类实例分析
2016/12/07 PHP
PHP处理bmp格式图片的方法分析
2017/07/04 PHP
PHP实现的折半查找算法示例
2017/12/19 PHP
PHPExcel实现表格导出功能示例【带有多个工作sheet】
2018/06/13 PHP
thinkphp5框架实现的自定义扩展类操作示例
2019/05/16 PHP
Array.prototype.slice 使用扩展
2010/06/09 Javascript
javascript针对DOM的应用实例(一)
2012/04/15 Javascript
简单易用的倒计时js代码
2014/08/04 Javascript
jquery引用方法时传递参数原理分析
2014/10/13 Javascript
Thinkphp模板没有解析直接原样输出的解决方法
2014/10/31 Javascript
js实现完全自定义可带多级目录的网页鼠标右键菜单方法
2015/02/28 Javascript
JavaScript返回上一页的三种方法及区别介绍
2015/07/04 Javascript
clipboard.js无需Flash无需依赖任何JS库实现文本复制与剪切
2015/10/10 Javascript
javaScript给元素添加多个class的简单实现
2016/07/20 Javascript
js输入框使用正则表达式校验输入内容的实例
2017/02/12 Javascript
详解nodejs实现本地上传图片并预览功能(express4.0+)
2017/06/28 NodeJs
微信小程序实现添加手机联系人功能示例
2017/11/30 Javascript
详解一个基于react+webpack的多页面应用配置
2019/01/21 Javascript
JS实现的排列组合算法示例
2019/07/16 Javascript
Python基础篇之初识Python必看攻略
2016/06/23 Python
python中的随机函数random的用法示例
2018/01/27 Python
使用python和pygame绘制繁花曲线的方法
2018/02/24 Python
python 自定义对象的打印方法
2019/01/12 Python
Opencv+Python实现图像运动模糊和高斯模糊的示例
2019/04/11 Python
pandas基于时间序列的固定时间间隔求均值的方法
2019/07/04 Python
python实现最大子序和(分治+动态规划)
2019/07/05 Python
opencv 图像加法与图像融合的实现代码
2020/07/08 Python
详解python metaclass(元类)
2020/08/13 Python
欧洲顶级的童装奢侈品购物网站:Bambini Fashion(面向全球)
2018/04/24 全球购物
汽车维修与检测专业应届生求职信
2013/11/12 职场文书
《美丽的公鸡》教学反思
2014/02/25 职场文书
捐资助学感谢信
2015/01/21 职场文书
2016三八妇女节慰问信
2015/11/30 职场文书
MySQL学习必备条件查询数据
2022/03/25 MySQL