关于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的Tooltip插件 qtip使用详细说明
Sep 08 Javascript
js操作textarea 常用方法总结
Dec 03 Javascript
js禁止页面刷新禁止用F5键刷新禁止右键的示例代码
Sep 23 Javascript
jquery ajaxSubmit 异步提交的简单实现
Feb 28 Javascript
JS JQUERY实现滚动条自动滚到底的方法
Jan 09 Javascript
7个jQuery最佳实践
Jan 12 Javascript
Select下拉框模糊查询功能实现代码
Jul 22 Javascript
基于jQuery实现表格内容的筛选功能
Aug 21 Javascript
vue使用stompjs实现mqtt消息推送通知
Jun 22 Javascript
Angular 开发学习之Angular CLI的安装使用
Dec 31 Javascript
jQuery 图片查看器插件 Viewer.js用法简单示例
Apr 04 jQuery
Element Breadcrumb 面包屑的使用方法
Jul 26 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
在Windows中安装Apache2和PHP4的权威指南
2006/10/09 PHP
PHP服务器页面间跳转实现方法
2012/08/02 PHP
ThinkPHP整合百度Ueditor图文教程
2014/10/21 PHP
PHP Curl模拟登录微信公众平台、新浪微博实例代码
2016/01/28 PHP
PHP中set_include_path()函数相关用法分析
2016/07/18 PHP
CentOS系统中PHP安装扩展的方式汇总
2017/04/09 PHP
Javascript操纵Cookie实现购物车程序
2007/02/15 Javascript
jquery.validate分组验证代码
2011/03/17 Javascript
JS获取键盘上任意按键的值(实例代码)
2013/11/12 Javascript
Javascript字符串对象的常用方法简明版
2014/06/26 Javascript
jquery移动节点实例
2015/01/14 Javascript
jQuery子窗体取得父窗体元素的方法
2015/05/11 Javascript
JS 终止执行的实现方法
2016/11/24 Javascript
javascript学习之json入门
2016/12/22 Javascript
基本DOM节点操作
2017/01/17 Javascript
nodejs个人博客开发第七步 后台登陆
2017/04/12 NodeJs
JS实现图片预览的两种方式
2017/06/27 Javascript
ES6知识点整理之函数对象参数默认值及其解构应用示例
2019/04/17 Javascript
js实现多张图片每隔一秒切换一张图片
2019/07/29 Javascript
如何使用gpu.js改善JavaScript的性能
2020/12/01 Javascript
[01:15:36]加油刀塔第二期网络版
2014/08/09 DOTA
bpython 功能强大的Python shell
2016/02/16 Python
ubuntu系统下 python链接mysql数据库的方法
2017/01/09 Python
对pandas中apply函数的用法详解
2018/04/10 Python
Django中更改默认数据库为mysql的方法示例
2018/12/05 Python
Python Tkinter模块 GUI 可视化实例
2019/11/20 Python
python3 实现调用串口功能
2019/12/26 Python
python对文件的操作方法汇总
2020/02/28 Python
纯CSS3+DIV实现小三角形边框效果的示例代码
2020/08/03 HTML / CSS
信息专业大学生自我评价分享
2014/01/17 职场文书
慰问敬老院活动总结
2014/04/26 职场文书
2016年主题党日活动总结
2016/04/05 职场文书
python urllib库的使用详解
2021/04/13 Python
Go 在 MongoDB 中常用查询与修改的操作
2021/05/07 Golang
搞笑Gif:这么白这么长的腿像极了一楼的女朋友
2022/03/21 杂记
MySQL时区造成时差问题
2022/04/13 MySQL