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 相关文章推荐
取得一定长度的内容,处理中文
Dec 20 Javascript
网页中实现浏览器的最大,最小化和关闭按钮
Mar 12 Javascript
js将控件隐藏及display属性的使用介绍
Dec 30 Javascript
使用JavaScript获取电池状态的方法
May 03 Javascript
Javascript基础教程之argument 详解
Jan 18 Javascript
jquery插件bootstrapValidator表单验证详解
Dec 15 Javascript
vue+node+webpack环境搭建教程
Nov 05 Javascript
Angular4 ElementRef的应用
Feb 26 Javascript
vue中tab选项卡的实现思路
Nov 25 Javascript
JS实现表单中点击小眼睛显示隐藏密码框中的密码
Apr 13 Javascript
html中创建并调用vue组件的几种方法汇总
Nov 17 Javascript
小程序组件传值和引入sass的方法(使用vant Weapp组件库)
Nov 24 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 模拟GMAIL,HOTMAIL(MSN),YAHOO,163,126邮箱登录的详细介绍
2013/06/18 PHP
php实现简易聊天室应用代码
2015/09/23 PHP
WordPress开发中的get_post_custom()函数使用解析
2016/01/04 PHP
Smarty模板语法详解
2019/07/20 PHP
win10下 php安装seaslog扩展的详细步骤
2020/12/04 PHP
jquery 打开窗口返回值实现代码
2010/03/04 Javascript
Pro JavaScript Techniques学习笔记
2010/12/28 Javascript
js将当前时间格式转换成时间搓(自写)
2013/09/26 Javascript
文本框回车提交与禁止提交示例
2013/09/27 Javascript
易操作的jQuery表单提示插件
2015/12/01 Javascript
javascript结合Flexbox简单实现滑动拼图游戏
2016/02/18 Javascript
移动端点击图片放大特效PhotoSwipe.js插件实现
2016/08/25 Javascript
微信小程序 input输入框控件详解及实例(多种示例)
2016/12/14 Javascript
当vue路由变化时,改变导航栏的样式方法
2018/08/22 Javascript
微信小程序自定义波浪组件使用方法详解
2019/09/21 Javascript
如何使用Jquery动态生成二级选项列表
2020/02/06 jQuery
vue动画—通过钩子函数实现半场动画操作
2020/08/09 Javascript
解决vue axios跨域 Request Method: OPTIONS问题(预检请求)
2020/08/14 Javascript
jQuery实现异步上传一个或多个文件
2020/08/17 jQuery
js 将多个对象合并成一个对象 assign方法的实现
2020/09/24 Javascript
[48:47]VGJ.S vs NB 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Linux下使用python自动修改本机网关代码分享
2015/05/21 Python
分享一个可以生成各种进制格式IP的小工具实例代码
2017/07/28 Python
Python中format()格式输出全解
2019/04/12 Python
使用Python和Scribus创建一个RGB立方体的方法
2019/07/17 Python
python实现树的深度优先遍历与广度优先遍历详解
2019/10/26 Python
在django admin详情表单显示中添加自定义控件的实现
2020/03/11 Python
Python confluent kafka客户端配置kerberos认证流程详解
2020/10/12 Python
如何用 Python 制作 GitHub 消息助手
2021/02/20 Python
售后服务承诺书模板
2014/05/21 职场文书
优秀护士事迹材料
2014/12/25 职场文书
2015年平安创建工作总结
2015/04/29 职场文书
食品药品安全责任书
2015/05/11 职场文书
2019年亲子运动会口号
2019/10/11 职场文书
Java面试题冲刺第十五天--设计模式
2021/08/07 面试题
Win11无法安装更新补丁KB3045316怎么办 附KB3045316补丁修复教程
2022/08/14 数码科技