小程序使用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入门基础 document.write输出
Feb 22 Javascript
jQuery实现隔行背景色变色
Nov 24 Javascript
2014 HTML5/CSS3热门动画特效TOP10
Dec 07 Javascript
深入理解JavaScript系列(43):设计模式之状态模式详解
Mar 04 Javascript
javascript简单实现滑动菜单效果的方法
Jul 27 Javascript
javascript图片切换综合实例(循环切换、顺序切换)
Jan 13 Javascript
JavaScript中Object.prototype.toString方法的原理
Feb 24 Javascript
AngularJS中ng-class用法实例分析
Jul 06 Javascript
Angularjs按需查询实例代码
Oct 30 Javascript
详解操作虚拟dom模拟react视图渲染
Jul 25 Javascript
Vue.js图片预览插件使用详解
Aug 27 Javascript
jquery选择器和属性对象的操作实例分析
Jan 10 jQuery
基于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导出到Excel或CSV的详解(附utf8、gbk 编码转换)
2013/06/25 PHP
Zend Framework教程之Autoloading用法详解
2016/03/08 PHP
php插入含有特殊符号数据的处理方法
2016/11/24 PHP
详解PHP处理密码的几种方式
2016/11/30 PHP
JQuery SELECT单选模拟jQuery.select.js
2009/11/12 Javascript
jQuery Deferred和Promise创建响应式应用程序详细介绍
2013/03/05 Javascript
JavaScript获取onclick、onchange等事件值的代码
2013/07/22 Javascript
javascript基本类型详解
2014/11/28 Javascript
jQuery中animate用法实例分析
2015/03/09 Javascript
jQuery右侧选项卡焦点图片轮播特效代码分享
2015/09/05 Javascript
javascript创建对象的几种模式介绍
2016/05/06 Javascript
JavaScript toUpperCase()方法使用详解
2016/08/26 Javascript
JS实现表单验证功能(验证手机号是否存在,验证码倒计时)
2016/10/11 Javascript
jquery+css实现侧边导航栏效果
2017/06/12 jQuery
nodejs 简单实现动态html的方法
2018/05/12 NodeJs
深入浅出理解JavaScript高级定时器原理与用法
2018/08/02 Javascript
animate.css在vue项目中的使用教程
2018/08/05 Javascript
js实现ATM机存取款功能
2020/10/27 Javascript
微信小程序模板消息推送的两种实现方式
2019/08/27 Javascript
[00:36]DOTA2上海特级锦标赛 Alliance战队宣传片
2016/03/04 DOTA
python实现k均值算法示例(k均值聚类算法)
2014/03/16 Python
Python入门篇之文件
2014/10/20 Python
python中日期和时间格式化输出的方法小结
2015/03/19 Python
对pandas写入读取h5文件的方法详解
2018/12/28 Python
python数据处理之如何选取csv文件中某几行的数据
2019/09/02 Python
Scrapy 配置动态代理IP的实现
2020/09/28 Python
日本乐天德国站:Rakuten.de
2019/05/16 全球购物
介绍一下木马病毒的种类
2015/07/26 面试题
EJB包括(SessionBean,EntityBean)说出他们的生命周期,及如何管理事务的
2015/07/24 面试题
物业电工岗位职责
2013/11/20 职场文书
自主招生自荐信范文
2013/12/04 职场文书
《四季》教学反思
2014/04/08 职场文书
运动会广播稿150字(9篇)
2014/09/20 职场文书
2014国庆节国旗下演讲稿(精选版)
2014/09/26 职场文书
中学生自我评价2015
2015/03/03 职场文书
python基于机器学习预测股票交易信号
2021/05/25 Python