详解如何探测小程序返回到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 相关文章推荐
jQuery的slideToggle方法实例
May 07 Javascript
jQuery.extend()、jQuery.fn.extend()扩展方法示例详解
May 08 Javascript
JavaScript的作用域和块级作用域概念理解
Sep 21 Javascript
BootStrap3学习笔记(一)之网格系统
May 20 Javascript
动态生成的DOM不会触发onclick事件的原因及解决方法
Aug 06 Javascript
BootStrap+Angularjs+NgDialog实现模式对话框
Aug 24 Javascript
Javascript获取图片原始宽度和高度的方法详解
Sep 20 Javascript
微信公众号-获取用户信息(网页授权获取)实现步骤
Oct 21 Javascript
还不懂递归?读完这篇文章保证你会懂
Jul 29 Javascript
vue 点击按钮增加一行的方法
Sep 07 Javascript
React组件对子组件children进行加强的方法
Jun 23 Javascript
vue实现购物车选择功能
Jan 10 Javascript
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的面向对象编程
2006/10/09 PHP
PHP无限分类的类
2007/01/02 PHP
创建配置文件 用PHP写出自己的BLOG系统 2
2010/04/12 PHP
Using the TextRange Object
2006/10/14 Javascript
JavaScript 全角转半角部分
2009/10/28 Javascript
读jQuery之一(对象的组成)
2011/06/11 Javascript
jquery实现智能感知连接外网搜索
2013/05/21 Javascript
JavaScript实现网页上的浮动广告的简单方法
2013/06/14 Javascript
JavaScript中Function()函数的使用教程
2015/06/04 Javascript
基于jQuery实现音乐播放试听列表
2016/04/14 Javascript
jQuery弹出遮罩层效果完整示例
2016/09/13 Javascript
JavaScript下拉菜单功能实例代码
2017/03/01 Javascript
解决vue this.$forceUpdate() 处理页面刷新问题(v-for循环值刷新等)
2018/07/26 Javascript
angular学习之动态创建表单的方法
2018/12/07 Javascript
基于element-ui封装可搜索的懒加载tree组件的实现
2020/05/22 Javascript
[01:02:02]DOTA2上海特级锦标赛A组败者赛 EHOME VS CDEC第二局
2016/02/25 DOTA
python字符串中的单双引
2017/02/16 Python
使用python爬虫实现网络股票信息爬取的demo
2018/01/05 Python
使用PYTHON解析Wireshark的PCAP文件方法
2019/07/23 Python
python multiprocessing模块用法及原理介绍
2019/08/20 Python
python实现发送form-data数据的方法详解
2019/09/27 Python
python hash每次调用结果不同的原因
2019/11/21 Python
完美解决keras保存好的model不能成功加载问题
2020/06/11 Python
Django自定义YamlField实现过程解析
2020/11/11 Python
python中altair可视化库实例用法
2021/01/26 Python
CSS3 animation实现简易幻灯片轮播特效
2016/09/27 HTML / CSS
美国眼镜网站:EyeBuyDirect
2017/04/13 全球购物
Java中compareTo和compare的区别
2016/04/12 面试题
第二层交换机和路由器的区别?第三层交换机和路由器的区别?
2013/05/23 面试题
成人毕业生自我鉴定
2013/10/18 职场文书
八一建军节活动方案
2014/02/10 职场文书
企业文化宣传标语
2014/06/09 职场文书
校园安全广播稿范文
2014/09/25 职场文书
2015年行政人事部工作总结
2015/05/13 职场文书
新手入门Mysql--概念
2021/06/18 MySQL
修改并编译golang源码的操作步骤
2021/07/25 Golang