小程序使用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 提交和设置表单的值
Dec 19 Javascript
JS获取整个页面文档的实现代码
Dec 15 Javascript
js中数组(Array)的排序(sort)注意事项说明
Jan 24 Javascript
JavaScript编程中布尔对象的基本使用
Oct 25 Javascript
KnockoutJs快速入门教程
May 16 Javascript
vue实现单选和多选功能
Aug 11 Javascript
关于AngularJS中ng-repeat不更新视图的解决方法
Sep 30 Javascript
element-ui多文件上传的实现示例
Apr 10 Javascript
在vue中根据光标的显示与消失实现下拉列表
Sep 29 Javascript
Vue的双向数据绑定实现原理解析
Feb 17 Javascript
vue实现登录功能
Dec 31 Vue.js
vue中的可拖拽宽度div的实现示例
Apr 08 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
Terran剧情介绍
2020/03/14 星际争霸
我的论坛源代码(十)
2006/10/09 PHP
php接口与接口引用的深入解析
2013/08/09 PHP
PHP实现微信公众平台音乐点播
2014/03/20 PHP
PHP针对字符串开头和结尾的判断方法
2016/07/11 PHP
File文件控件,选中文件(图片,flash,视频)即立即预览显示
2009/04/09 Javascript
JQuery获取当前屏幕的高度宽度的实现代码
2011/07/12 Javascript
Jquery 的扩展方法总结
2011/10/01 Javascript
Javascript实现返回上一页面并刷新的小例子
2013/12/11 Javascript
实现js保留小数点后N位的代码
2014/11/13 Javascript
jQuery过滤选择器详解
2015/01/13 Javascript
浅谈JavaScript正则表达式分组匹配
2015/04/10 Javascript
javascript实现输出指定行数正方形图案的方法
2015/08/03 Javascript
javascript容错处理代码(屏蔽js错误)
2017/01/20 Javascript
详解vuelidate 对于vueJs2.0的验证解决方案
2017/03/09 Javascript
使用vue-cli(vue脚手架)快速搭建项目的方法
2018/05/21 Javascript
vue的传参方式汇总和router使用技巧
2018/05/22 Javascript
vue控制多行文字展开收起的实现示例
2019/10/11 Javascript
vue多个元素的样式选择器问题
2019/11/29 Javascript
vue页面更新patch的实现示例
2020/03/25 Javascript
vue 扩展现有组件的操作
2020/08/14 Javascript
Python实现将多个空格换为一个空格.md的方法
2018/12/20 Python
Python 实现数据结构-循环队列的操作方法
2019/07/17 Python
flask的orm框架SQLAlchemy查询实现解析
2019/12/12 Python
python使用布隆过滤器的实现示例
2020/08/20 Python
Python中正则表达式对单个字符,多个字符和匹配边界等使用
2021/01/27 Python
如何用Python进行时间序列分解和预测
2021/03/01 Python
雅诗兰黛加拿大官网:Estee Lauder加拿大
2019/07/31 全球购物
机械专业毕业生自荐信
2013/11/02 职场文书
酒吧创业计划书
2014/01/18 职场文书
初中化学教学反思
2014/01/23 职场文书
高中地理教学反思
2014/01/29 职场文书
优秀员工演讲稿
2019/06/21 职场文书
正确使用MySQL update语句
2021/05/26 MySQL
Spring依赖注入多种类型数据的示例代码
2022/03/31 Java/Android
Oracle用户管理及赋权
2022/04/24 Oracle