vue 解决addRoutes动态添加路由后刷新失效问题


Posted in Javascript onJuly 02, 2018

前言

某些场景下我们需要利用addRoutes动态添加路由,但是刷新后就会失效,前段时间项目里刚好遇到了这个应用场景,所以就花时间研究了一下,做下分享跟记录,说的不对的地方,请大家指正。

应用场景:用户a登录进系统,页面上有个按钮,点击之后会动态添加路由并且跳转,跳转过去之后,用户刷新后也会停留在当前页面。 不点这个按钮,浏览器输入地址,用户会跳到404页面

github:https://github.com/Mrblackant/keepRouter/tree/master

vue 解决addRoutes动态添加路由后刷新失效问题

思路

1.用户点击按钮,用addRutes动态添加路由并跳转,并把路由保存;
2.用户在新跳转的页面,刷新时利用beforeEach进行拦截判断,如果发现之前有保存路由,并且判断新页面只是刷新事件,再将之前保存的路由添加进来;

代码

1.按钮点击,保存路由并跳转

(1).在router/index.js里声明一个数组,里边是一些固定的路由,比如你的登录页面、404等等

//router/index.js
export const constantRouterMap=[
  {
   path: '/',
   // name: 'HelloWorld',
   component: HelloWorld
  }
 ]
Vue.use(Router)
export default new Router({
 routes: constantRouterMap
})

(2).按钮点击,跳转、保存路由;

注意,保存路由这一步骤,要做进要跳转到的组件里,这是为了防止在beforeEach拦截这边产生死循环

添加路由需要两点,一是path,二是component,你可以封装成方法,看着就会简洁一点,我这里就不做了

记得要用concat方法连接,固定的路由和动态新加的路由,这样浏览器回退的时候也能正常返回

//点击跳转
<template>
 <div>
  点击新增 动态路由: "secondRouter"
  <br/>
  <el-button @click="srouter" type="primary">新增动态路由</el-button>

 </div>
</template>

<script>
import router from 'vue-router'
import {constantRouterMap} from '@/router'


export default {
 name: 'kk',
 mounted(){
 },
 data () {
  return {
   msg: 'Welcome to Your Vue.js App'
  }
 },
 methods:{
  srouter(){
   let newRoutes=constantRouterMap.concat([{path:'/secondRouter',
    component :resolve => require(["@/components/kk"], resolve )
   }])
   this.$router.addRoutes(newRoutes)
   this.$router.push({path:'/secondRouter'})
  }
 }
}
</script>

//跳转过去的component组件,xxx.vue
<template>
 <div class="secondRoute">
  恭喜你,动态添加路由成功,浏览器的链接已经变化;

  <h3>无论你怎么刷新我都会留在当前页面</h3>
  <h3>并且点击浏览器回退键,我会跳到之前页面,不会循环</h3>

 </div>
</template>

<script>
import router2 from '@/router'
import router from 'vue-router'
export default {
 name: 'HelloWorld',
 mounted(){
   localStorage.setItem('new',JSON.stringify({'path':'/secondRouter','component':'kk'}))//保存路由
 },
 data () {
  return {
   msg: 'Welcome to Your Vue.js App'
  }
 },
 methods:{
 }
}
</script>

2.路由拦截beforeEach

这里拦截的时候,就判断localStorage里边有没有保存新的动态路由,如果有,就进行判断,逻辑处理,处理完之后就把保存的路由清除掉,防止进入死循环。

进入第一层判断后,需要再次判断一下是不是页面的刷新事件

import router from './router'
import { constantRouterMap } from '@/router' //router里的固定路由
router.beforeEach((to, from, next) => {
 if (localStorage.getItem('new')) {
  var c = JSON.parse(localStorage.getItem('new')),
  lastUrl=getLastUrl(window.location.href,'/');

  if (c.path==lastUrl) { //动态路由页面的刷新事件
   let newRoutes = constantRouterMap.concat([{
    path: c.path,
    component: resolve => require(["@/components/" + c.component + ""], resolve)
   }])
   localStorage.removeItem('new')
   router.addRoutes(newRoutes)
   router.replace(c.path) //replace,保证浏览器回退的时候能直接返回到上个页面,不会叠加

  } 
 } 
 next()

})

var getLastUrl=(str,yourStr)=>str.slice(str.lastIndexOf(yourStr))//取到浏览器出现网址的最后"/"出现的后边的字符

ps:一开始我还以为匹配不到路由跳转404要在拦截这里处理,后来发现根本不用,直接在注册路由的时候加上下边两段就行了:

