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_02_理解undefined和null
Oct 11 Javascript
jquery select(列表)的操作(取值/赋值)
Mar 16 Javascript
jquery zTree异步加载简单实例分享
Feb 05 Javascript
jQuery中:reset选择器用法实例
Jan 04 Javascript
简单的jQuery banner图片轮播实例代码
Mar 04 Javascript
JavaScript 数组的进化与性能分析
Sep 18 Javascript
基于 Immutable.js 实现撤销重做功能的实例代码
Mar 01 Javascript
JS遍历DOM文档树的方法实例详解
Apr 03 Javascript
移动端H5页面返回并刷新页面(BFcache)的方法
Nov 06 Javascript
layui输入框只允许输入中文且判断长度的例子
Sep 18 Javascript
快速解决element的autofocus失效问题
Sep 08 Javascript
微信小程序实现日历小功能
Nov 18 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安装攻略:常见问题解答(一)
2006/10/09 PHP
Symfony2函数用法实例分析
2016/03/18 PHP
php 使用curl模拟登录人人(校内)网的简单实例
2016/06/06 PHP
PHP编程计算两个时间段是否有交集的实现方法(不算边界重叠)
2017/05/30 PHP
Laravel5.* 打印出执行的sql语句的方法
2017/07/24 PHP
php中对象引用和复制实例分析
2019/08/14 PHP
用JavaScript仿PS里的羽化效果代码
2011/12/20 Javascript
jQuery循环滚动展示代码 可应用到文字和图片上
2012/05/11 Javascript
javascript中的取反再取反~~没有意义
2014/04/06 Javascript
javascript实现支持移动设备画廊
2015/08/24 Javascript
一分钟理解js闭包
2016/05/04 Javascript
浅谈时钟的生成(js手写简洁代码)
2016/08/20 Javascript
JS树形菜单组件Bootstrap TreeView使用方法详解
2016/12/21 Javascript
微信小程序 使用腾讯地图SDK详解及实现步骤
2017/02/28 Javascript
gulp安装以及打包合并的方法教程
2017/11/19 Javascript
Vue不能观察到数组length的变化
2018/06/08 Javascript
使用jquery模拟a标签的click事件无法实现跳转的解决
2018/12/04 jQuery
node.js开发辅助工具nodemon安装与配置详解
2020/02/06 Javascript
JS变量提升及函数提升实例解析
2020/09/03 Javascript
微信小程序实现拼图小游戏
2020/10/22 Javascript
antd-DatePicker组件获取时间值,及相关设置方式
2020/10/27 Javascript
[54:41]2018DOTA2亚洲邀请赛3月30日 小组赛B组 VGJ.T VS paiN
2018/03/31 DOTA
[01:16:01]VGJ.S vs Mski Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
简单介绍Python中的floor()方法
2015/05/15 Python
Python之自动获取公网IP的实例讲解
2017/10/01 Python
python re模块的高级用法详解
2018/06/06 Python
解决pandas .to_excel不覆盖已有sheet的问题
2018/12/10 Python
python接口自动化如何封装获取常量的类
2019/12/24 Python
利用纯css3实现的文字亮光特效的代码演示
2014/11/27 HTML / CSS
css3中less实现文字长阴影(long shadow)
2020/04/24 HTML / CSS
安全生产警示教育活动总结
2015/05/09 职场文书
治庸问责工作总结
2015/08/11 职场文书
Go 语言结构实例分析
2021/07/04 Golang
python数字类型和占位符详情
2022/03/13 Python
基于Apache Hudi在Google云构建数据湖平台的思路详解
2022/04/07 Servers
windows安装 redis 6.2.6最新步骤详解
2022/04/26 Redis