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实现每个数字上都带进度条的幻灯片
Feb 20 Javascript
jquery跨域请求示例分享(jquery发送ajax请求)
Mar 25 Javascript
ECMAScript 6即将带给我们新的数组操作方法前瞻
Jan 06 Javascript
ztree获取当前选中节点子节点id集合的方法
Feb 12 Javascript
举例说明如何为JavaScript的方法参数设置默认值
Nov 17 Javascript
jQuery ztree实现动态树形多选菜单
Aug 12 Javascript
BACKBONE.JS 简单入门范例
Oct 17 Javascript
对vue.js中this.$emit的深入理解
Feb 23 Javascript
JS简单实现查看文档创建日期、修改日期和文档大小的方法示例
Apr 08 Javascript
JS实现方形抽奖效果
Aug 27 Javascript
vue 对象添加或删除成员时无法实时更新的解决方法
May 01 Javascript
vue中实现动态生成二维码的方法
Feb 21 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版网站缓存加快打开速度的方法分享
2012/06/03 PHP
配置php.ini实现PHP文件上传功能
2014/11/27 PHP
php简单压缩css样式示例
2016/09/22 PHP
php正则去除网页中所有的html,js,css,注释的实现方法
2016/11/03 PHP
PHP后台微信支付和支付宝支付开发
2017/04/28 PHP
javascript动画效果类封装代码
2007/08/28 Javascript
你需要知道的10个最佳javascript开发实践小结
2012/04/15 Javascript
js控制的遮罩层实例介绍
2013/05/29 Javascript
解析URI与URL之间的区别与联系
2013/11/22 Javascript
Jquery中&quot;$(document).ready(function(){ })&quot;函数的使用详解
2013/12/30 Javascript
利用javascript打开模态对话框(示例代码)
2014/01/11 Javascript
js密码强度校验
2015/11/10 Javascript
AngularJS实现动态编译添加到dom中的方法
2016/11/04 Javascript
bootstrap table分页模板和获取表中的ID方法
2017/01/10 Javascript
深入理解Angular中的依赖注入
2017/06/26 Javascript
微信小程序获取微信运动步数的实例代码
2017/07/20 Javascript
Vue利用路由钩子token过期后跳转到登录页的实例
2017/10/26 Javascript
微信小程序按钮去除边框线分享页面功能
2018/08/27 Javascript
python引入导入自定义模块和外部文件的实例
2017/07/24 Python
Python编程求质数实例代码
2018/01/31 Python
python实现自动解数独小程序
2019/01/21 Python
快速排序的四种python实现(推荐)
2019/04/03 Python
PyQt5的PyQtGraph实践系列3之实时数据更新绘制图形
2019/05/13 Python
Python pandas实现excel工作表合并功能详解
2019/08/29 Python
python 装饰器重要在哪
2021/02/14 Python
Shop Apotheke瑞士:您的健康与美容网上商店
2019/10/09 全球购物
L’Artisan Parfumeur官网:法国香水品牌
2020/08/11 全球购物
linux面试题参考答案(11)
2016/11/26 面试题
机电专业个人自荐信格式模板
2013/09/23 职场文书
校园活动策划书范文
2014/01/10 职场文书
读书活动实施方案
2014/03/10 职场文书
党的群众路线教育实践活动查摆问题及整改措施
2014/10/10 职场文书
山楂树之恋观后感
2015/06/11 职场文书
道士塔读书笔记
2015/06/30 职场文书
活动宣传稿范文
2015/07/23 职场文书
学困生转化工作总结
2015/08/13 职场文书