export const constantRouterMap = [{
  path: '/',
  component: HelloWorld
 }, 
 {//404
  path: '/404',
  component: ErrPage
 },
 { //重定向到404
   path: '*', redirect: '/404' }
]

整体的思路大概就是这样,主要就是利用了beforeEach拦截+localStorage的数据存储,就能完成,addRoutes动态添加路由刷新不失效功能。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Javascript中暂停功能的实现代码
Mar 04 Javascript
JQuery-tableDnD 拖拽的基本使用介绍
Jul 04 Javascript
javascript eval(func())使用示例
Dec 05 Javascript
javascript替换已有元素replaceChild()使用介绍
Apr 03 Javascript
删除javascript中注释语句的正则表达式
Jun 11 Javascript
javascript使用数组的push方法完成快速排序
Sep 15 Javascript
使用jQuery实现返回顶部
Jan 26 Javascript
原生JS实现的放大镜效果实例代码
Oct 15 Javascript
详解angularJS动态生成的页面中ng-click无效解决办法
Jun 19 Javascript
vue 2.0项目中如何引入element-ui详解
Sep 06 Javascript
基于匀速运动的实例讲解(侧边栏,淡入淡出)
Oct 17 Javascript
tsconfig.json配置详解
May 17 Javascript
vue中的数据绑定原理的实现
Jul 02 #Javascript
Vue实现双向绑定的原理以及响应式数据的方法
Jul 02 #Javascript
jsonp跨域获取数据的基础教程
Jul 01 #Javascript
vue + webpack如何绕过QQ音乐接口对host的验证详解
Jul 01 #Javascript
关于Vue组件库开发详析
Jul 01 #Javascript
D3.js实现拓扑图的示例代码
Jun 30 #Javascript
详解angular如何调用HTML字符串的方法
Jun 30 #Javascript
You might like
php面向对象全攻略 (六)__set() __get() __isset() __unset()的用法
2009/09/30 PHP
PHP文件上传原理简单分析
2011/05/29 PHP
PHP中使用localhost连接Mysql不成功的解决方法
2014/08/20 PHP
Zend Framework动作助手Json用法实例分析
2016/03/05 PHP
PHP中加速、缓存扩展的区别和作用详解(eAccelerator、memcached、xcache、APC )
2016/07/09 PHP
PHP实现带重试功能的curl连接示例
2016/07/28 PHP
在云虚拟主机部署thinkphp5项目的步骤详解
2017/12/21 PHP
PHP 图片合成、仿微信群头像的方法示例
2019/10/25 PHP
js iframe跨域访问(同主域/非同主域)分别深入介绍
2013/01/24 Javascript
jquery插件validate验证的小例子
2013/05/08 Javascript
原生js ActiveXObject获取execl里面的值
2013/11/01 Javascript
node.js中的fs.readFile方法使用说明
2014/12/15 Javascript
jQuery功能函数详解
2015/02/01 Javascript
深入理解JavaScript系列(26):设计模式之构造函数模式详解
2015/03/03 Javascript
javascript实现下班倒计时效果的方法(可桌面通知)
2015/07/10 Javascript
AngularJS教程之简单应用程序示例
2016/08/16 Javascript
Node.js读写文件之批量替换图片的实现方法
2016/09/07 Javascript
Bootstrap CSS组件之导航(nav)
2016/12/17 Javascript
jQuery Ajax前后端使用JSON进行交互示例
2017/03/17 Javascript
vue打包相关细节整理(小结)
2018/09/28 Javascript
使用element-ui table expand展开行实现手风琴效果
2019/03/15 Javascript
微信打开网址添加在浏览器中打开提示的办法
2019/05/20 Javascript
javascript定时器的简单应用示例【控制方块移动】
2019/06/17 Javascript
JS this关键字在ajax中使用出现问题解决方案
2020/07/17 Javascript
vue中的.$mount('#app')手动挂载操作
2020/09/02 Javascript
python进阶教程之异常处理
2014/08/30 Python
python 捕获 shell/bash 脚本的输出结果实例
2017/01/04 Python
python @classmethod 的使用场合详解
2019/08/23 Python
pd.DataFrame统计各列数值多少的实例
2019/12/05 Python
python 比较字典value的最大值的几种方法
2020/04/17 Python
捷克街头、运动和滑板一站式商店:BoardStar.cz
2019/10/06 全球购物
十佳大学生村官事迹
2014/01/09 职场文书
作风大整顿心得体会
2014/09/10 职场文书
大学社团招新的通讯稿
2014/09/10 职场文书
html+css 实现简易导航栏功能
2021/04/07 HTML / CSS
python如何在word中存储本地图片
2021/04/07 Python