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 相关文章推荐
Mootools 1.2教程 设置和获取样式表属性
Sep 15 Javascript
微博@符号的用户名提示效果。(想@到谁?)
Nov 05 Javascript
js自执行函数的几种不同写法的比较
Aug 16 Javascript
IE6-IE9不支持table.innerHTML的解决方法分享
Sep 14 Javascript
解析浏览器端的AJAX缓存机制
Jun 21 Javascript
全面解析标签页的切换方式
Aug 21 Javascript
bootstrap实现图片自动轮播
Dec 21 Javascript
javascript数组去重常用方法实例分析
Apr 11 Javascript
vue登录注册及token验证实现代码
Dec 14 Javascript
Vue项目pdf(base64)转图片遇到的问题及解决方法
Oct 19 Javascript
浅析vue 函数配置项watch及函数 $watch 源码分享
Nov 22 Javascript
微信小程序云开发实现数据添加、查询和分页
May 17 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 is_dir() 判断给定文件名是否是一个目录
2010/05/10 PHP
PHP多例模式介绍
2013/06/24 PHP
Laravel模板引擎Blade中section的一些标签的区别介绍
2015/02/10 PHP
thinkphp5.0自定义验证规则使用方法
2017/11/16 PHP
laravel 解决Validator使用中出现的问题
2019/10/25 PHP
限制textbox或textarea输入字符长度的JS代码
2013/10/16 Javascript
javascript 常用验证函数总结
2016/06/28 Javascript
easyui datagrid 大数据加载效率慢,优化解决方法(推荐)
2016/11/09 Javascript
Ajax验证用户名或昵称是否已被注册
2017/04/05 Javascript
mpvue小程序循环动画开启暂停的实现方法
2019/05/15 Javascript
vue-router源码之history类的浅析
2019/05/21 Javascript
使用Webpack提升Vue.js应用程序的4种方法(翻译)
2019/10/09 Javascript
深入解读VUE中的异步渲染的实现
2020/06/19 Javascript
vue+iview使用树形控件的具体使用
2020/11/02 Javascript
Python使用py2exe打包程序介绍
2014/11/20 Python
Python Tkinter GUI编程入门介绍
2015/03/10 Python
Python之os操作方法(详解)
2017/06/15 Python
python简单商城购物车实例代码
2018/03/15 Python
Python小工具之消耗系统指定大小内存的方法
2018/12/03 Python
Python统计一个字符串中每个字符出现了多少次的方法【字符串转换为列表再统计】
2019/05/05 Python
Django框架视图层URL映射与反向解析实例分析
2019/07/29 Python
Python3.6+selenium2.53.6自动化测试_读取excel文件的方法
2019/09/06 Python
Python中Subprocess的不同函数解析
2019/12/10 Python
新年福利来一波之Python轻松集齐五福(demo)
2020/01/20 Python
最小二乘法及其python实现详解
2020/02/24 Python
Python中格式化字符串的四种实现
2020/05/26 Python
Python爬虫中Selenium实现文件上传
2020/12/04 Python
浅谈cookie和localStorage那些事
2019/08/27 HTML / CSS
HTML5实现移动端复制功能
2018/04/19 HTML / CSS
美国Max仓库:Max Warehouse
2020/05/31 全球购物
索引覆盖(Index Covering)查询含义
2012/02/18 面试题
生物制药毕业生自荐信
2013/10/16 职场文书
2015年学校教育教学工作总结
2015/04/22 职场文书
二十年同学聚会致辞
2015/07/28 职场文书
驾驶员安全责任协议书
2016/03/22 职场文书
如何利用Python实现n*n螺旋矩阵
2022/01/18 Python