vue 路由缓存 路由嵌套 路由守卫 监听物理返回操作


Posted in Javascript onAugust 06, 2020

最近开发vue项目,遇到的一些问题,这里整合一下,看到一些博客已经有写相关知识,然后自己再次记录一下。

这是关于vue路由相关比较常见的问题,以后遇到相关路由的问题,会不断更新这篇博客。

需求1:从填写表单A页面跳转到B页面,然后再从B页面返回到A页面,实现A页面的所填的数据保留

一.设置路由缓存:

1.App.vue中加入<keep-alive> 具体代码如下:

<template>
 <div id="app">
 <!--<img src="./assets/logo.png">-->
 <keep-alive>
  <router-view v-if="$route.meta.keepAlive">
  <!-- 这里是会被缓存的视图组件A -->
  </router-view>
 </keep-alive>
 <router-view v-if="!$route.meta.keepAlive">
  <!-- 这里是不被缓存的视图组件B -->
 </router-view>
 </div>
</template>

2.在路由配置文件index.js里面增加meta标签,代码如下:

export default new Router({
 routes: [
 {
  path: '/',
  name: 'Initinfo',
  component: Initinfo
 },
  {
   path: '/B',
   name:'B',
   component: CredentialsDetails,
   meta:{keepAlive:false}
  },
  {
   path: '/A',
   name:'A',
   component: ASeal,
   meta:{keepAlive:true}
  }

 ]
})

ok,做到这里,就能实现以上需求1。

需求2:在需求1基础上,增加一个需求就是,缓存A表单页面滚动位置,代码如下:

export default new Router({

 //使用keep-alive后,可能存在滚动条问题的解决问题
 mode:'hash',//默认是hash模式 且有history
 scrollBehavior(to,from,savePosition) { // 在点击浏览器的“前进/后退”,或者切换导航的时候触发。
  console.log(to) // to:要进入的目标路由对象,到哪里去
  console.log(from) // from:离开的路由对象,哪里来
  console.log(savePosition) // savePosition:会记录滚动条的坐标,点击前进/后退的时候记录值{x:?,y:?}
  if(savePosition){
   return savePosition;
  }else{
   return {
    x: 0,
    y: 0
   }
  }
 },
 routes: [
  {
   path: '/',
   name: 'Initinfo',
   component: Initinfo
  },
  {
   path: '/B',
   name:'B',
   component: CredentialsDetails,
   meta:{keepAlive:false}
  },
  {
   path: '/A',
   name:'A',
   component: ASeal,
   meta:{keepAlive:true}
  }

 ]
})

需求3:

1.默认显示 A

2. B跳到 A,A 不刷新

3. C跳到 A,A 刷新

https://router.vuejs.org/zh/guide/advanced/navigation-guards.html

以上是路由守卫官网,可以参考,下面介绍两个守卫:beforeRouteLeave,beforeRouteEnter

1.在路由的index.js文件,和以上路由一样,设置A页面的meta属性,代码如下:

{
 path: '/A',
 name:'A',
 component: ASeal,
 meta:{keepAlive:true}
 }

2. 在B组件设置 beforeRouteLeave:代码如下:

export default {
 beforeRouteLeave(to, from, next) {
  console.log(to);
  console.log(from)
  // 设置下一个路由的 meta
  to.meta.keepAlive = true; // 让 A 缓存,即不刷新
  next();//确保要调用 next 方法,否则钩子就不会被 resolved
 }
};

3.在C组件设置 beforeRouteLeave:代码如下:

export default {
 beforeRouteLeave(to, from, next) {
  console.log(to);
  console.log(from)
  // 设置下一个路由的 meta
  to.meta.keepAlive = false; // 让 A不缓存,即刷新
  next();//确保要调用 next 方法,否则钩子就不会被 resolved
 }
};

ok,以上代码即可满足需求3

需求4:

1.A-->B-->C-->D 从A页面依次进入BCD页面,现在我要在D页面点击返回(手机或者浏览器物理返回键)回到A页面

2.A-->E-->D 从A页面一次进入ED页面,现在我在D页面点击返回(手机或者浏览器物理返回键)回到E页面

以上的需求总结来说就是,根据不同的渠道进入D页面的时候,当点击返回的时候,进入不同的页面

1.首先我在入口main.js里面声明了一个全局变量(当然你可以按照自己的方式去声明一个变量)

global.beforeRouteName = "";

2.然后在D组件中,声明路由守卫:beforeRouteEnter,代码如下:

刚进入该组件时,便会进入beforeRouteEnter,在此先赋值:

beforeRouteEnter(to,from,next){
  global.beforeRouteName = from.name; //给全局变量赋值
  next();
 },

然后在mounted里面判断浏览器是否支持popstate

mounted(){
 //判断浏览器是否支持popstate
 if(window.history && window.history.pushState){
  history.pushState(null,null,document.URL);
  window.addEventListener('popstate',this.goBack,false);
 }
 }

其次在methods里面写goBack方法,代码如下:

goBack(){
 if(global.beforeRouteName == "C"){  //判断,当获取上个页面进来的路由是C的时候,返回到A页面
  this.$router.push({name:'A'}); 
 }else if(global.beforeRouteName == "E"){//判断,当获取上个页面进来的路由是E的时候,返回上一页
  history.go(-1);
 }else{
  this.$router.push({name:'A'}); //判断,当有其他返回值的时候,默认返回到A页面(这个随意设置,一般不会有这种情况)
 }
 }

