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 相关文章推荐
jquery判断checkbox(复选框)是否被选中的代码
Oct 20 Javascript
js字符编码函数区别分析
Dec 28 Javascript
什么是json和jsonp,jQuery json实例详详细说明
Dec 11 Javascript
解析DHTML,JavaScript,DOM,BOM以及WEB标准的描述
Jun 19 Javascript
js使用eval解析json实例与注意事项分享
Jan 18 Javascript
jQuery 删除或是清空某个HTML元素示例
Aug 04 Javascript
JQuery实现左右滚动菜单特效
Sep 28 Javascript
Jquery Easyui自定义下拉框组件使用详解(21)
Dec 31 Javascript
JS中定位 position 的使用实例代码
Aug 06 Javascript
Vue实现开心消消乐游戏算法
Oct 22 Javascript
bootstrapValidator表单校验、更改状态、新增、移除校验字段的实例代码
May 19 Javascript
浅析JavaScript中的事件委托机制跟深浅拷贝
Jan 20 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 程序员也要学会使用“异常”
2009/06/16 PHP
PHP游戏编程25个脚本代码
2011/02/08 PHP
Yii的CDbCriteria查询条件用法实例
2014/12/04 PHP
对比分析php中Cookie与Session的异同
2016/02/19 PHP
php resizeimage 部分jpg文件 生成缩略图失败的原因分析及解决办法
2016/03/23 PHP
yii2控制器Controller Ajax操作示例
2016/07/23 PHP
Asp.net下利用Jquery Ajax实现用户注册检测(验证用户名是否存)
2010/09/12 Javascript
jQuery动态地获取系统时间实现代码
2013/05/24 Javascript
Node.js模块加载详解
2014/08/16 Javascript
JQuery勾选指定name的复选框集合并显示的方法
2015/05/18 Javascript
node安装--linux下的快速安装教程
2017/03/21 Javascript
jQuery幻灯片插件owlcarousel参数说明中文文档
2018/02/27 jQuery
vue实现选项卡及选项卡切换效果
2018/04/24 Javascript
vue组件间的参数传递实例详解
2019/04/26 Javascript
vue中的v-if和v-show的区别详解
2019/09/01 Javascript
微信小程序自定义tabBar在uni-app的适配详解
2019/09/30 Javascript
vue cli4下环境变量和模式示例详解
2020/04/09 Javascript
关于vue3默认把所有onSomething当作v-on事件绑定的思考
2020/05/15 Javascript
[36:33]2018DOTA2亚洲邀请赛 4.3 突围赛 EG vs Newbee 第二场
2018/04/04 DOTA
Python爬取Coursera课程资源的详细过程
2014/11/04 Python
Python中的生成器和yield详细介绍
2015/01/09 Python
浅谈Python中chr、unichr、ord字符函数之间的对比
2016/06/16 Python
python数字图像处理之高级形态学处理
2018/04/27 Python
Python进阶之@property动态属性的实现
2019/04/01 Python
python中property和setter装饰器用法
2019/12/19 Python
python sorted函数原理解析及练习
2020/02/10 Python
在django中使用post方法时,需要增加csrftoken的例子
2020/03/13 Python
在django中实现choices字段获取对应字段值
2020/07/12 Python
机电工程学生自荐信范文
2013/12/07 职场文书
大学新生军训自我鉴定范文
2014/09/13 职场文书
2014年新农村建设工作总结
2014/12/01 职场文书
2014年助理政工师工作总结
2014/12/19 职场文书
python某漫画app逆向
2021/03/31 Python
你喜欢篮球吗?Python实现篮球游戏
2021/06/11 Python
springboot使用Redis作缓存使用入门教程
2021/07/25 Redis
python中if和elif的区别介绍
2021/11/07 Python