小程序使用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获取checkbox复选框选中的选项实例
Aug 24 Javascript
jQuery横向擦除焦点图特效代码分享
Sep 06 Javascript
Vuejs第十二篇之动态组件全面解析
Sep 09 Javascript
JS控制页面跳转时未请求要跳转的地址怎么回事
Oct 14 Javascript
详解js的六大数据类型
Dec 27 Javascript
bootstrapValidator.min.js表单验证插件
Feb 09 Javascript
jQuery Ajax前后端使用JSON进行交互示例
Mar 17 Javascript
微信小程序中使用wxss加载图片并实现动画效果
Aug 13 Javascript
Vue利用History记录上一页面的数据方法实例
Nov 02 Javascript
Node.js从字符串生成文件流的实现方法
Aug 18 Javascript
layui加载数据显示loading加载完成loading消失的实例代码
Sep 23 Javascript
详解node登录接口之密码错误限制次数(含代码)
Oct 25 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
基于ubuntu下nginx+php+mysql安装配置的具体操作步骤
2013/04/28 PHP
完美解决令人抓狂的zend studio 7代码提示(content Assist)速度慢的问题
2013/06/20 PHP
php输出金字塔的2种实现方法
2014/12/16 PHP
关于PHP5.6+版本“No input file specified”问题的解决
2019/12/11 PHP
图片连续滚动代码[兼容IE/firefox]
2009/06/11 Javascript
javascript 面向对象编程 万物皆对象
2009/09/17 Javascript
url 编码 js url传参中文乱码解决方案
2010/04/11 Javascript
加载远程图片时,经常因为缓存而得不到更新的解决方法(分享)
2013/06/26 Javascript
js解决弹窗问题实现班级跳转DIV示例
2014/01/06 Javascript
JS中数组Array的用法示例介绍
2014/02/20 Javascript
使用nodejs、Python写的一个简易HTTP静态文件服务器
2014/07/18 NodeJs
js调试工具Console命令详解
2014/10/21 Javascript
移动设备web开发首选框架:zeptojs介绍
2015/01/29 Javascript
javascript 实现map集合
2015/04/03 Javascript
理解javascript中DOM事件
2015/12/25 Javascript
JavaScript实现简单图片轮播效果
2017/08/21 Javascript
vue解决一个方法同时发送多个请求的问题
2018/09/25 Javascript
vue接入腾讯防水墙代码
2019/05/07 Javascript
JS获取当前时间的年月日时分秒及时间的格式化的方法
2019/12/18 Javascript
VUE项目axios请求头更改Content-Type操作
2020/07/24 Javascript
简单文件操作python 修改文件指定行的方法
2013/05/15 Python
Python3 Random模块代码详解
2017/12/04 Python
Python爬虫获取整个站点中的所有外部链接代码示例
2017/12/26 Python
wxPython的安装图文教程(Windows)
2017/12/28 Python
微信跳一跳python代码实现
2018/01/05 Python
python 中值滤波,椒盐去噪,图片增强实例
2019/12/18 Python
django ajax发送post请求的两种方法
2020/01/05 Python
python实现秒杀商品的微信自动提醒功能(代码详解)
2020/04/27 Python
Urban Outfitters英国官网:美国平价服饰品牌
2016/11/25 全球购物
Merchant 1948澳大利亚:新西兰领先的鞋类和靴子供应商
2018/03/24 全球购物
AJAX的优缺点都有什么
2015/08/18 面试题
酒店保安领班职务说明书
2014/03/04 职场文书
学校教研活动总结
2014/07/02 职场文书
法人委托书
2014/07/31 职场文书
小学生心理健康活动总结
2015/05/08 职场文书
酒桌上的祝酒词
2015/08/12 职场文书