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 相关文章推荐
摘自启点的main.js
Apr 20 Javascript
在chrome浏览器中,防止input[text]和textarea在聚焦时出现黄色边框的解决方法
May 24 Javascript
img onload事件绑定各浏览器均可执行
Dec 19 Javascript
js语法学习之判断一个对象是否为数组
May 13 Javascript
Bootstrap实现导航栏的2种方式
Nov 28 Javascript
codeMirror插件使用讲解
Jan 16 Javascript
js实现导航栏中英文切换效果
Jan 16 Javascript
jQuery实现多张图片上传预览(不经过后端处理)
Apr 29 jQuery
使用vue-router beforEach实现判断用户登录跳转路由筛选功能
Jun 25 Javascript
深入浅析var,let,const的异同点
Aug 07 Javascript
Node.js 实现远程桌面监控的方法步骤
Jul 02 Javascript
JavaScript中的LHS和RHS分析详情
Apr 06 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
分页显示Oracle数据库记录的类之一
2006/10/09 PHP
phpmyadmin MySQL 加密配置方法
2009/07/05 PHP
ThinkPHP php 框架学习笔记
2009/10/30 PHP
php中神奇的fastcgi_finish_request
2011/05/02 PHP
php截取中文字符串不乱码的方法
2013/12/25 PHP
ThinkPHP的模版中调用session数据的方法
2014/07/01 PHP
thinkphp自带验证码全面解析
2016/09/18 PHP
php使用curl实现简单模拟提交表单功能
2017/05/15 PHP
File文件控件,选中文件(图片,flash,视频)即立即预览显示
2009/04/09 Javascript
ExtJS 学习专题(一) 如何应用ExtJS(附实例)
2010/03/11 Javascript
jquery方法+js一般方法+js面向对象方法实现拖拽效果
2012/08/30 Javascript
JQuery获取表格数据示例代码
2014/05/26 Javascript
jQuery的选择器中的通配符[id^='code']或[name^='code']及jquery选择器总结
2015/12/24 Javascript
使用jquery提交form表单并自定义action的方法
2016/05/25 Javascript
BootStrap无限级分类(无限极分类封装版)
2016/08/26 Javascript
jQuery中的100个技巧汇总
2016/12/15 Javascript
JS实现批量上传文件并显示进度功能
2017/06/27 Javascript
使用Bootrap和Vue实现仿百度搜索功能
2017/10/26 Javascript
基于angular6.0实现的一个组件懒加载功能示例
2018/04/12 Javascript
原生JS实现自定义下拉单选选择框功能
2018/10/12 Javascript
Vue中通过vue-router实现命名视图的问题
2020/04/23 Javascript
javascript局部自定义鼠标右键菜单
2020/12/08 Javascript
Python使用struct处理二进制的实例详解
2017/09/11 Python
目前最全的python的就业方向
2018/06/05 Python
python 处理数字,把大于上限的数字置零实现方法
2019/01/28 Python
如何关掉pycharm中的python console(图解)
2019/10/31 Python
打造经典复古风格的品牌:Alice + Olivia(爱丽丝+奥利维亚)
2016/09/07 全球购物
触发器(trigger)的功能都有哪些?写出一个触发器的例子
2012/09/17 面试题
生产主管岗位职责
2013/11/10 职场文书
计算机网络工程专业职业生涯规划书
2014/03/10 职场文书
学习之星事迹材料
2014/05/17 职场文书
护士节策划方案
2014/05/19 职场文书
创先争优公开承诺书
2014/08/30 职场文书
论文评审意见
2015/06/05 职场文书
2016年社区服务活动总结
2016/04/06 职场文书
Python帮你解决手机qq微信内存占用太多问题
2022/02/15 Python