关于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 相关文章推荐
jQuery插件开发基础简单介绍
Jan 07 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(五)可移动地图的实现
Jan 23 Javascript
浏览器打开层自动缓慢展开收缩实例代码
Jul 04 Javascript
javascript中数组的定义及使用实例
Jan 21 Javascript
JavaScript生成的动态下雨背景效果实现方法
Feb 25 Javascript
基于BootStrap Metronic开发框架经验小结【六】对话框及提示框的处理和优化
May 12 Javascript
原生JS实现首页进度加载动画
Sep 14 Javascript
BootstrapValidator不触发校验的实现代码
Sep 28 Javascript
详解vue事件对象、冒泡、阻止默认行为
Mar 20 Javascript
jQuery Masonry瀑布流布局神器使用详解
May 25 jQuery
jquery中done和then的区别(详解)
Dec 19 jQuery
JavaScript类的继承操作实例总结
Dec 20 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
用Apache反向代理设置对外的WWW和文件服务器
2006/10/09 PHP
php基础知识:类与对象(4) 范围解析操作符(::)
2006/12/13 PHP
PHP下一个非常全面获取图象信息的函数
2008/11/20 PHP
通过缓存数据库结果提高PHP性能的原理介绍
2012/09/05 PHP
jQuery+php实现ajax文件即时上传的详解
2013/06/17 PHP
php制作文本式留言板
2015/03/18 PHP
PHP使用file_get_content设置头信息的方法
2016/02/14 PHP
php实现微信公众号企业转账功能
2018/10/01 PHP
JavaScript事件列表解说
2006/12/22 Javascript
JS获取浏览器语言动态加载JS文件示例代码
2014/10/31 Javascript
javascript判断移动端访问设备并解析对应CSS的方法
2015/02/05 Javascript
javascript动画算法实例分析
2015/07/31 Javascript
javascript作用域链(Scope Chain)用法实例解析
2015/11/30 Javascript
jQuery基础的工厂函数以及定时器的经典实例分析
2016/05/20 Javascript
JS解决position:sticky的兼容性问题的方法
2017/10/17 Javascript
Vue2.0结合webuploader实现文件分片上传功能
2018/03/09 Javascript
浅谈ElementUI中switch回调函数change的参数问题
2018/08/24 Javascript
使用Vue父子组件通信实现todolist的功能示例代码
2019/04/11 Javascript
JavaScript Array对象使用方法解析
2019/09/24 Javascript
JS面向对象之单选框实现
2020/01/17 Javascript
python八大排序算法速度实例对比
2017/12/06 Python
pyqt5 QlistView列表显示的实现示例
2020/03/24 Python
Keras:Unet网络实现多类语义分割方式
2020/06/11 Python
经贸日语毕业生自荐信
2013/11/03 职场文书
硕士研究生自我鉴定
2013/11/08 职场文书
小学教师岗位职责
2013/11/25 职场文书
找工作最新求职信
2013/12/22 职场文书
元旦晚会感言
2014/03/12 职场文书
分居协议书范本
2014/11/03 职场文书
三孔导游词
2015/02/05 职场文书
2015年财务人员工作总结
2015/04/10 职场文书
2015年乡镇卫生院妇幼保健工作总结
2015/05/19 职场文书
golang判断key是否在map中的代码
2021/04/24 Golang
动画《新网球王子 U-17 WORLD CUP》希腊队PV公开
2022/04/02 日漫
Python+OpenCV实现图片中的圆形检测
2022/04/07 Python
Linux在两个服务器直接传文件的操作方法
2022/08/05 Servers