vue单页缓存存在的问题及解决方案(小结)


Posted in Javascript onSeptember 25, 2018

1.css同名覆盖,解决方法:父组件加上scoped

<style lang="scss" scoped>
 @import './unbind.scss'
</style>

子组件同名样式加上deep

/deep/ .tabs-row {
  .items-wrp{
   padding-left: .34rem;
  }
  .item {
   margin:0 .12rem .16rem 0;
  }
 }

2.事件全局绑定

绑在window或document或body上的事件,切换到下一个页面同样会被触发,需要销毁,也防止内存泄漏,全局绑定的事件如果是公用组件慎用off().on(),因为可能引用的其他的组件全局绑定的事件被移除

destroyed:返回的时候会触发,防止返回到上一页时window上scroll被触发,官网上是推荐在beforeDestroy做事件移除或者新增DOM或移动DOM操作

deactivated:前进到新页面时会触发,防止进入下一页时window上scroll被触发

activated:被缓存的页面激活,即返回时被触发,created此时不会被触发,重新绑定事件

activated () {
  // 不直接绑定scroll,此处有限制
  this.bindEvent()
 },
 destroyed () {
  $(window).off('scroll', this.handleScrollFn)
 },
 deactivated () {
  $(window).off('scroll', this.handleScrollFn)
 },

3.音频续播

当音频在还在播放时,跳转到新的页面,此时音频仍在播放,解决方法:前进到新页面会触发deactivated钩子,此时暂停音频播放

deactivated () {
  // 前进时暂停音频播放
  this.pauseAudio()
 },
methods: {
  pauseAudio () {
   this.$refs.audioPlayer && this.$refs.audioPlayer.togglePlay()
  }
}

当音频在还在播放时,返回上一页,此时音频仍在播放,解决方法:返回会触发destroyed钩子里边关闭音频播放器

destroyed () {
  this.closeMini() //关闭音频播放器
 },
methods: {
  closeMini () {
   this.mode = -1
   this.play = false
   if (this.player) {
    this.player.pause()
   }
   this.$emit('callback', 'close')
  },
}

4.微信分享数据未更新

当返回上一页时,分享的数据没有更新,需要在激活的钩子里再次读取之前存的分享数据

activated () {
  // 单页缓存分享数据重置
  this.setShare(this.shareCache)
  window.addEventListener('scroll', this.finishReading)
 },
 methods: {
  setShare (opt) {
   if (!opt) return
   baike.setShare && baike.setShare(opt)
  //存该页的分享数据
   this.shareCache = opt 
  },
}

5.router.afterEach里上报pv时url未更新

在导航守卫afterEach里边上报,但是被触发时url还未更新,导致上报的参数有误,解决方法:通过to,from得到下一页,上一页的地址

var referrer = !from.name ? document.referrer :   
  `${location.origin}${from.fullPath}` // 通过from.name判断刷新

 var curUrl = `${location.origin}${to.fullPath}` || ''

6.hash改变时并不会触发router的守卫

代码中通过hash改变,监听hashchange来处理之后的逻辑,但是就不会触发router的导航守卫,也就是没有跳转,就不存在单页缓存

window.location.hash = '#refer'

解决办法:用replace替换url,相应的原来hashchange就不会监听到,需要把这块逻辑拿到created里边执行

this.$router.replace({path: `${location.pathname}${location.search}#refer`})

7.分享问题修复

单页缓存导致返回时分享的链接和自定义文案没有更新,针对特别处理的分享数据,在业务页面修改,解决方法

activated () {
  this.setShare(this.shareCache)
 },

 methods: {
  setShare (opt) {
   if (!opt) return
// xx.setShare封装的分享的底层方法
   xx.setShare && xx.setShare(opt)
   this.shareCache = opt
  }
}

针对普通分享页面,在router.afterEach里加 

router.afterEach((to, from) => {
 Vue.nextTick(() => {
  if (to.meta.notNeedShare) { //不需要分享的页面在路由配置文件里增加{meta: {notNeedShare:true}} 

if (window.WeixinJSBridge) {



 window.WeixinJSBridge.call('hideOptionMenu') 



} 


else { 



document.addEventListener('WeixinJSBridgeReady', () => { window.WeixinJSBridge.call('hideOptionMenu') })


 
}


}

 else { 


// 非分享自定义数据的页面处理 


 xx.setShare({ link: `${location.origin}${to.fullPath}` })
 }
 })
})

