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 相关文章推荐
图片上传即时显示缩略图的js代码
May 27 Javascript
让textarea自动调整大小的js代码
Apr 12 Javascript
解释&amp;&amp;和||在javascript中的另类用法
Jul 28 Javascript
基于JavaScript实现点击页面任何位置返回
Aug 31 Javascript
javascript基础知识讲解
Jan 11 Javascript
基于js粘贴事件paste简单解析以及遇到的坑
Sep 07 Javascript
jquery的 filter()方法使用教程
Mar 22 jQuery
Vue实现图片与文字混输效果
Dec 04 Javascript
基于Element的组件改造的树形选择器(树形下拉框)
Feb 27 Javascript
element中table高度自适应的实现
Oct 21 Javascript
JQuery+drag.js上传图片并且实现图片拖曳
Nov 18 jQuery
Vue3.0 手写放大镜效果
Jul 25 Vue.js
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/06/16 PHP
解决文件名解压后乱码的问题 将文件名进行转码的代码
2012/01/10 PHP
php 读取文件头判断文件类型的实现代码
2013/08/05 PHP
PHP中数据库单例模式的实现代码分享
2014/08/21 PHP
ThinkPHP实现非标准名称数据表快速创建模型的方法
2014/11/29 PHP
php查询mssql出现乱码的解决方法
2014/12/29 PHP
浅谈php冒泡排序
2014/12/30 PHP
全新Mac配置PHP开发环境教程
2016/02/03 PHP
Zend Framework入门知识点小结
2016/03/19 PHP
yii2中结合gridview如何使用modal弹窗实例代码详解
2016/06/12 PHP
PHP生成随机数的方法总结
2018/03/01 PHP
Juqery Html(),append()等方法的Bug解决方法
2010/12/13 Javascript
JS实现让网页背景图片斜向移动的方法
2015/02/25 Javascript
Javascript类型系统之String字符串类型详解
2016/06/21 Javascript
JavaScript中transform实现数字翻页效果
2017/03/08 Javascript
Node.js 实现简单的接口服务器的实例代码
2017/05/23 Javascript
js实现QQ面板拖拽效果(慕课网DOM事件探秘)(全)
2017/09/19 Javascript
vue2.0使用swiper组件实现轮播效果
2017/11/27 Javascript
React中的refs的使用教程
2018/02/13 Javascript
vue指令之表单控件绑定v-model v-model与v-bind结合使用
2019/04/17 Javascript
create-react-app中添加less支持的实现
2019/11/15 Javascript
微信小程序批量上传图片到七牛(推荐)
2019/12/19 Javascript
[02:49:21]2019完美盛典全程录像
2019/12/08 DOTA
Python max内置函数详细介绍
2016/11/17 Python
ubuntu系统下 python链接mysql数据库的方法
2017/01/09 Python
Windows下Python2与Python3两个版本共存的方法详解
2017/02/12 Python
Python下调用Linux的Shell命令的方法
2018/06/12 Python
用Python将结果保存为xlsx的方法
2019/01/28 Python
QML使用Python的函数过程解析
2019/09/26 Python
美国生鲜及杂货电商:FreshDirect
2018/01/29 全球购物
技校生自我鉴定范文
2013/09/26 职场文书
2014年妇女工作总结
2014/12/06 职场文书
大学生如何逃脱“毕业季创业队即散伙”魔咒?
2019/08/19 职场文书
护士年终工作总结不会写?各科护士模板总结
2020/01/02 职场文书
解决golang结构体tag编译错误的问题
2021/05/02 Golang
python使用shell脚本创建kafka连接器
2022/04/29 Python