小程序使用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实现的一个Flash滚动轮换显示图片代码生成器
Mar 14 Javascript
用JavaScript将从数据库中读取出来的日期型格式化为想要的类型。
Aug 15 Javascript
jQuery的DOM操作之删除节点示例
Jan 03 Javascript
table行随鼠标移动变色示例
May 07 Javascript
JavaScript学习笔记之Function对象
Jan 22 Javascript
JS实现让网页背景图片斜向移动的方法
Feb 25 Javascript
JS简单实现自定义右键菜单实例
May 31 Javascript
浅谈使用React.setState需要注意的三点
Dec 18 Javascript
jQuery实现定时隐藏对话框的方法分析
Feb 12 jQuery
深入浅出理解JavaScript高级定时器原理与用法
Aug 02 Javascript
用WebStorm进行Angularjs 2开发(环境篇:Windows 10,Angular-cli方式)
Dec 05 Javascript
JSX在render函数中的应用详解
Sep 04 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
微信公众平台网页授权获取用户基本信息中授权回调域名设置的变动
2014/10/21 PHP
PHP实现linux命令tail -f
2016/02/22 PHP
TP5框架实现一次选择多张图片并预览的方法示例
2020/04/04 PHP
JS实现OCX控件的事件响应示例
2014/09/17 Javascript
javascript实现PC网页里的拖拽效果
2016/03/14 Javascript
jQuery 3.0十大新特性最终版发布
2016/07/14 Javascript
轻松5句话解决JavaScript的作用域
2016/07/15 Javascript
使用JS中的exec()方法构造正则表达式验证
2016/08/01 Javascript
jQuery过滤选择器用法示例
2016/09/12 Javascript
你真的了解BOM中的history对象吗
2017/02/13 Javascript
jQuery插件HighCharts实现的2D堆条状图效果示例【附demo源码下载】
2017/03/14 Javascript
Angular.js中ng-include用法及多标签页面的实现方式详解
2017/05/07 Javascript
Node实战之不同环境下配置文件使用教程
2018/01/02 Javascript
利用Console来Debug的10个高级技巧汇总
2018/03/26 Javascript
原生JS检测CSS3动画是否结束的方法详解
2019/01/27 Javascript
高效jQuery选择器的5个技巧实例分析
2019/11/26 jQuery
Vue使用screenfull实现全屏效果
2020/09/17 Javascript
python不带重复的全排列代码
2013/08/13 Python
详解在Python的Django框架中创建模板库的方法
2015/07/20 Python
Python常用字符串替换函数strip、replace及sub用法示例
2018/05/21 Python
python list格式数据excel导出方法
2018/10/31 Python
python关于矩阵重复赋值覆盖问题的解决方法
2019/07/19 Python
使用Python3 poplib模块删除服务器多天前的邮件实现代码
2020/04/24 Python
纯HTML5+CSS3制作图片旋转
2016/01/12 HTML / CSS
携程旅行网:中国领先的在线旅行服务公司
2017/02/17 全球购物
Bergfreunde丹麦:登山装备网上零售商
2017/02/26 全球购物
Skyscanner新西兰:全球领先的旅游搜索网站
2019/08/26 全球购物
Herschel美国官网:背包、手提袋及配件
2020/03/10 全球购物
秘书英文求职信范文
2014/01/31 职场文书
民事诉讼授权委托书范文
2014/08/02 职场文书
大学生学生会工作总结2015
2015/05/26 职场文书
2015年秋季开学典礼校长致辞
2015/07/16 职场文书
九不准学习心得体会
2016/01/23 职场文书
2019年最新感恩节祝福语(28句)
2019/11/27 职场文书
Matlab如何实现矩阵复制扩充
2021/06/02 Python
CSS中理解层叠性及权重如何分配
2022/12/24 HTML / CSS