关于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 相关文章推荐
使用JS进行目录上传(相当于批量上传)
Dec 05 Javascript
jquery mobile开发常见问题分析
Jan 21 Javascript
JavaScript的React Web库的理念剖析及基础上手指南
May 10 Javascript
浅谈js多维数组和hash数组定义和使用
Jul 27 Javascript
JavaScript 数组的深度复制解析
Nov 02 Javascript
ES6实现的遍历目录函数示例
Apr 07 Javascript
深入理解Angular中的依赖注入
Jun 26 Javascript
JS实现简单短信验证码界面
Aug 07 Javascript
解决vue-cli webpack打包后加载资源的路径问题
Sep 25 Javascript
swiper4实现移动端导航切换
Oct 16 Javascript
javascript实现图片轮换动作方法
Aug 07 Javascript
JavaScript数组 几个常用方法总结
Nov 11 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笔记之:php函数range() round()和list()的使用说明
2013/04/26 PHP
关于PHP自动判断字符集并转码的详解
2013/06/26 PHP
浅析PKI加密解密 OpenSSL
2013/07/01 PHP
php将url地址转化为完整的a标签链接代码(php为url地址添加a标签)
2014/01/17 PHP
php实现在服务器上创建目录的方法
2015/03/16 PHP
实例解析php的数据类型
2018/10/24 PHP
如何在centos8自定义目录安装php7.3
2019/11/28 PHP
雄兵连第三季海报曝光,艾妮熙德成主角,蔷薇新造型
2021/03/09 国漫
基于jquery的从一个页面跳转到另一个页面的指定位置的实现代码(带平滑移动的效果)
2011/05/24 Javascript
Javascript实现的常用算法(如冒泡、快速、鸽巢、奇偶等)
2014/04/29 Javascript
js实现从数组里随机获取元素
2015/01/12 Javascript
使用微信内置浏览器点击下拉框出现页面乱跳转现象(iphone),该怎么办
2016/01/04 Javascript
js获取iframe中的window对象的实现方法
2016/05/20 Javascript
jQuery实现的放大镜效果示例
2016/09/13 Javascript
canvas实现爱心和彩虹雨效果
2017/03/09 Javascript
基于React+Redux的SSR实现方法
2018/07/03 Javascript
浅谈JS和jQuery的区别
2019/03/27 jQuery
Jquery使用each函数实现遍历及数组处理
2020/07/14 jQuery
Python实现Windows上气泡提醒效果的方法
2015/06/03 Python
django框架自定义用户表操作示例
2018/08/07 Python
TensorFlow绘制loss/accuracy曲线的实例
2020/01/21 Python
python 实现在无序数组中找到中位数方法
2020/03/03 Python
django实现HttpResponse返回json数据为中文
2020/03/27 Python
Python 实现平台类游戏添加跳跃功能
2020/03/27 Python
python实现批量转换图片为黑白
2020/06/16 Python
Python开发.exe小工具的详细步骤
2021/01/27 Python
如何查看浏览器对html5的支持情况
2020/12/15 HTML / CSS
Java里面如何把一个Array数组转换成Collection, List
2013/07/26 面试题
工作人员思想汇报
2014/01/09 职场文书
迟到检讨书大全
2014/01/25 职场文书
《青海高原一株柳》教学反思
2014/04/25 职场文书
土建技术员岗位职责
2015/04/11 职场文书
公司员工辞职信范文
2015/05/12 职场文书
SQL 聚合、分组和排序
2021/11/11 MySQL
tree shaking对打包体积优化及作用
2022/07/07 Java/Android
maven 解包依赖项中的文件的解决方法
2022/07/15 Java/Android