关于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获取元素在浏览器中的绝对位置
Jul 24 Javascript
document.forms用法示例介绍
Jun 26 Javascript
js操作IE浏览器弹出浏览文件夹可以返回目录路径
Jul 14 Javascript
3个可以改善用户体验的AngularJS指令介绍
Jun 18 Javascript
jQuery中extend函数详解
Jul 13 Javascript
Angular发布1.5正式版,专注于向Angular 2的过渡
Feb 18 Javascript
怎么限制input的text里输入的值只能是数字(正则、js)
May 16 Javascript
基于vue展开收起动画的示例代码
Jul 05 Javascript
layDate日期控件使用方法详解
Nov 15 Javascript
创建echart多个联动的示例代码
Nov 23 Javascript
vue监听dom大小改变案例
Jul 29 Javascript
如何基于viewport vm适配移动端页面
Nov 13 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
解决PhpMyAdmin中导入2M以上大文件限制的方法分享
2014/06/06 PHP
php操作XML、读取数据和写入数据的实现代码
2014/08/15 PHP
Yii查询生成器(Query Builder)用法实例教程
2014/09/04 PHP
ThinkPHP做文字水印时提示call an undefined function exif_imagetype()解决方法
2014/10/30 PHP
微信公众平台开发教程①获取用户Openid及个人信息图文详解
2019/04/10 PHP
多次注册事件会导致一个事件被触发多次的解决方法
2013/08/12 Javascript
jQuery toggleClass应用实例(附效果图)
2014/04/06 Javascript
JavaScript和CSS交互的方法汇总
2014/12/02 Javascript
基于JavaScript将表单序列化类型的数据转化成对象的处理(允许对象中包含对象)
2015/12/28 Javascript
JavaScript 经典实例日常收集整理(常用经典)
2016/03/30 Javascript
jQuery实现的导航动画效果(附demo源码)
2016/04/01 Javascript
关于JS中的apply,call,bind的深入解析
2016/04/05 Javascript
每日十条JavaScript经验技巧(二)
2016/06/23 Javascript
详解浏览器渲染页面过程
2017/02/09 Javascript
vuejs通过filterBy、orderBy实现搜索筛选、降序排序数据
2020/10/26 Javascript
js实现显示手机号码效果
2017/03/09 Javascript
JavaScript设计模式之代理模式详解
2017/06/09 Javascript
JS实现百度搜索接口及链接功能实例代码
2018/02/02 Javascript
[40:01]OG vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
Python脚本判断 Linux 是否运行在虚拟机上
2015/04/25 Python
Python中的id()函数指的什么
2017/10/17 Python
用matplotlib画等高线图详解
2017/12/14 Python
Python实现App自动签到领取积分功能
2018/09/29 Python
在Python中COM口的调用方法
2019/07/03 Python
python使用opencv对图像mask处理的方法
2019/07/05 Python
Python生态圈图像格式转换问题(推荐)
2019/12/02 Python
scrapy中如何设置应用cookies的方法(3种)
2020/09/22 Python
python利用paramiko实现交换机巡检的示例
2020/09/22 Python
html5/css3响应式页面开发总结
2018/10/16 HTML / CSS
html5 浏览器支持 如何让所有的浏览器都支持HTML5标签样式
2012/12/07 HTML / CSS
Marks & Spencer爱尔兰:英国马莎百货
2016/04/20 全球购物
AJAX应用和传统Web应用有什么不同
2013/08/24 面试题
2014年两会学习心得体会
2014/03/17 职场文书
党支部公开承诺践诺书
2014/03/28 职场文书
幼儿园教学反思范文
2016/03/02 职场文书
Vue中使用import进行路由懒加载的原理分析
2022/04/01 Vue.js