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 相关文章推荐
IE event.srcElement和FF event.target 功能比较
Mar 01 Javascript
jquery导航制件jquery鼠标经过变色效果示例
Dec 05 Javascript
javascript 表格内容排序 简单操作示例代码
Jan 03 Javascript
node.js中的fs.readdir方法使用说明
Dec 17 Javascript
vuejs在解析时出现闪烁的原因及防止闪烁的方法
Sep 19 Javascript
使用JavaScript触发过渡效果的方法
Jan 19 Javascript
js输入框使用正则表达式校验输入内容的实例
Feb 12 Javascript
浅谈在vue中用webpack打包之后运行文件的问题以及相关配置方法
Feb 21 Javascript
微信小程序中上传图片并进行压缩的实现代码
Aug 28 Javascript
Openlayers实现地图的基本操作
Sep 28 Javascript
CocosCreator入门教程之网络通信
Apr 16 Javascript
JavaScript offset实现鼠标坐标获取和窗口内模块拖动
May 30 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生成UTF8文件的方法
2010/05/15 PHP
php中读写文件与读写数据库的效率比较分享
2013/10/19 PHP
ThinkPHP查询语句与关联查询用法实例
2014/11/01 PHP
简单介绍win7下搭建apache+php+mysql开发环境
2015/08/06 PHP
jquery入门—数据删除与隔行变色以及图片预览
2013/01/07 Javascript
jQuery遍历页面所有CheckBox查看是否被选中的方法
2015/04/14 Javascript
JavaScript判断数组是否包含指定元素的方法
2015/07/01 Javascript
JavaScript实现的Tween算法及缓冲特效实例代码
2015/11/03 Javascript
JS弹出对话框实现方法(三种方式)
2015/12/18 Javascript
jQuery实现手机自定义弹出输入框
2016/06/13 Javascript
jQuery实现花式轮播之圣诞节礼物传送效果
2016/12/25 Javascript
详解webpack3如何正确引用并使用jQuery库
2017/08/26 jQuery
初探JavaScript 面向对象(推荐)
2017/09/03 Javascript
webpack打包并将文件加载到指定的位置方法
2018/02/22 Javascript
详谈vue+webpack解决css引用图片打包后找不到资源文件的问题
2018/03/06 Javascript
如何编写一个d.ts文件的步骤详解
2018/04/13 Javascript
vue webpack开发访问后台接口全局配置的方法
2018/09/18 Javascript
vue router的基本使用和配置教程
2018/11/05 Javascript
vue分页器组件编写方法详解
2019/06/28 Javascript
vuejs中父子组件之间通信方法实例详解
2020/01/17 Javascript
[02:02]DOTA2英雄基础教程 斯拉达
2013/12/11 DOTA
[02:03]完美世界DOTA2联赛10月30日赛事集锦
2020/10/31 DOTA
Python学习笔记之open()函数打开文件路径报错问题
2018/04/28 Python
Python高斯消除矩阵
2019/01/02 Python
tornado+celery的简单使用详解
2019/12/21 Python
IronPython连接MySQL的方法步骤
2019/12/27 Python
浅谈h5自定义audio(问题及解决)
2016/08/19 HTML / CSS
关于canvas.toDataURL 在iOS运行失败的问题解决
2020/09/16 HTML / CSS
波兰最大的儿童服装连锁店之一:5.10.15.
2018/02/11 全球购物
加拿大最大的体育用品、鞋类和服装零售商:Sport Chek
2018/11/29 全球购物
开业庆典主持词
2014/03/21 职场文书
班子四风对照检查材料
2014/08/21 职场文书
班子四风对照检查材料思想汇报
2014/09/29 职场文书
导游词之新疆-喀纳斯
2019/10/10 职场文书
2019年市场部个人述职报告(三篇)
2019/10/23 职场文书
Appium中scroll和drag_and_drop根据元素位置滑动
2022/02/15 Python