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 相关文章推荐
js实现单一html页面两套css切换代码
Apr 11 Javascript
关于jquery.validate1.9.0前台验证的使用介绍
Apr 26 Javascript
javascript设置金额样式转换保留两位小数示例代码
Dec 04 Javascript
AngularJS内置指令
Feb 04 Javascript
JS实现网页上随机产生超链接地址的方法
Nov 09 Javascript
学习JavaScript鼠标响应事件
Dec 25 Javascript
基于javascript制作经典传统的拼图游戏
Mar 22 Javascript
form表单转Json提交的方法(推荐)
Sep 23 Javascript
jquery实现点击页面回到顶部
Nov 23 Javascript
vue监听滚动事件实现滚动监听
Apr 11 Javascript
vue axios 简单封装以及思考
Oct 09 Javascript
vue实现按需加载组件及异步组件功能
May 27 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 用checkbox一次性删除多条记录的方法
2010/02/23 PHP
PHP中捕获超时事件的方法实例
2015/02/12 PHP
thinkPHP简单实现多个子查询语句的方法
2016/12/05 PHP
利用PHP抓取百度阅读的方法示例
2016/12/18 PHP
用js实现预览待上传的本地图片
2007/03/15 Javascript
js完美的div拖拽实例代码
2014/01/22 Javascript
Nodejs实现的一个简单udp广播服务器、客户端
2014/09/25 NodeJs
Bootstrap CSS布局之列表
2016/12/15 Javascript
简单理解js的冒泡排序
2016/12/19 Javascript
React从react-router路由上做登陆验证控制的方法
2018/05/10 Javascript
小程序实现左右来回滚动字幕效果
2018/12/28 Javascript
说说Vue.js中的functional函数化组件的使用
2019/02/12 Javascript
JavaScript读取本地文件常用方法流程解析
2020/10/12 Javascript
[03:55]TI9战队采访——TNC Predator
2019/08/22 DOTA
Python 闭包的使用方法
2017/09/07 Python
OpenCV 边缘检测
2019/07/10 Python
Python @property使用方法解析
2019/09/17 Python
TensorFlow tf.nn.conv2d实现卷积的方式
2020/01/03 Python
Python下利用BeautifulSoup解析HTML的实现
2020/01/17 Python
Jupyter 无法下载文件夹如何实现曲线救国
2020/04/22 Python
Python基于数列实现购物车程序过程详解
2020/06/09 Python
python如何调用java类
2020/07/05 Python
python中@contextmanager实例用法
2021/02/07 Python
利用css3实现的简单的鼠标悬停按钮
2014/11/04 HTML / CSS
css3实现平移效果(transfrom:translate)的示例
2020/11/13 HTML / CSS
美国汽配连锁巨头Pep Boys官网:轮胎更换、汽车维修服务和汽车零部件
2017/01/14 全球购物
Parfume Klik丹麦:香水网上商店
2018/07/10 全球购物
NFL欧洲商店(德国):NFL Europe Shop DE
2018/11/03 全球购物
美国Max仓库:Max Warehouse
2020/05/31 全球购物
Cecil Mode法国在线商店:女性时尚
2021/01/08 全球购物
Java里面Pass by value和Pass by Reference是什么意思
2016/05/02 面试题
生日邀请函范文
2014/01/13 职场文书
二手房购房意向书范本
2014/04/01 职场文书
运动会广播稿200米(5篇)
2014/10/15 职场文书
后进基层党组织整改方案
2014/10/25 职场文书
就业推荐表导师评语
2014/12/31 职场文书