关于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 精粹笔记
May 09 Javascript
js传参数受特殊字符影响错误的解决方法
Oct 21 Javascript
JS判断字符串长度的5个方法(区分中文和英文)
Mar 18 Javascript
jQuery基础知识小结
Dec 22 Javascript
Angularjs使用指令做表单校验的方法
Mar 31 Javascript
js实现点击切换checkbox背景图片的简单实例
May 08 Javascript
浅谈angularJS的$watch失效问题的解决方案
Aug 11 Javascript
基于jQuery的$.getScript方法去加载javaScript文档解析
Nov 08 jQuery
详解javascript appendChild()的完整功能
Aug 18 Javascript
微信小程序城市选择及搜索功能的方法
Mar 22 Javascript
jquery中为什么能用$操作
Jun 18 jQuery
JS实现电脑虚拟键盘的操作
Jun 24 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
PHP生成不重复随机数的方法汇总
2014/11/19 PHP
php数组生成html下拉列表的方法
2015/07/20 PHP
浅谈php常用的7大框架的优缺点
2020/07/20 PHP
jQuery .tmpl(), .template()学习资料小结
2011/07/18 Javascript
node.js中的fs.readdir方法使用说明
2014/12/17 Javascript
Javascript实现div层渐隐效果的方法
2015/05/30 Javascript
js实现网站最上边可关闭的浮动广告条代码
2015/09/04 Javascript
基于jquery实现图片相关操作(重绘、获取尺寸、调整大小、缩放)
2015/12/25 Javascript
DataTables+BootStrap组合使用Ajax来获取数据并且动态加载dom的方法(排序,过滤,分页等)
2016/11/09 Javascript
JS DOMReady事件的六种实现方法总结
2016/11/23 Javascript
angularJs中datatable实现代码
2017/06/03 Javascript
微信小程序三级联动地址选择器的实例代码
2017/07/12 Javascript
vue动态路由实现多级嵌套面包屑的思路与方法
2017/08/16 Javascript
vue监听scroll的坑的解决方法
2017/09/07 Javascript
nodejs操作mongodb的增删改查功能实例
2017/11/09 NodeJs
vue-infinite-loading2.0 中文文档详解
2018/04/08 Javascript
在Vue-cli里应用Vuex的state和mutations方法
2018/09/16 Javascript
CSS3 动画卡顿性能优化的完美解决方案
2018/09/20 Javascript
ES6中Set和Map数据结构,Map与其它数据结构互相转换操作实例详解
2019/02/28 Javascript
vuex的使用步骤
2021/01/06 Vue.js
python中查看变量内存地址的方法
2015/05/05 Python
Python数据抓取爬虫代理防封IP方法
2018/12/23 Python
Python 2/3下处理cjk编码的zip文件的方法
2019/04/26 Python
Python3 执行Linux Bash命令的方法
2019/07/12 Python
python openvc 裁剪、剪切图片 提取图片的行和列
2019/09/19 Python
Python实现从N个数中找到最大的K个数
2020/04/02 Python
使用darknet框架的imagenet数据分类预训练操作
2020/07/07 Python
基本款天堂:Everlane
2017/05/13 全球购物
小学生期末自我鉴定
2014/01/19 职场文书
致百米运动员广播稿
2014/01/29 职场文书
七一党日活动总结
2014/07/08 职场文书
民族学专业职业生涯规划范文:积跬步以至千里
2014/09/11 职场文书
详解MySQL主从复制及读写分离
2021/05/07 MySQL
JVM上高性能数据格式库包Apache Arrow入门和架构详解(Gkatziouras)
2021/05/26 Servers
新手必备Python开发环境搭建教程
2021/05/28 Python
nginx.conf配置文件结构小结
2022/04/08 Servers