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与CSS写在同一个文件里的书写方法
Jun 02 Javascript
js 调整select 位置的函数
Feb 21 Javascript
在网页里看flash的trace数据的js类
Jan 10 Javascript
flexigrid 参数说明
Nov 23 Javascript
jquery中的常用事件bind、hover、toggle等示例介绍
Jul 21 Javascript
JavaScript中this的9种应用场景及三种复合应用场景
Sep 12 Javascript
jQuery禁用键盘后退屏蔽F5刷新及禁用右键单击
Jan 22 Javascript
Jquery修改image的src属性,图片不加载问题的解决方法
May 17 Javascript
JavaScript判断数组是否存在key的简单实例
Aug 03 Javascript
JS中关于事件处理函数名后面是否带括号的问题
Nov 16 Javascript
vue基础之使用get、post、jsonp实现交互功能示例
Mar 12 Javascript
详解vue-router的导航钩子(导航守卫)
Nov 02 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
德生PL330的评价与改造
2021/03/02 无线电
php设计模式 Proxy (代理模式)
2011/06/26 PHP
php空间不支持socket但支持curl时recaptcha的用法
2011/11/07 PHP
PHP经典面试题集锦
2015/03/19 PHP
在WordPress中使用wp_count_posts函数来统计文章数量
2016/01/05 PHP
javascript动态向网页中添加表格实现代码
2014/02/19 Javascript
node.js实现多图片上传实例
2014/06/03 Javascript
angular中使用路由和$location切换视图
2015/01/23 Javascript
基于jQuery实现最基本的淡入淡出效果实例
2015/02/02 Javascript
js+HTML5实现视频截图的方法
2015/06/16 Javascript
javascript:void(0)是什么意思及href=#与href=javascriptvoid(0)的区别
2015/11/13 Javascript
JS中JSON对象和String之间的互转及处理技巧
2016/04/06 Javascript
jquery attr()设置和获取属性值实例教程
2016/09/25 Javascript
jquery中用jsonp实现搜索框功能
2016/10/18 Javascript
原生Javascript插件开发实践
2017/01/09 Javascript
聊聊JavaScript如何实现继承及特点
2017/04/07 Javascript
对象不支持indexOf属性或方法的解决方法(必看)
2017/05/28 Javascript
layui 点击重置按钮, select 并没有被重置的解决方法
2019/09/03 Javascript
vue-cli3单页构建大型项目方案
2020/04/07 Javascript
[48:32]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 LGD vs VG
2018/04/01 DOTA
[01:04:35]2018DOTA2亚洲邀请赛 4.3 突围赛 Secret vs VG 第一场
2018/04/04 DOTA
Python中条件选择和循环语句使用方法介绍
2013/03/13 Python
Python3使用正则表达式爬取内涵段子示例
2018/04/22 Python
python打包exe开机自动启动的实例(windows)
2019/06/28 Python
python 中Arduino串口传输数据到电脑并保存至excel表格
2019/10/14 Python
浅谈keras中Dropout在预测过程中是否仍要起作用
2020/07/09 Python
杭州-DOTNET笔试题集
2013/09/25 面试题
春节晚会主持词
2014/03/24 职场文书
团队拓展活动方案
2014/08/28 职场文书
学校党的群众路线教育实践活动整改措施
2014/10/25 职场文书
党员身份证明材料
2015/06/19 职场文书
运动会三级跳加油稿
2015/07/21 职场文书
探究Mysql模糊查询是否区分大小写
2021/06/11 MySQL
浅谈GO中的Channel以及死锁的造成
2022/03/18 Golang
Python装饰器详细介绍
2022/03/25 Python
最新动漫情报:2022年7月新番定档超过30部, OVERLORD骨王第四季也在其中噢
2022/05/04 日漫