vue 路由缓存 路由嵌套 路由守卫 监听物理返回
最近开发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 路由缓存 路由嵌套 路由守卫 监听物理返回的更多相关文章
- cordova app 监听物理返回键
物理返回键指的是手机系统自带的返回按钮,通过cordova监听返回按钮操作,可以禁止某些页面的返回操作,以及实现点击两次返回按钮退出应用. var pageUrl = window.location. ...
- JS使用 popstate 事件监听物理返回键
pushHistory(); window.addEventListener("popstate", function (e) { if (or ...
- Vue(基础六)_嵌套路由(续)
一.前言 1.路由嵌套里面的公共路由 2.keep-alive路由缓存 3.导航守卫 二.主要内容 ...
- vue 定义全局函数,监听android返回键事件
vue 定义全局函数,监听android返回键事件 方法一:main.js 注入(1)在main.js中写入函数Vue.prototype.changeData = function (){ aler ...
- vue+hbuilder监听安卓返回键问题
1.监听安卓返回键问题 效果:在一级页面按一下返回键提示退出应用,按两下退出应用;在其它页面中,按一下返回上个历史页面 1 2 import mui from './assets/js/mui.min ...
- 使用ionic开发时用遇到监听手机返回按钮的问题~
当时用的是ionic开发一个app,需求是,当按下手机的返回按钮,在指定的页面双击退出,而在其他页面点击一次返回到上个页面: 其实用ionic自带的服务就可以解决: //双击退出 $ionicP ...
- javascript监听手机返回键
javascript监听手机返回键 <pre> if (window.history && window.history.pushState) { $(window).on ...
- vue(19)嵌套路由
嵌套路由 有时候在路由中,主要的部分是相同的,但是下面可能是不同的.比如访问首页,里面有新闻类的/home/news,还有信息类的/home/message.这时候就需要使用到嵌套路由.项目结构如下: ...
- vue学习-day05 -- 案例:名字合并(监听data数据的改变)
1.案例:名字合并(监听data数据的改变) 使用keyup事件监听data数据的改变 <!DOCTYPE html> <html> <head> <titl ...
随机推荐
- Maven学习总结(七):Maven的聚合和继承
一.聚合 如果我们想一次构建多个项目模块,那我们就需要对多个项目模块进行聚合 1.1.聚合配置代码 1 <modules> 2 <module>模块一</module&g ...
- Reporting Service 2005 迁移 到 2008
1. 备份ReportServer 和ReportServerTempDB 的数据库. 2. 在Reporting Services Configuration Manager 中备份Encrypti ...
- 学习ssm心得
学习是一个探索的过程,在我编程能力提高的阶段中,我发现在编写代码之前,必须得弄清代码的逻辑,我到底要干什么,从哪一步做起.端与端之间该怎么衔接. 先把问题想清楚,再去编写.不要急着去乱敲一通,一点用处 ...
- Modern Operating System
No one can do all things, learn to be good at use what others already did. Most computers have two m ...
- C# 串口
/// <summary> /// 串口初始化 /// </summary> private void OpenSerialPort ...
- vue知识day1
HTML语义.CSS:样式 js:行为 jQuery:简化了js操作 boostrap :框架 ,以类方式展现 react:facebook 公司的产品 angular:谷歌公司产品 vue:作者尤雨 ...
- centors7 elasticsearch6.3安装以及问题记录
1.安装elasticsearch . 安装系统:centors7 1.下载安装包 官网地址:https://www.elastic.co/downloads/past-releases 2.mac文 ...
- js堆栈内存的释放
### JS中的堆栈内存 > 俗称叫做作用域(全局作用域/私有作用域) > - 为js代码提供执行的环境(执行js代码的地方) > - 基本数据类型值是直接存放在栈内存中的 > ...
- ORM的补充
之前学习的orm的操作类似: create delete update filter/all exclude values values_list get first last order_by 补充 ...
- Python学习---DjangoForm的学习
DjangoForm之创建工程 Form是什么东西: 用于验证用户请求数据合法性的一个组件 普通的Form提交的弊端: 1.用户提交数据的验证 2.前台需要进行错误信息的提示 3.需要保留上次用户输入 ...