详解如何探测小程序返回到webview页面


Posted in Javascript onMay 14, 2019

在公司项目中经常会遇到一个场景, 尝试过各种不同的方法, 最后想到了一种很技术上简单且可行的方法.

经常被QA同学反应同一类型的问题

项目是小程序(wepy), 部分页面使用webview(vue). 经常会遇见一个场景: 当小程序navigateTo到一些页面对用户的"收藏状态", "身材细节"做了修改后, 用户点击返回按钮回到上一个页面, 收藏的状态或是身材细节没有改变.

那是当然的, 作为一个小程序中的webview, api相当有限, 没有一个事件可以让网页触发重新渲染动作, 轮询更是不理智的表面功夫.

我们试过绑定blur和click事件来模拟事件, 试过从业务逻辑上加入一些时间点检查状态, 最后才想到个技术简单, 操作简单的解决方案.

解决方法

第一步, 在小程序webview绑定的url上加上时间戳.

<web-view src="{{url}}"/>
onShow () {
 this.url = ${base_url}?ts=Date.now()
}

第二步, 在html里监听query变化. 我遇到问题的项目使用的是vue.

watch: {
  '$route.query.ts': function () {
  this.fetchData()
  this.patchRender() // 获取数据, 重新渲染变化的部分
  }
 }

这样就解决了触发退回到webview的事件探测问题, 剩下的只要根据业务来重新渲染可能变化的部分就行了.

更多

小程序的部分每次都需要改变url的query参数没有办法, 但是对vue设计这么良好的框架还有一定改良空间.

我们可以把这串代码写到mixin里, 对性能有些小影响, 但方法没写也不会去执行, 只是在不需要的页面上多了个observer.

Vue.use(function () {
 Vue.mixin({
 watch: {
  '$route.query.ts': function () {
  this.$options.onShow && this.$options.onShow.call(this)
  }
 }
 })
})

那么在vue页面中就省去了写watch的麻烦, 直接像小程序那样写onShow方法就行了.

onShow () {
 this.fetchData()
 this.patchRender() 
 },
 methods: {
 fetchData () {//...}
 }

总结, 使用了这个方法如需再添加需要探测onShow事件的页面, 只需要:

小程序webview的url在onShow的时候修改ts参数

在vue文件里添加onShow方法, 进行业务操作. (方法里的this是正常指向vm的)

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

Javascript 相关文章推荐
js如何获取object类型里的键值
Feb 18 Javascript
轻松掌握JavaScript代理模式
Aug 26 Javascript
JavaScript闭包和范围实例详解
Dec 19 Javascript
JS简单实现表格排序功能示例
Dec 20 Javascript
基于vue.js中事件修饰符.self的用法(详解)
Feb 23 Javascript
Vue微信项目按需授权登录策略实践思路详解
May 07 Javascript
js遍历添加栏目类添加css 再点击其它删除css【推荐】
Jun 12 Javascript
在vue 中使用 less的教程详解
Sep 26 Javascript
JQuery实现ajax请求的示例和注意事项
Dec 10 jQuery
详解小程序云开发数据库
May 20 Javascript
微信小程序iOS下拉白屏晃动问题解决方案
Oct 12 Javascript
ant design vue的form表单取值方法
Jun 01 Vue.js
JQuery获取元素尺寸、位置及页面滚动事件应用示例
May 14 #jQuery
javascript实现遮罩层动态效果实例
May 14 #Javascript
JQuery animate动画应用示例
May 14 #jQuery
微信小程序的线程架构【推荐】
May 14 #Javascript
jquery实现选项卡切换代码实例
May 14 #jQuery
Vue表单之v-model绑定下拉列表功能
May 14 #Javascript
JQuery样式操作、click事件以及索引值-选项卡应用示例
May 14 #jQuery
You might like
php_xmlhttp 乱码问题解决方法
2009/08/07 PHP
ThinkPHP跳转页success及error模板实例教程
2014/07/17 PHP
PHP中is_file()函数使用指南
2015/05/08 PHP
总结PHP删除字符串最后一个字符的三种方法
2016/08/30 PHP
利用php获得flv视频长度的实例代码
2017/10/26 PHP
PHP命令Command模式用法实例分析
2018/08/08 PHP
使用jQuery模板来展现json数据的代码
2010/10/22 Javascript
js Math 对象的方法
2013/09/01 Javascript
js截取固定长度的中英文字符的简单实例
2013/11/22 Javascript
全面了解JavaScript的数据类型转换
2016/07/01 Javascript
纯JavaScript 实现flappy bird小游戏实例代码
2016/09/27 Javascript
Javascript中字符串replace方法的第二个参数探究
2016/12/05 Javascript
JQuery中Ajax的操作完整例子
2017/03/07 Javascript
jQuery EasyUI window窗口使用实例代码
2017/12/25 jQuery
vue将毫秒数转化为正常日期格式的实例
2018/09/16 Javascript
VUE v-for循环中每个item节点动态绑定不同函数的实例
2018/09/26 Javascript
js实现省级联动(数据结构优化)
2020/07/17 Javascript
python操作mysql中文显示乱码的解决方法
2014/10/11 Python
Python中用于检查英文字母大写的isupper()方法
2015/05/19 Python
Python的Socket编程过程中实现UDP端口复用的实例分享
2016/03/19 Python
Python中将字典转换为列表的方法
2016/09/21 Python
对python中的pop函数和append函数详解
2018/05/04 Python
python3 map函数和filter函数详解
2019/08/26 Python
Python编程快速上手——strip()函数的正则表达式实现方法分析
2020/02/29 Python
matplotlib对象拾取事件处理的实现
2021/01/14 Python
土耳其家居建材网站:Koçtaş
2016/11/22 全球购物
30岁生日感言
2014/01/25 职场文书
淘宝中秋节活动方案
2014/01/31 职场文书
迎元旦广播稿
2014/02/22 职场文书
保安队长职务说明书
2014/02/23 职场文书
餐饮总经理岗位职责
2014/03/07 职场文书
英语专业毕业生求职信
2014/05/24 职场文书
公安机关纪律作风整顿个人剖析材料材料
2014/10/10 职场文书
农村老人去世追悼词
2015/06/23 职场文书
教你用Java在个人电脑上实现微信扫码支付
2021/06/13 Java/Android
68行Python代码实现带难度升级的贪吃蛇
2022/01/18 Python