最近开发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 路由缓存 路由嵌套 路由守卫 监听物理返回的更多相关文章

  1. cordova app 监听物理返回键

    物理返回键指的是手机系统自带的返回按钮,通过cordova监听返回按钮操作,可以禁止某些页面的返回操作,以及实现点击两次返回按钮退出应用. var pageUrl = window.location. ...

  2. JS使用 popstate 事件监听物理返回键

    pushHistory();        window.addEventListener("popstate", function (e) {            if (or ...

  3. Vue(基础六)_嵌套路由(续)

    一.前言                  1.路由嵌套里面的公共路由                  2.keep-alive路由缓存                  3.导航守卫 二.主要内容 ...

  4. vue 定义全局函数,监听android返回键事件

    vue 定义全局函数,监听android返回键事件 方法一:main.js 注入(1)在main.js中写入函数Vue.prototype.changeData = function (){ aler ...

  5. vue+hbuilder监听安卓返回键问题

    1.监听安卓返回键问题 效果:在一级页面按一下返回键提示退出应用,按两下退出应用;在其它页面中,按一下返回上个历史页面 1 2 import mui from './assets/js/mui.min ...

  6. 使用ionic开发时用遇到监听手机返回按钮的问题~

    当时用的是ionic开发一个app,需求是,当按下手机的返回按钮,在指定的页面双击退出,而在其他页面点击一次返回到上个页面: 其实用ionic自带的服务就可以解决:  //双击退出   $ionicP ...

  7. javascript监听手机返回键

    javascript监听手机返回键 <pre> if (window.history && window.history.pushState) { $(window).on ...

  8. vue(19)嵌套路由

    嵌套路由 有时候在路由中,主要的部分是相同的,但是下面可能是不同的.比如访问首页,里面有新闻类的/home/news,还有信息类的/home/message.这时候就需要使用到嵌套路由.项目结构如下: ...

  9. vue学习-day05 -- 案例:名字合并(监听data数据的改变)

    1.案例:名字合并(监听data数据的改变) 使用keyup事件监听data数据的改变 <!DOCTYPE html> <html> <head> <titl ...

随机推荐

  1. grunt-contrib-watch 监控 JS 文件改变来运行预定义的Tasks

    依赖于 GruntJs ~0.4.0 监控 JS 文件改变来运行预定义的Tasks Demo: watch: { scripts: { files: ['src/**/*.js'], tasks: [ ...

  2. vue-cli构建项目 npm run build后应该怎么运行在本地查看效果

    问题: 就是 bulid 打包后,想本地看看效果,本地看不了.... 网上看到一个....   具体更多在: http://www.dabaipm.cn/static/frontend/346.htm ...

  3. 安卓app开发-03-项目的基本开发步骤

    android项目的基本开发步骤 这里分享一下开发 安卓 app 的流程,当然有些感觉不必要,其实不然,前期工作也是极为重要的额,就像开发的时候如果目标不对的话,到后期后很迷的,所以一定要提前做好规划 ...

  4. 4 使用Selenium模拟登录csdn,取出cookie信息,再用requests.session访问个人中心(保持登录状态)

    代码: # -*- coding: utf-8 -*- """ Created on Fri Jul 13 16:13:52 2018 @author: a " ...

  5. 软工读书笔记 week3 (《黑客与画家》上)

    一.何谓黑客? 黑客,在我们大多数普通人眼里,就是入侵计算机的人,通常还与干坏事挂钩.而书中告诉我们,这 并不是它的真正含义.而要想理解这本书,就要首先理解什么是黑客. 黑客这个词最初起源时,完全是一 ...

  6. sql server 查询分析器中表名无效,有红线,其实是这张表的

    ctrl+shift+R 就OK了,就是刷新本地缓存.

  7. [翻译] Shimmer

    Shimmer Shimmer is an easy way to add a shimmering effect to any view in your app. It's useful as an ...

  8. Java学习---IO操作

    基础知识 1.文件操作 Java语言统一将每个文件都视为一个顺序字节流.每个文件或者结束于一个文件结束标志,或者根据系统维护管理数据中所纪录的具体字节数来终止.当一个文件打开时,一个对象就被创建,同时 ...

  9. 企业级Apache详解2

    http_conf主配置说明 root@lamp01 apache]# grep -Ev "#|^$" conf/httpd.conf DocumentRoot "/us ...

  10. Genymotion安卓模拟器和VirtualBox虚拟机安装、配置、测试(win7_64bit)

    1.概述 VirtualBox是一个优秀的虚拟机软件,它可以在电脑上提供另一个操作系统的运行环境,使多个系统同时运行.VirtualBox支持的操作系统包括Windows.Mac OS X.Linux ...