关于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代码
Aug 13 Javascript
利用函数的惰性载入提高javascript代码执行效率
May 05 Javascript
Javascript基础教程之数据类型 (字符串 String)
Jan 18 Javascript
如何屏蔽防止别的网站嵌入框架代码
Aug 24 Javascript
jQuery实现带玻璃流光质感的手风琴特效
Nov 20 Javascript
AngularJS 过滤器的简单实例
Jul 27 Javascript
Javascript动画效果(4)
Oct 11 Javascript
AngularJS之页面跳转Route实例代码
Mar 10 Javascript
JavaScript之生成器_动力节点Java学院整理
Jun 30 Javascript
React进阶学习之组件的解耦之道
Aug 07 Javascript
Vue请求JSON Server服务器数据的实现方法
Nov 02 Javascript
Vue 数组和对象更新,但是页面没有刷新的解决方式
Nov 09 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中批量修改文件后缀名的函数代码
2011/10/23 PHP
ThinkPHP中使用Ueditor富文本编辑器
2015/09/02 PHP
php 计算两个时间相差的天数、小时数、分钟数、秒数详解及实例代码
2016/11/09 PHP
PHP的JSON封装、转变及输出操作示例
2019/09/27 PHP
微信小程序发送订阅消息的方法(php 为例)
2019/10/30 PHP
如何让动态插入的javascript脚本代码跑起来。
2007/01/09 Javascript
使用jquery给input和textarea设定ie中的focus
2008/05/29 Javascript
jQuery ul标签下拉菜单演示代码
2010/12/11 Javascript
iphone safari不支持position fixed的解决方法
2012/05/04 Javascript
js实现上传图片之上传前预览图片
2013/03/25 Javascript
angularjs学习笔记之双向数据绑定
2015/09/26 Javascript
关于JavaScript中事件绑定的方法总结
2016/10/26 Javascript
AngularJs中Bootstrap3 datetimepicker使用实例
2016/12/13 Javascript
angularjs中回车键触发某一事件的方法
2017/04/24 Javascript
Vue 中mixin 的用法详解
2018/04/23 Javascript
vuex(vue状态管理)的特殊应用案例分享
2020/03/03 Javascript
Vue基于iview实现登录密码的显示与隐藏功能
2020/03/06 Javascript
[02:25]DOTA2英雄基础教程 熊战士
2014/01/03 DOTA
python单元测试unittest实例详解
2015/05/11 Python
python中正则的使用指南
2016/12/04 Python
python与C互相调用的方法详解
2017/07/14 Python
Python Requests库基本用法示例
2018/08/20 Python
Python用5行代码写一个自定义简单二维码
2018/10/21 Python
Python re正则表达式元字符分组()用法分享
2020/02/10 Python
通过实例简单了解python yield使用方法
2020/08/06 Python
基于Python实现下载网易音乐代码实例
2020/08/10 Python
如何基于Python爬虫爬取美团酒店信息
2020/11/03 Python
CSS3中border-radius属性设定圆角的使用技巧
2016/05/10 HTML / CSS
CSS3旋转——彩色扇子兼容firefox浏览器
2013/06/04 HTML / CSS
canvas实现按住鼠标移动绘制出轨迹的示例代码
2018/02/05 HTML / CSS
无谷物狗粮:Pooch & Mutt
2018/05/23 全球购物
安全施工标语
2014/06/07 职场文书
优秀护士事迹材料
2014/12/25 职场文书
自主招生自荐信怎么写
2015/03/24 职场文书
大学生实习推荐信
2015/03/27 职场文书
小人国观后感
2015/06/11 职场文书