关于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 相关文章推荐
将字符串转换成gb2312或者utf-8编码的参数(js版)
Apr 10 Javascript
分享一个自己写的简单的javascript分页组件
Feb 15 Javascript
jQuery判断数组是否包含了指定的元素
Mar 10 Javascript
Javascript中的方法和匿名方法实例详解
Jun 13 Javascript
浅谈javascript构造函数与实例化对象
Jun 22 Javascript
jQuery使用$.ajax进行即时验证的方法
Dec 08 Javascript
jQuery下拉框的简单应用
Jun 24 Javascript
javascript 判断当前浏览器版本并判断ie版本
Feb 17 Javascript
AngularJS 限定$scope的范围实例详解
Jun 23 Javascript
在vue中使用jsx语法的使用方法
Sep 30 Javascript
JS图片预加载三种实现方法解析
May 08 Javascript
JavaScript接口实现方法实例分析
May 16 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
DOTA2 1月28日更新:监管系统降临刀塔世界
2021/01/28 DOTA
PHP 实例化类的一点摘记
2008/03/23 PHP
php 高效率写法 推荐
2010/02/21 PHP
php中explode的负数limit用法分析
2015/02/27 PHP
PHP整合PayPal支付
2015/06/11 PHP
PHP使用数组依次替换字符串中匹配项
2016/01/08 PHP
PHP基于cookie实现统计在线人数功能示例
2019/01/16 PHP
Yii2.0建立公共方法简单示例
2019/01/29 PHP
PHP正则表达式处理函数(PCRE 函数)实例小结
2019/05/09 PHP
打开超链需要“确认”对话框的方法
2007/03/08 Javascript
javascript实现数字+字母验证码的简单实例
2014/02/10 Javascript
jQuery实现div浮动层跟随页面滚动效果
2014/02/11 Javascript
JavaScript支持的最大递归调用次数分析
2014/06/24 Javascript
Extjs实现下拉菜单效果
2016/04/01 Javascript
JS面试题---关于算法台阶的问题
2016/07/26 Javascript
微信小程序 特效菜单抽屉效果实例代码
2017/01/11 Javascript
JavaScript和jQuery制作光棒效果
2017/02/24 Javascript
vue2.0结合DataTable插件实现表格动态刷新的方法详解
2017/03/17 Javascript
javascript中json对象json数组json字符串互转及取值方法
2017/04/19 Javascript
jQuery返回定位插件详解
2017/05/15 jQuery
vue-cli项目中怎么使用mock数据
2017/09/27 Javascript
解决VUE中document.body.scrollTop为0的问题
2018/09/15 Javascript
详解webpack之图片引入-增强的file-loader:url-loader
2018/10/08 Javascript
使用ECharts实现状态区间图
2018/10/25 Javascript
JQuery Ajax如何实现注册检测用户名
2020/09/25 jQuery
Python中使用md5sum检查目录中相同文件代码分享
2015/02/02 Python
人工智能最火编程语言 Python大战Java!
2017/11/13 Python
Python如何对XML 解析
2020/06/28 Python
python interpolate插值实例
2020/07/06 Python
Scrapy项目实战之爬取某社区用户详情
2020/09/17 Python
中国跨境在线时尚零售商:Bellelily
2018/04/06 全球购物
英国设计师泳装、沙滩装和比基尼在线精品店:Beach Cafe
2019/08/28 全球购物
门诊手术室工作制度
2014/01/30 职场文书
篮球比赛口号
2014/06/10 职场文书
黄石寨导游词
2015/02/05 职场文书
2015入党自传格式范文
2015/06/26 职场文书