关于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模板实现方法
Apr 27 Javascript
javascript中xml操作实现代码
Nov 21 Javascript
JS获取URL中参数值(QueryString)的4种方法分享
Apr 12 Javascript
jQuery实现手机版页面翻页效果的简单实例
Oct 05 Javascript
Angular.js中angular-ui-router的简单实践
Jul 18 Javascript
微信JSSDK调用微信扫一扫功能的方法
Jul 25 Javascript
vue 计时器组件的实现代码
Sep 14 Javascript
vue-router 手势滑动触发返回功能
Sep 30 Javascript
JavaScript常见事件对象与操作实例总结
Jan 05 Javascript
微信小程序实现类似微信点击语音播放效果
Mar 30 Javascript
Vue常用传值方式、父传子、子传父及非父子实例分析
Feb 24 Javascript
javascript局部自定义鼠标右键菜单
Dec 08 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
文章推荐系统(三)
2006/10/09 PHP
javascript日期转换 时间戳转日期格式
2011/11/05 Javascript
ejs v9 javascript模板系统
2012/03/21 Javascript
js实现局部页面打印预览原理及示例代码
2014/07/03 Javascript
鼠标悬浮显示二级菜单效果的jquery实现
2014/10/29 Javascript
JS继承用法实例分析
2015/02/05 Javascript
js跨域请求的5中解决方式
2015/07/02 Javascript
jQuery幻灯片特效代码分享--鼠标滑过按钮时切换(2)
2020/11/18 Javascript
程序员必知35个jQuery 代码片段
2015/11/05 Javascript
jQuery事件绑定on()与弹窗实现代码
2016/04/28 Javascript
聊一聊JavaScript作用域和作用域链
2016/05/03 Javascript
AngularJS基础 ng-keyup 指令简单示例
2016/08/02 Javascript
JavaScript 冒泡排序和选择排序的实现代码
2016/09/03 Javascript
js实现一个可以兼容PC端和移动端的div拖动效果实例
2016/12/09 Javascript
self.attachevent is not a function的解决方法
2017/04/04 Javascript
[03:02]2014DOTA2西雅图邀请赛 让队员自己告诉你DK NAVI备战情况
2014/07/08 DOTA
[01:14:35]DOTA2上海特级锦标赛B组资格赛#1 Alliance VS Fnatic第一局
2016/02/26 DOTA
python复制文件的方法实例详解
2015/05/22 Python
Python实现多线程抓取妹子图
2015/08/08 Python
Python的时间模块datetime详解
2017/04/17 Python
Python全局变量与局部变量区别及用法分析
2018/09/03 Python
Python正则匹配判断手机号是否合法的方法
2020/12/09 Python
python pytest进阶之fixture详解
2019/06/27 Python
在线购买世界上最好的酒:BoozeBud
2018/06/07 全球购物
维氏瑞士军刀英国网站:Victorinox英国
2019/07/04 全球购物
婚鞋、新娘鞋、礼服鞋、童鞋:Nina Shoes
2019/09/04 全球购物
环境工程大学生自荐信
2013/10/21 职场文书
企事业单位求职者的自我评价
2013/12/28 职场文书
素质拓展感言
2014/01/29 职场文书
数控技校生自我鉴定
2014/04/19 职场文书
诚实守信道德模范事迹材料
2014/08/15 职场文书
群众路线查摆问题整改措施
2014/10/10 职场文书
2015秋季开学典礼致辞
2015/07/16 职场文书
《这片土地是神圣的》教学反思
2016/02/16 职场文书
postgres之jsonb属性的使用操作
2021/06/23 PostgreSQL
python中取整数的几种方法
2021/11/07 Python