关于React动态加载路由处理的相关问题


Posted in Javascript onJanuary 07, 2019

前言

相信很多人都遇到过想在React项目中动态加载路由这种问题,接下来我们逐步实现。

引入必要的依赖

import React from 'react'
import { Router, Route, IndexRoute, hashHistory } from 'react-router'

接下来创建一个component函数

目的就是为了变为router的component实现异步加载。

// 异步按需加载component
function asyncComponent(getComponent) {
  return class AsyncComponent extends React.Component {
   static Component = null;
   state = { Component: AsyncComponent.Component };
 
   componentDidMount() {
    if (!this.state.Component) {
     getComponent().then(({default: Component}) => {
      AsyncComponent.Component = Component
      this.setState({ Component })
     })
    }
   }
   //组件将被卸载 
  componentWillUnmount(){ 
    //重写组件的setState方法,直接返回空
    this.setState = (state,callback)=>{
      return;
    }; 
  }
   render() {
    const { Component } = this.state
    if (Component) {
     return <Component {...this.props} />
    }
    return null
   }
  }
 }

在此说明componentWillUnmount钩子是为了解决Can only update a mounted or mounting component的这个问题,原因是当离开页面以后,组件已经被卸载,执行setState时无法找到渲染组件。

接下来实现本地文件路径的传入

function load(component) {
  return import(`./routes/${component}`)
 }

将已知地址路径传递到一个函数并把这个函数作为参数传递到 asyncComponent中这样asyncComponent就能接收到这个路由的地址了,然后我们要做的就是将这个asyncComponent函数带入到router中。

<Router history={hashHistory}>
    <Route name="home" breadcrumbName="首页" path="/" component={MainLayout}>
      <IndexRoute name="undefined" breadcrumbName="未定义" component={() => <div>未定义</div>}/>
      <Route name="Development" breadcrumbName="施工中" path="Development" component={DevelopmentPage}/>
      <Route breadcrumbName="个人助理" path="CustomerWorkTodo" component={({children}) => <div className="box">{children}</div>}>
        <Route name="Agency" breadcrumbName="待办事项" path="Agency" component={asyncComponent(() => load('GlobalNotification/CustomerWorkAssistantTodo/CustomerAgencyMatter'))}/>
        <Route name="Already" breadcrumbName="已办事项" path="Already" component={asyncComponent(() => load('GlobalNotification/CustomerWorkAssistantTodo/CustomerAlreadyMatter'))}/>
        <Route name="SystemMessage" breadcrumbName="系统消息" path="SystemMessage/:data" component={asyncComponent(() => load('GlobalNotification/SystemMessage/SystemMessage'))}/>
        <Route name="SystemMessagePer" breadcrumbName="系统消息详情" path="SystemMessagePer/:data" component={asyncComponent(() => load('GlobalNotification/SystemMessage/SystemMessagePer'))}/>
      </Route>
    </Router>
 </Router>

从代码中可以看出已经实现了router 的component 的引入,这样自然就可以通过一个循环来实现动态的加载啦!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript 控制弹出窗口
Apr 10 Javascript
JS定时关闭窗口的实例
May 22 Javascript
jquery实现简单的拖拽效果实例兼容所有主流浏览器
Jun 21 Javascript
JavaScript基础篇(6)之函数表达式闭包
Dec 11 Javascript
jquery动态添加文本并获取值的方法
Oct 12 Javascript
关于不同页面之间实现参数传递的几种方式讨论
Feb 13 Javascript
Vue.js 2.0 移动端拍照压缩图片预览及上传实例
Apr 27 Javascript
详谈构造函数加括号与不加括号的区别
Oct 26 Javascript
vue 项目中使用Loading组件的示例代码
Aug 31 Javascript
layui表格数据重载
Jul 27 Javascript
在Vue项目中用fullcalendar制作日程表的示例代码
Aug 04 Javascript
JavaScript Array.flat()函数用法解析
Sep 02 Javascript
vue+iview 兼容IE11浏览器的实现方法
Jan 07 #Javascript
详解Vue iview IE浏览器不兼容报错(Iview Bable polyfill)
Jan 07 #Javascript
利用React Router4实现的服务端直出渲染(SSR)
Jan 07 #Javascript
Node.js EventEmmitter事件监听器用法实例分析
Jan 07 #Javascript
小程序二次贝塞尔曲线实现购物车商品曲线飞入效果
Jan 07 #Javascript
jQuery实现的别踩白块小游戏完整示例
Jan 07 #jQuery
jQuery判断自定义属性data-val用法示例
Jan 07 #jQuery
You might like
Javascript连接多个数组不用concat来解决
2014/03/24 Javascript
jQuery中end()方法用法实例
2015/01/08 Javascript
JavaScript通过prototype给对象定义属性用法实例
2015/03/23 Javascript
分享9点个人认为比较重要的javascript 编程技巧
2015/04/27 Javascript
Javascript中实现String.startsWith和endsWith方法
2015/06/10 Javascript
JavaScript检测并限制复选框选中个数的方法
2015/08/12 Javascript
jquery实现弹出层登录和全屏层注册特效
2015/08/28 Javascript
JavaScript控制浏览器全屏及各种浏览器全屏模式的方法、属性和事件
2015/12/20 Javascript
JavaScript禁止复制与粘贴的实现代码
2016/05/16 Javascript
vue监听滚动事件实现滚动监听
2017/04/11 Javascript
详解如何在 vue 项目里正确地引用 jquery 和 jquery-ui的插件
2017/06/01 jQuery
Vue源码解读之Component组件注册的实现
2018/08/24 Javascript
跟老齐学Python之复习if语句
2014/10/02 Python
利用python批量修改word文件名的方法示例
2017/10/17 Python
单利模式及python实现方式详解
2018/03/20 Python
python pyheatmap包绘制热力图
2018/11/09 Python
解决Djang2.0.1中的reverse导入失败的问题
2019/08/16 Python
Django之编辑时根据条件跳转回原页面的方法
2019/08/21 Python
Python一行代码解决矩阵旋转的问题
2019/11/30 Python
python 导入数据及作图的实现
2019/12/03 Python
Python图像处理库PIL中图像格式转换的实现
2020/02/26 Python
Python排序函数的使用方法详解
2020/12/11 Python
HTML5 canvas绘制的玫瑰花效果
2014/05/29 HTML / CSS
html5的自定义data-*属性与jquery的data()方法的使用
2014/07/02 HTML / CSS
亿企通软件测试面试题
2012/04/10 面试题
毕业生多媒体设计求职信
2013/10/12 职场文书
幼儿园托班开学寄语
2014/01/18 职场文书
回门宴父母答谢词
2014/01/26 职场文书
经典洗发水广告词
2014/03/13 职场文书
全国税务系统先进集体事迹材料
2014/05/19 职场文书
求职教师自荐书
2014/06/19 职场文书
学校端午节活动方案
2014/08/23 职场文书
圆明园纪录片观后感
2015/06/03 职场文书
2016幼儿教师自荐信范文
2016/01/28 职场文书
导游词之秦皇岛燕塞湖
2020/01/03 职场文书
SQLServer权限之只开启创建表权限
2022/04/12 SQL Server