8.关注,收藏等toast提示在返回时未消失,因为延迟时间设置,解决方法:在路由钩子里边强制隐藏

router.afterEach((to, from) => {
 // 切换路由,有toast提示立刻隐藏
 xx.toast.hide()
})

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
asp javascript 实现关闭窗口时保存数据的办法
Nov 24 Javascript
javascript 保存文件到本地实现方法
Nov 29 Javascript
js清空form表单中的内容示例
May 20 Javascript
js树插件zTree获取所有选中节点数据的方法
Jan 28 Javascript
JS实现至少包含字母、大小写数字、字符的密码等级的两种方法
Feb 03 Javascript
全面了解JS中的匿名函数
Jun 29 Javascript
jquery计算出left和top,让一个div水平垂直居中的简单实例
Jul 13 Javascript
js控制台输出的方法(详解)
Nov 26 Javascript
BootStrap 图标icon符号图标glyphicons不正常显示的快速解决办法
Dec 08 Javascript
Vue如何实现组件的源码解析
Jun 08 Javascript
JS实现table表格内针对某列内容进行即时搜索筛选功能
May 11 Javascript
详解解决使用axios发送json后台接收不到的问题
Jun 27 Javascript
深入理解与使用keep-alive(配合router-view缓存整个路由页面)
Sep 25 #Javascript
使用vue2.0创建的项目的步骤方法
Sep 25 #Javascript
vue解决一个方法同时发送多个请求的问题
Sep 25 #Javascript
Vue2.0学习系列之项目上线的方法步骤(图文)
Sep 25 #Javascript
在vue中多次调用同一个定义全局变量的实例
Sep 25 #Javascript
vue观察模式浅析
Sep 25 #Javascript
详解搭建es6+devServer简单开发环境
Sep 25 #Javascript
You might like
简单的php写入数据库类代码分享
2011/07/26 PHP
PHP类与对象后期静态绑定操作实例详解
2018/12/20 PHP
javascript字符串拼接的效率问题
2010/12/25 Javascript
JQuery判断子iframe何时加载完成解决方案
2013/08/20 Javascript
jQuery快速上手:写jQuery与直接写JS的区别详细解析
2013/08/26 Javascript
js实现字符串的16进制编码不加密
2014/04/25 Javascript
jQuery实现简单的日期输入格式化控件
2015/03/12 Javascript
全面了解JavaScirpt 的垃圾(garbage collection)回收机制
2016/07/11 Javascript
JS中BOM相关知识点总结(必看篇)
2016/11/22 Javascript
JS函数多个参数默认值指定方法分析
2016/11/28 Javascript
.net MVC+Bootstrap下使用localResizeIMG上传图片
2017/04/21 Javascript
socket.io学习教程之基础介绍(一)
2017/04/29 Javascript
JS实现的随机排序功能算法示例
2017/06/09 Javascript
AngularJS  ng-repeat遍历输出的用法
2017/06/19 Javascript
AngularJS实现表单元素值绑定操作示例
2017/10/11 Javascript
详解CommonJS和ES6模块循环加载处理的区别
2018/12/26 Javascript
微信小程序—setTimeOut定时器的问题及解决
2019/07/26 Javascript
Vue+Element-UI实现上传图片并压缩
2019/11/26 Javascript
vue实现输入一位数字转汉字功能
2019/12/13 Javascript
[08:44]和酒神一起战斗 DOTA2教你做大人
2014/03/27 DOTA
python之wxPython菜单使用详解
2014/09/28 Python
Python 正则表达式入门(中级篇)
2016/12/07 Python
Python做简单的字符串匹配详解
2017/03/21 Python
Python只用40行代码编写的计算器实例
2017/05/10 Python
python的paramiko模块实现远程控制和传输示例
2017/10/13 Python
python中如何进行连乘计算
2020/05/28 Python
matplotlib部件之套索Lasso的使用
2021/02/24 Python
HTML5在a标签内放置块级元素示例代码
2013/08/23 HTML / CSS
FC-Moto美国:欧洲最大的摩托车服装和头盔商店之一
2019/08/24 全球购物
自动化专业个人求职信范文
2013/11/29 职场文书
主题酒店策划书
2014/01/28 职场文书
工程力学专业自荐信范文
2014/03/17 职场文书
新年联欢会主持词
2014/03/27 职场文书
优秀班主任材料
2014/12/16 职场文书
因身体原因离职的辞职信范文
2015/05/12 职场文书
女人创业励志语录,句句蕴含能量,激发你的潜能
2019/08/20 职场文书