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判断变量是否空值的代码
Oct 26 Javascript
Jquery选择器 $实现原理
Dec 02 Javascript
jQuery EasyUI API 中文文档 - Panel面板
Sep 30 Javascript
JQuery表格内容过滤的实现方法
Jul 05 Javascript
javascript相等运算符与等同运算符详细介绍
Nov 09 Javascript
js 动态添加元素(div、li、img等)及设置属性的方法
Jul 19 Javascript
jQuery 判断是否包含在数组中Array[]的方法
Aug 03 Javascript
完美解决IE不支持Data.parse()的问题
Nov 24 Javascript
vue2.0开发实践总结之疑难篇
Dec 07 Javascript
Bootstrap jquery.twbsPagination.js动态页码分页实例代码
Feb 20 Javascript
利用Angular+Angular-Ui实现分页(代码加简单)
Mar 10 Javascript
Node.js中的cluster模块深入解读
Jun 11 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
4.与数据库的连接
2006/10/09 PHP
Server.HTMLEncode让代码在页面里显示为源代码
2013/12/08 PHP
线路分流自动跳转代码;希望对大家有用!
2006/12/02 Javascript
Javascript 学习笔记 错误处理
2009/07/30 Javascript
JS.findElementById()使用介绍
2013/09/21 Javascript
javascript编写简易计算器
2017/05/06 Javascript
JS实现简单的星期格式转换功能示例
2018/07/23 Javascript
小程序开发踩坑:页面窗口定位(相对于浏览器定位)(推荐)
2019/04/25 Javascript
JS/CSS实现字符串单词首字母大写功能
2019/09/03 Javascript
vue iview的菜单组件Mune 点击不高亮的解决方案
2019/11/01 Javascript
Vue2.4+新增属性.sync、$attrs、$listeners的具体使用
2020/03/08 Javascript
浅谈vue中$event理解和框架中在包含默认值外传参
2020/08/07 Javascript
Python使用Srapy框架爬虫模拟登陆并抓取知乎内容
2016/07/02 Python
python用Pygal如何生成漂亮的SVG图像详解
2017/02/10 Python
python学习必备知识汇总
2017/09/08 Python
Python有序查找算法之二分法实例分析
2017/12/11 Python
python合并已经存在的sheet数据到新sheet的方法
2018/12/11 Python
Python如何实现动态数组
2019/11/02 Python
使用Django清空数据库并重新生成
2020/04/03 Python
详解Anaconda安装tensorflow报错问题解决方法
2020/11/01 Python
matplotlib之属性组合包(cycler)的使用
2021/02/24 Python
Expedia马来西亚旅游网站:廉价酒店,度假村和航班预订
2016/07/26 全球购物
学生自我鉴定模板
2013/12/30 职场文书
杠杆的科学教学反思
2014/01/10 职场文书
高中生的自我鉴定范文
2014/01/24 职场文书
防沙治沙典型材料
2014/05/07 职场文书
关于国庆节的演讲稿
2014/09/05 职场文书
党员干部形式主义个人整改措施
2014/09/17 职场文书
高三英语复习计划
2015/01/19 职场文书
房产电话营销开场白
2015/05/29 职场文书
2015年教师个人业务工作总结
2015/10/23 职场文书
经典人生语录分享:不畏将来,不念过去,笑对当下
2019/12/12 职场文书
js实现上传图片到服务器
2021/04/11 Javascript
Ajax 的初步实现(使用vscode+node.js+express框架)
2021/06/18 Javascript
Python可视化动图组件ipyvizzu绘制惊艳的可视化动图
2022/04/21 Python
win10蓝屏0xc0000001安全模式进不了怎么办?win10出现0xc0000001的解决方法
2022/08/05 数码科技