关于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 相关文章推荐
在b/s开发中经常用到的javaScript技术
Aug 23 Javascript
Javascript 中文字符串处理额外注意事项
Nov 15 Javascript
JavaScript判断DOM何时加载完毕的技巧
Nov 11 Javascript
不同Jquery版本引发的问题解决
Oct 14 Javascript
在JavaScript中重写jQuery对象的方法实例教程
Aug 25 Javascript
jQuery使用hide方法隐藏指定元素class样式用法实例
Mar 30 Javascript
JQuery查找DOM节点的方法
Jun 11 Javascript
jquery分页插件jquery.pagination.js使用方法解析
Apr 01 Javascript
javascript 分号总结及详细介绍
Sep 24 Javascript
JS实现判断图片是否加载完成的方法分析
Jul 31 Javascript
js DOM的事件常见操作实例详解
Dec 16 Javascript
vue 获取url里参数的两种方法小结
Nov 12 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
全国FM电台频率大全 - 31 新疆维吾尔族自治区
2020/03/11 无线电
防止本地用户用fsockopen DDOS攻击对策
2011/11/02 PHP
thinkPHP中多维数组的遍历方法
2016/01/09 PHP
php ucwords() 函数将字符串中每个单词的首字符转换为大写(实现代码)
2016/05/12 PHP
PHP排序算法之归并排序(Merging Sort)实例详解
2018/04/21 PHP
Yii框架连表查询操作示例
2019/09/06 PHP
juqery 学习之三 选择器 子元素与表单
2010/11/25 Javascript
浅谈JavaScript正则表达式分组匹配
2015/04/10 Javascript
JavaScript实现梯形乘法表的方法
2015/04/25 Javascript
JavaScript检查子字符串是否在字符串中的方法
2016/02/03 Javascript
使用JavaScript判断手机浏览器是横屏还是竖屏问题
2016/08/02 Javascript
JS输出空格的简单实现方法
2016/09/08 Javascript
jQuery绑定事件的四种方式介绍
2016/10/31 Javascript
Bootstrap整体框架之CSS12栅格系统
2016/12/15 Javascript
jQuery插件HighCharts绘制2D圆环图效果示例【附demo源码下载】
2017/03/09 Javascript
Vue实现双向数据绑定
2017/05/03 Javascript
让axios发送表单请求形式的键值对post数据的实例
2018/08/11 Javascript
vue.js+element-ui动态配置菜单的实例
2018/09/07 Javascript
vue iview多张图片大图预览、缩放翻转
2019/07/13 Javascript
python numpy 按行归一化的实例
2019/01/21 Python
python 将字符串完成特定的向右移动方法
2019/06/11 Python
详解10个可以快速用Python进行数据分析的小技巧
2019/06/24 Python
pytorch 实现tensor与numpy数组转换
2019/12/27 Python
python如何求圆的面积
2020/07/01 Python
python中执行smtplib失败的处理方法
2020/07/01 Python
HTML5实现分享到微信好友朋友圈QQ好友QQ空间微博二维码功能
2018/01/03 HTML / CSS
印度尼西亚最大的电商平台:Tokopedia(印尼版淘宝)
2017/12/02 全球购物
Footshop法国:购买运动鞋
2020/01/19 全球购物
巴西最大的巴士票务门户:Quero Passagem
2020/11/21 全球购物
保护环境倡议书500字
2014/05/19 职场文书
优秀电子工程系毕业生求职信
2014/05/24 职场文书
党员学习正风肃纪思想汇报
2014/09/12 职场文书
党的群众路线教育实践活动个人对照检查材料(校长)
2014/11/05 职场文书
Vue.js 带下拉选项的输入框(Textbox with Dropdown)组件
2021/04/17 Vue.js
Pytest中skip skipif跳过用例详解
2021/06/30 Python
CSS中使用grid布局实现一套模板多种布局
2022/07/15 HTML / CSS