小程序使用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 相关文章推荐
JavaScript 图片预览效果 推荐
Dec 22 Javascript
JavaScript输出当前时间Unix时间戳的方法
Apr 06 Javascript
JavaScript中Function函数与Object对象的关系
Dec 17 Javascript
基于jquery实现智能表单验证操作
May 09 Javascript
jQuery表单验证简单示例
Oct 17 Javascript
AngularJS使用angular.bootstrap完成模块手动加载的方法分析
Jan 19 Javascript
JavaScript实现开关等效果
Sep 08 Javascript
小程序实现列表多个批量倒计时
Jan 29 Javascript
Vuex中实现数据状态查询与更改
Nov 08 Javascript
JS操作Fckeditor的一些常用方法(获取、插入等)
Feb 19 Javascript
JavaScript实现页面高亮操作提示和蒙板
Jan 04 Javascript
vue 给数组添加新对象并赋值
Apr 20 Vue.js
基于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中Cannot send session cache limiter 的问题的方法
2007/04/27 PHP
apache rewrite_module模块使用教程
2008/01/10 PHP
PHP中strtotime函数使用方法详解
2011/11/27 PHP
PHP以及MYSQL日期比较方法
2012/11/29 PHP
php简单的上传类分享
2016/05/15 PHP
Thinkphp5框架ajax接口实现方法分析
2019/08/28 PHP
JQuery live函数
2010/12/24 Javascript
js三种排序算法分享
2012/08/16 Javascript
js 延迟加载 改变JS的位置加快网页加载速度
2012/12/11 Javascript
jquery获取焦点和失去焦点事件代码
2013/04/21 Javascript
网页中可关闭的漂浮窗口实现可自行调节
2013/08/20 Javascript
javascript中负数算术右移、逻辑右移的奥秘探索
2013/10/17 Javascript
jqgrid 表格数据导出实例
2013/11/21 Javascript
javascript实现微信分享
2014/12/23 Javascript
javaScript中slice函数用法实例分析
2015/06/08 Javascript
在Node.js中使用HTTP上传文件的方法
2015/06/23 Javascript
javascript实现的闭包简单实例
2015/07/17 Javascript
jQuery四种选择器使用及示例
2016/06/05 Javascript
JS实现探测网站链接的方法【测试可用】
2016/11/08 Javascript
ES6学习之变量的解构赋值
2017/02/12 Javascript
vue中七牛插件使用的实例代码
2017/07/28 Javascript
BootStrap点击保存后实现模态框自动关闭的思路(模态框)
2017/09/26 Javascript
JS定义函数的几种常用方法小结
2019/05/23 Javascript
element日历calendar组件上月、今天、下月、日历块点击事件及模板源码
2020/07/27 Javascript
JS常用跨域方法实现原理解析
2020/12/09 Javascript
[08:17]Ti9 现场cosplay
2019/09/10 DOTA
酷! 程序员用Python带你玩转冲顶大会
2018/01/17 Python
pygame游戏之旅 按钮上添加文字的方法
2018/11/21 Python
浅析NumPy 切片和索引
2020/09/02 Python
澳大利亚体育和露营装备在线/实体零售商:Find Sports
2020/06/03 全球购物
颇特女士香港官网:NET-A-PORTER香港
2021/03/08 全球购物
PHP如何设置和取得Cookie值
2015/06/30 面试题
师德模范事迹材料
2014/06/03 职场文书
机动车登记业务委托书
2014/10/08 职场文书
辞职信的写法
2015/02/27 职场文书
解决hive中导入text文件遇到的坑
2021/04/07 Python