最后一定不要忘记:在destroyed要取消监听,不然这个监听一直存在,代码如下:

destroyed(){
 window.removeEventListener('popstate',this.goBack,false);
}

到此需求4就解决了。

刚刚看了下代码,其实路由守卫做这个返回控制其实更简单。只要好好使用beforeRouteLeave这个守卫就能简单解决以上问题

补充知识:vue 使用路由守卫监听返回键,控制页面跳转

我就废话不多说了,大家还是直接看代码吧~

beforeRouteLeave(to, from, next) {
  // 导航离开该组件的对应路由时调用
  // 可以访问组件实例 `this`
  if(!this.isPublish){
   this.confirmVisible=true
   next(false)//不放行
  }else {
   next()
  }
 
 },

以上这篇vue 路由缓存 路由嵌套 路由守卫 监听物理返回操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
多浏览器支持的右下角浮动窗口
Apr 01 Javascript
Jquery replace 字符替换实现代码
Dec 02 Javascript
Jquery动态添加输入框的方法
May 29 Javascript
基于jQuery滑动杆实现购买日期选择效果
Sep 15 Javascript
解决js页面滚动效果scrollTop在FireFox与Chrome浏览器间的兼容问题的方法
Dec 03 Javascript
对象题目的一个坑 理解Javascript对象
Dec 22 Javascript
JS获取当前使用的浏览器名字以及版本号实现方法
Aug 19 Javascript
微信小程序 参数传递详解
Oct 24 Javascript
js css自定义分页效果
Feb 24 Javascript
jQuery基于随机数解决中午吃什么去哪吃问题示例
Dec 29 jQuery
JS学习笔记之原型链和利用原型实现继承详解
May 29 Javascript
解决vue更新路由router-view复用组件内容不刷新的问题
Nov 04 Javascript
Vue Router中应用中间件的方法
Aug 06 #Javascript
JavaScript的垃圾回收机制与内存管理
Aug 06 #Javascript
vue-路由精讲 二级路由和三级路由的作用
Aug 06 #Javascript
如何利用javascript接收json信息并进行处理
Aug 06 #Javascript
浅谈vue 二级路由嵌套和二级路由高亮问题
Aug 06 #Javascript
vue项目实现设置根据路由高亮对应的菜单项操作
Aug 06 #Javascript
javascript实现时间日期的格式化的方法汇总
Aug 06 #Javascript
You might like
CI框架给视图添加动态数据
2014/12/01 PHP
使用PHP生成图片的缩略图的方法
2015/08/18 PHP
THinkPHP获取客户端IP与IP地址查询的方法
2016/11/14 PHP
PHP实现表单提交时去除斜杠的方法
2016/12/26 PHP
Js四则运算函数代码
2012/07/21 Javascript
JQuery中DOM事件绑定用法详解
2015/06/13 Javascript
js当前页面登录注册框,固定div,底层阴影的实例代码
2016/10/04 Javascript
jQuery Ajax自定义分页组件(jquery.loehpagerv1.0)实例详解
2017/05/01 jQuery
AngularJS常见过滤器用法实例总结
2017/07/06 Javascript
浅析node Async异步处理模块用例分析及常用方法介绍
2017/11/17 Javascript
Javacript中自定义的map.js  的方法
2017/11/26 Javascript
浅谈在node.js进入文件目录的问题
2018/05/13 Javascript
vue router总结 $router和$route及router与 router与route区别
2019/07/05 Javascript
python类型强制转换long to int的代码
2013/02/10 Python
python实现识别相似图片小结
2016/02/22 Python
Python实现快速排序算法及去重的快速排序的简单示例
2016/06/26 Python
Python中字典和集合学习小结
2017/07/07 Python
python生成tensorflow输入输出的图像格式的方法
2018/02/12 Python
教你使用python画一朵花送女朋友
2018/03/29 Python
Python用于学习重要算法的模块pygorithm实例浅析
2018/08/16 Python
Python Flask框架模板操作实例分析
2019/05/03 Python
Python当中的array数组对象实例详解
2019/06/12 Python
Python爬虫图片懒加载技术 selenium和PhantomJS解析
2019/09/18 Python
Python文件操作基础流程解析
2020/03/19 Python
CSS3教程(3):border-color网页边框色彩
2009/04/02 HTML / CSS
美国领先的家庭智能音响系统品牌:Sonos
2018/07/20 全球购物
Sandro法国官网:法国成衣品牌
2019/08/28 全球购物
百货商场楼层班组长竞聘书
2014/03/31 职场文书
2014年企业员工工作总结
2014/12/09 职场文书
2015年全民国防教育日活动总结
2015/03/23 职场文书
面试通知短信
2015/04/20 职场文书
聚会通知怎么写
2015/04/23 职场文书
2015年秋季运动会广播稿
2015/08/19 职场文书
百年校庆宣传标语口号
2015/12/26 职场文书
golang生成vcf通讯录格式文件详情
2022/03/25 Golang
Golang 实现 WebSockets 之创建 WebSockets
2022/04/24 Golang