关于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,超强推荐expand.js
Dec 23 Javascript
关于js datetime的那点事
Nov 15 Javascript
Javascript中的String对象详谈
Mar 03 Javascript
DOM节点删除函数removeChild()用法实例
Jan 12 Javascript
javascript事件冒泡实例分析
May 13 Javascript
js实现仿京东2级菜单效果(带延时功能)
Aug 27 Javascript
微信小程序登录态控制深入分析
Apr 12 Javascript
javascript中mouseenter与mouseover的异同
Jun 06 Javascript
JavaScript实现快速排序的方法分析
Jan 10 Javascript
mpvue微信小程序多列选择器用法之省份城市选择的实现
Mar 07 Javascript
HTML元素拖拽功能实现的完整实例
Dec 04 Javascript
JavaScript事件的委托(代理)的用法示例详解
Feb 18 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用正则表达式匹配中文实例详解
2013/11/06 PHP
php5.3提示Function ereg() is deprecated Error问题解决方法
2014/11/12 PHP
php将远程图片保存到本地服务器的实现代码
2015/08/03 PHP
php简单备份与还原MySql的方法
2016/05/09 PHP
网站导致浏览器崩溃的原因总结(多款浏览器) 推荐
2010/04/15 Javascript
点击进行复制的JS代码实例
2013/08/23 Javascript
js 剪切板应用clipboardData详细解析
2013/12/17 Javascript
JS获取select的value和text值的简单实例
2014/02/26 Javascript
jquery uploadify 在FF下无效的解决办法
2014/09/26 Javascript
Jquery插件仿百度搜索关键字自动匹配功能
2016/05/11 Javascript
移动端 一个简单易懂的弹出框
2016/07/06 Javascript
jquery中绑定事件的异同
2017/02/28 Javascript
jquery DataTable实现前后台动态分页
2017/06/17 jQuery
使用vue-route 的 beforeEach 实现导航守卫(路由跳转前验证登录)功能
2018/03/22 Javascript
vue项目中实现缓存的最佳方案详解
2019/07/11 Javascript
js getBoundingClientRect使用方法详解
2019/07/17 Javascript
vue 验证码界面实现点击后标灰并设置div按钮不可点击状态
2019/10/28 Javascript
Vue 路由间跳转和新开窗口的方式(query、params)
2019/12/25 Javascript
Python中的pygal安装和绘制直方图代码分享
2017/12/08 Python
Python如何优雅获取本机IP方法
2019/11/10 Python
用Python画小女孩放风筝的示例
2019/11/23 Python
Pycharm激活码激活两种快速方式(附最新激活码和插件)
2020/03/12 Python
Python基于opencv的简单图像轮廓形状识别(全网最简单最少代码)
2021/01/28 Python
浅谈HTML5 &amp; CSS3的新交互特性
2016/07/19 HTML / CSS
澳大利亚床上用品、浴巾和家居用品购物网站:Bambury
2020/04/16 全球购物
医院学雷锋活动策划方案
2014/02/15 职场文书
党的群众路线教育实践活动宣传方案
2014/02/23 职场文书
教学改革实施方案
2014/03/31 职场文书
新学期教师寄语
2014/04/02 职场文书
供货协议书范本
2014/04/22 职场文书
2014年局领导班子自身建设情况汇报
2014/11/21 职场文书
普希金诗歌赏析(6首)
2019/08/22 职场文书
详解Java线程池是如何重复利用空闲线程的
2021/06/26 Java/Android
java基础——多线程
2021/07/03 Java/Android
python lambda 表达式形式分析
2022/04/03 Python
sql server偶发出现死锁的解决方法
2022/04/10 SQL Server