vue实现前进刷新后退不刷新效果


Posted in Javascript onJanuary 26, 2018

最近在用vue尝试着做移动端的项目。希望实现前进刷新、后退不刷新的效果。即加载过的界面能缓存起来(返回不用重新加载),关闭的界面能被销毁掉(再进入时重新加载)。例如对a->b->c 前进(b,c)刷新,c->b->a 后退(b,a)不刷新。

由于 keep-alive 会把所有加载的过的界面都缓存起来,没法实现返回时将界面销毁掉,导致再进入时没有重新加载这个界面。于是首先想到的方案是在点击界面上返回按钮的时候,调用 this.$destroy(true) 来将界面销毁掉。但是在移动端 android设备上会有物理返回键,如果通过物理返回键返回的话,就没法处理了。虽然可以重写android的返回事件,来调用js的方法,但是调用的是js的全局方法,没法具体让在最上层的那个界面销毁掉。

于是就需要另辟蹊径了。还好这篇文章给了我启发 vue-router 之 keep-alive ,多谢作者的分享。

要是能够知道路由是前进还是后退就好了,这样的话我就能在后退的时候让 from 路由的 keepAlive 置为 false , to 路由的 keepAlive 置为 ture ,就能在再次前进时,重新加载之前这个 keepAlive 被置为 false 的路由了。

废话不多说了,这里模拟有三个界面 login 到 server 到 main 。

首先我给这三个界面路由的 path 设置了严格的层级关系 ,并设置keepAlive都是true,默认都是需要缓存。

const router = new Router({
 routes: [
  {
   path: '/',
   redirect: '/login'
  },
  {
   path: '/login',
   component: Login,
   meta: {
    keepAlive: true
   }
  },
  {
   path: '/login/server',
   component: ServerList,
   meta: {
    keepAlive: true
   }
  },
  {
   path: '/login/server/main',
   component: Main,
   meta: {
    keepAlive: true
   }
  }
 ]
})

由于这三个界面path的层级不同,我就能通过 beforeEach 这个钩子判断出什么时候是后退了。在后退时将 from 路由的 keepAlive 置为 false , to 路由的 keepAlive 置为 ture 。

router.beforeEach((to, from, next) => {
 const toDepth = to.path.split('/').length
 const fromDepth = from.path.split('/').length
 if (toDepth < fromDepth) {
  console.log('后退。。。')
  from.meta.keepAlive = false
  to.meta.keepAlive = true
 }
 next()
})

最后需要缓存的界面用 keep-alive 包起来,就能实现时前进刷新,后退时不刷新的效果了。

<keep-alive>
     <router-view v-if="$route.meta.keepAlive">
      <!-- 这里是会被缓存的视图组件 -->
     </router-view>
    </keep-alive>
    <router-view v-if="!$route.meta.keepAlive">
     <!-- 这里是不被缓存的视图组件 -->
    </router-view>

总结

以上所述是小编给大家介绍的vue实现前进刷新后退不刷新效果,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
javascript 设为首页与加入收藏兼容多浏览器代码
Jan 11 Javascript
多次注册事件会导致一个事件被触发多次的解决方法
Aug 12 Javascript
在页面中js获取光标/鼠标的坐标及光标的像素坐标
Nov 11 Javascript
DOM基础教程之使用DOM + Css
Jan 20 Javascript
js实现数字每三位加逗号的方法
Feb 05 Javascript
JS设置cookie、读取cookie、删除cookie
Apr 17 Javascript
jQuery的事件预绑定
Dec 05 Javascript
JS库之wow.js使用方法
Sep 14 Javascript
微信小程序中使用wxss加载图片并实现动画效果
Aug 13 Javascript
使用Angular-CLI构建NPM包的方法
Sep 07 Javascript
js模拟F11页面全屏显示
Sep 17 Javascript
简单了解Vue + ElementUI后台管理模板
Apr 07 Javascript
Vue2.5 结合 Element UI 之 Table 和 Pagination 组件实现分页功能
Jan 26 #Javascript
微信小程序实现图片压缩功能
Jan 26 #Javascript
js动态添加表格逐行添加、删除、遍历取值的实例代码
Jan 25 #Javascript
Laravel整合Bootstrap 4的完整方案(推荐)
Jan 25 #Javascript
jquery根据name取得select选中的值实例(超简单)
Jan 25 #jQuery
用jquery获取select标签中选中的option值及文本的示例
Jan 25 #jQuery
利用js给datalist或select动态添加option选项的方法
Jan 25 #Javascript
You might like
PHP中怎样保持SESSION不过期 原理及方案介绍
2013/08/08 PHP
Drupal7连接多个数据库及常见问题解决
2014/03/02 PHP
PHP利用百度ai实现文本和图片审核
2019/05/08 PHP
复制js对象方法(详解)
2013/07/08 Javascript
javascript获取xml节点的最大值(实现代码)
2013/12/11 Javascript
jquery下div 的resize事件示例代码
2014/03/09 Javascript
JS判断客户端是手机还是PC的2个代码
2014/04/12 Javascript
node+express+ejs制作简单页面上手指南
2014/11/26 Javascript
基于JQuery实现仿网易邮箱全屏动感滚动插件fullPage
2015/09/20 Javascript
跟我学习javascript的闭包
2015/11/16 Javascript
javascript实现的猜数小游戏完整实例代码
2016/05/10 Javascript
vue2.0的contextmenu右键弹出菜单的实例代码
2017/07/24 Javascript
jQuery使用动画队列自定义动画操作示例
2018/06/16 jQuery
vue组件挂载到全局方法的示例代码
2018/08/02 Javascript
element vue Array数组和Map对象的添加与删除操作
2018/11/14 Javascript
vue在路由中验证token是否存在的简单实现
2019/11/11 Javascript
javascript 使用sleep函数的常见方法详解
2020/04/26 Javascript
js面试题之异步问题的深入理解
2020/09/20 Javascript
python实现提取百度搜索结果的方法
2015/05/19 Python
浅谈五大Python Web框架
2017/03/20 Python
python 将列表中的字符串连接成一个长路径的方法
2018/10/23 Python
使用python对多个txt文件中的数据进行筛选的方法
2019/07/10 Python
django 信号调度机制详解
2019/07/19 Python
Python Django 前后端分离 API的方法
2019/08/28 Python
亚马逊中国官方网站:amazon.cn
2017/05/25 全球购物
澳大利亚领先的宠物用品商店:VetSupply
2017/09/08 全球购物
Auguste The Label官网:澳大利亚一家精品女装时尚品牌
2020/06/14 全球购物
PHP数据运算类型都有哪些
2013/11/05 面试题
PPP协议组成及简述协议协商的基本过程
2015/05/28 面试题
社区国庆节活动方案
2014/02/05 职场文书
会计学生自我鉴定
2014/02/06 职场文书
五四青年节的活动方案
2014/08/20 职场文书
股东授权委托书范文
2014/09/13 职场文书
鸟的天堂导游词
2015/01/31 职场文书
2016年秋季新学期致辞
2015/07/30 职场文书
javascript中Set、Map、WeakSet、WeakMap区别
2022/12/24 Javascript