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源码]超长文章自动分页(客户端版)
Jan 09 Javascript
Js 获取当前日期时间及其它操作实现代码
Mar 04 Javascript
js 键盘记录实现(兼容FireFox和IE)
Feb 07 Javascript
javascript 静态对象和构造函数的使用和公私问题
Mar 02 Javascript
jquery 全局AJAX事件使用代码
Nov 05 Javascript
javascript面向对象入门基础详细介绍
Sep 05 Javascript
原生JS绑定滑轮滚动事件兼容常见浏览器
Jun 30 Javascript
JavaScript实现的多种鼠标拖放效果
Nov 03 Javascript
详解webpack的配置文件entry与output
Aug 21 Javascript
对Vue table 动态表格td可编辑的方法详解
Aug 28 Javascript
详解vue中使用微信jssdk
Apr 19 Javascript
JavaScript实现瀑布流布局的3种方式
Dec 27 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
基于pear auth实现登录验证
2010/02/26 PHP
PHP goto语句简介和使用实例
2014/03/11 PHP
PNG背景在不同浏览器下的应用
2009/06/22 Javascript
web前端开发也需要日志
2010/12/09 Javascript
事件绑定之小测试  onclick &amp;&amp; addEventListener
2011/07/31 Javascript
JavaScript中统计Textarea字数并提示还能输入的字符
2014/06/10 Javascript
一个获取第n个元素节点的js函数
2014/09/02 Javascript
原生javascript获取元素样式
2014/12/31 Javascript
jquery使用ul模拟select实现表单美化的方法
2015/08/18 Javascript
jQuery实现的自动加载页面功能示例
2016/09/04 Javascript
JavaScript数组去重的几种方法效率测试
2016/10/23 Javascript
AngularJS的ng-repeat指令与scope继承关系实例详解
2017/01/21 Javascript
在React 组件中使用Echarts的示例代码
2017/11/08 Javascript
详解js正则表达式验证时间格式xxxx-xx-xx形式
2018/02/09 Javascript
详解ES6通过WeakMap解决内存泄漏问题
2018/03/09 Javascript
jQuery实现带右侧索引功能的通讯录示例【附源码下载】
2018/04/17 jQuery
菊花转动的jquery加载动画效果
2018/08/19 jQuery
js时间戳转yyyy-MM-dd HH-mm-ss工具类详解
2019/04/30 Javascript
[01:21:07]EG vs Liquid 2018国际邀请赛淘汰赛BO3 第一场 8.25
2018/08/29 DOTA
Python模拟百度登录实例详解
2016/01/20 Python
Python科学计算之NumPy入门教程
2017/01/15 Python
使用python编写监听端
2018/04/12 Python
通过Python模块filecmp 对文件比较的实现方法
2018/06/29 Python
Python列表生成式与生成器操作示例
2018/08/01 Python
pycham查看程序执行的时间方法
2018/11/29 Python
python基于C/S模式实现聊天室功能
2019/01/09 Python
python-tkinter之按钮的使用,开关方法
2019/06/11 Python
Gauss-Seidel迭代算法的Python实现详解
2019/06/29 Python
解决运行django程序出错问题 'str'object has no attribute'_meta'
2020/07/15 Python
使用Html5中的cavas画一面国旗
2019/09/25 HTML / CSS
Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?
2014/07/27 面试题
公司任命书模板
2014/06/06 职场文书
计划生育诚信协议书
2014/11/02 职场文书
学校2014年度工作总结
2014/12/06 职场文书
CSS3鼠标悬浮过渡缩放效果
2021/04/17 HTML / CSS
sql时间段切分实现每隔x分钟出一份高速门架车流量
2022/02/28 SQL Server