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 相关文章推荐
Jquery从头学起第四讲 jquery入门教程
Aug 01 Javascript
jquery随意添加移除html的实现代码
Jun 21 Javascript
jquery实现select下拉框美化特效代码分享
Aug 18 Javascript
基于Vuejs框架实现翻页组件
Jun 29 Javascript
关于Vue.js一些问题和思考学习笔记(2)
Dec 02 Javascript
原生js实现无限循环轮播图效果
Jan 20 Javascript
JS前端开发判断是否是手机端并跳转操作(小结)
Feb 05 Javascript
JavaScript之面向对象_动力节点Java学院整理
Jun 29 Javascript
js实现水平滚动菜单导航
Jul 21 Javascript
微信小程序自定义组件封装及父子间组件传值的方法
Aug 28 Javascript
vue-router的钩子函数用法实例分析
Oct 26 Javascript
微信小程序实现点击导航标签滚动定位到对应位置
Nov 19 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&amp;mysql(三)
2006/10/09 PHP
PHP 获取MySQL数据库里所有表的实现代码
2011/07/13 PHP
PHPStrom 新建FTP项目以及在线操作教程
2016/10/16 PHP
使用phpQuery获取数组的实例
2017/03/13 PHP
js面向对象 多种创建对象方法小结
2012/05/21 Javascript
简述JavaScript中正则表达式的使用方法
2015/06/15 Javascript
使用JQuery FancyBox插件实现图片展示特效
2015/11/16 Javascript
JavaScript快速切换繁体中文和简体中文的方法及网站支持简繁体切换的绝招
2016/03/07 Javascript
jQuery Mobile页面返回不需要重新get
2016/04/26 Javascript
jQuery图片左右滚动代码 有左右按钮实例
2016/06/20 Javascript
用原生js做单页应用
2017/01/17 Javascript
JavaScript中 DOM操作方法小结
2017/04/25 Javascript
JS简单实现自定义右键菜单实例
2017/05/31 Javascript
jquery 动态遍历select 赋值的实例
2018/09/12 jQuery
vue2.0移动端滑动事件vue-touch的实例代码
2018/11/27 Javascript
vue2.0项目集成Cesium的实现方法
2019/07/30 Javascript
vue中的使用token的方法示例
2020/03/10 Javascript
JavaScript实现指定数量的并发限制的示例代码
2020/03/10 Javascript
js实现金山打字通小游戏
2020/07/24 Javascript
原生js拖拽功能制作滑动条实例代码
2021/02/05 Javascript
python简单获取数组元素个数的方法
2015/07/13 Python
Python常用内置模块之xml模块(详解)
2017/05/23 Python
Python 12306抢火车票脚本
2018/02/07 Python
python判断文件夹内是否存在指定后缀文件的实例
2019/06/10 Python
python3的数据类型及数据类型转换实例详解
2019/08/20 Python
python绘制动态曲线教程
2020/02/24 Python
Python猴子补丁Monkey Patch用法实例解析
2020/03/23 Python
Django 实现 Websocket 广播、点对点发送消息的代码
2020/06/03 Python
Django权限控制的使用
2021/01/07 Python
房屋买卖协议书范本
2014/04/10 职场文书
英语系毕业生求职信
2014/07/13 职场文书
2014小学一年级班主任工作总结
2014/12/05 职场文书
面试通知短信
2015/04/20 职场文书
领导干部学习三严三实心得体会
2016/01/05 职场文书
关于践行三严三实的心得体会
2016/01/05 职场文书
mysql使用 not int 子查询隐含陷阱
2022/04/12 MySQL