小程序使用watch监听数据变化的方法详解


Posted in Javascript onSeptember 20, 2019

众所周知,Vue中,可以使用监听属性 watch来观察和响应 Vue 实例上的数据变化,那么小程序能不能实现这一点呢?

监听器的原理,是将data中需监听的数据写在watch对象中,并给其提供一个方法,当被监听的数据的值改变时,调用该方法。​​

我们需要用到Javascript中的Object.defineProperty()方法,来手动劫持对象的getter/setter,从而实现给对象赋值时(调用setter),执行watch对象中相对应的函数,达到监听效果。

Object.defineProperty()方法,会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象。

这里假定有多个页面需要监听需求,把监听方法写在app.js中,以便全局调用

onLaunch: function () {},
// 设置监听器
watch: function (ctx, obj) {
 Object.keys(obj).forEach(key => {
  this.observer(ctx.data, key, ctx.data[key], function (value) {
   obj[key].call(ctx, value)
  })
 })
},
// 监听属性,并执行监听函数
observer: function (data, key, val, fn) {
 Object.defineProperty(data, key, {
  configurable: true,
  enumerable: true,
  get: function () {
   return val
  },
  set: function (newVal) {
   if (newVal === val) return
   fn && fn(newVal)
   val = newVal
  },
 })
}

然后,在需要监听的页面onLoad中,调用watch方法(其中test是要监听的数据,当test在其他方法中通过this.setData赋值后,watch就能监听到test的变化了)

const app = getApp()
Page({
 data: {
  test: 0
 },
 onLoad: function () {
  // 调用监听器,监听数据变化
  app.watch(this, {
   test: function (newVal) {
    console.log(newVal)
   }
  })
 }

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

Javascript 相关文章推荐
js中一个函数获取另一个函数返回值问题探讨
Nov 21 Javascript
jQuery中index()的用法分析
Sep 05 Javascript
JavaScript中实现PHP的打乱数组函数shuffle实例
Oct 11 Javascript
jQuery中extend函数的实现原理详解
Feb 03 Javascript
js实现固定显示区域内自动缩放图片的方法
Jul 18 Javascript
jQuery animate和CSS3相结合实现缓动追逐效果附源码下载
Apr 18 Javascript
js利用正则表达式检验输入内容是否为网址
Jul 05 Javascript
JS实现合并json对象的方法
Oct 10 Javascript
使用angular-cli webpack创建多个包的方法
Oct 16 Javascript
vue实现双向绑定和依赖收集遇到的坑
Nov 29 Javascript
在vue项目中引入highcharts图表的方法
Jan 21 Javascript
解决vue项目运行npm run serve报错的问题
Oct 26 Javascript
基于layui内置模块(element常用元素的操作)
Sep 20 #Javascript
解决Layui中templet中a的onclick参数传递的问题
Sep 20 #Javascript
解决layui动态添加的元素click等事件触发不了的问题
Sep 20 #Javascript
微信小程序里引入SVG矢量图标的方法
Sep 20 #Javascript
微信小程序实现图片翻转效果的实例代码
Sep 20 #Javascript
vue实现直播间点赞飘心效果的示例代码
Sep 20 #Javascript
vue+layui实现select动态加载后台数据的例子
Sep 20 #Javascript
You might like
php empty函数 使用说明
2009/08/10 PHP
php file_get_contents函数轻松采集html数据
2010/04/22 PHP
php下通过伪造http头破解防盗链的代码
2010/07/03 PHP
table标签的结构与合并单元格的实现方法
2013/07/24 PHP
destoon之一键登录设置
2014/06/21 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十)
2014/06/24 PHP
PHP连接SQLServer2005的方法
2015/01/27 PHP
php的闭包(Closure)匿名函数初探
2016/02/14 PHP
php实现头像上传预览功能
2017/04/27 PHP
关于Laravel参数验证的一些疑与惑
2019/11/19 PHP
给jqGrid数据行添加修改和删除操作链接(之一)
2011/11/04 Javascript
Android中资源文件(非代码部分)的使用概览
2012/12/18 Javascript
jquery实现商品拖动选择效果代码(自写)
2013/05/28 Javascript
用jquery.sortElements实现table排序
2014/05/04 Javascript
node.js抓取并分析网页内容有无特殊内容的js文件
2015/11/17 Javascript
JavaScript实现时间表动态效果
2017/07/15 Javascript
es6数据变更同步到视图层的方法
2019/03/04 Javascript
深入了解JavaScript代码覆盖
2019/06/13 Javascript
Node.js爬虫如何获取天气和每日问候详解
2019/08/26 Javascript
Python黑魔法Descriptor描述符的实例解析
2016/06/02 Python
Python命令启动Web服务器实例详解
2017/02/23 Python
pandas Dataframe行列读取的实例
2018/06/08 Python
Python subprocess模块常见用法分析
2018/06/12 Python
解决Python pandas plot输出图形中显示中文乱码问题
2018/12/12 Python
pytorch permute维度转换方法
2018/12/14 Python
Python实例方法、类方法、静态方法区别详解
2020/09/05 Python
利用css3制作3D样式按钮实现代码
2013/03/18 HTML / CSS
abstract class和interface有什么区别?
2012/01/03 面试题
介绍一下代理模式(Proxy)
2014/10/17 面试题
2014年会计工作总结
2014/11/27 职场文书
综合办公室岗位职责
2015/04/11 职场文书
乡镇科协工作总结2015
2015/05/19 职场文书
2015年暑假生活总结
2015/07/13 职场文书
旅游安全责任协议书
2016/03/22 职场文书
Python实现文本文件拆分写入到多个文本文件的方法
2021/04/18 Python
Pandas-DataFrame知识点汇总
2022/03/16 Python