小程序使用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实现复制功能各浏览器支持情况实测
Jul 18 Javascript
js document.write()使用介绍
Feb 21 Javascript
jquery使用$(element).is()来判断获取的tagName
Aug 24 Javascript
JavaScript实现将数组中所有元素连接成一个字符串的方法
Apr 06 Javascript
jquery实现鼠标点击后展开列表内容的导航栏效果
Sep 14 Javascript
JavaScript获取css行间样式,内连样式和外链样式的简单方法
Jul 18 Javascript
JS动态添加选项案例分析
Oct 17 Javascript
Bootstrap源码解读媒体对象、列表组和面板(10)
Dec 26 Javascript
Easyui笔记2:实现datagrid多行删除的示例代码
Jan 14 Javascript
JavaScript实现无穷滚动加载数据
May 06 Javascript
自定义PC微信扫码登录样式写法
Dec 12 Javascript
vue2过滤器模糊查询方法
Sep 16 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
Yii2使用dropdownlist实现地区三级联动功能的方法
2016/07/18 PHP
JavaScript-世界上误解最深的语言分析
2007/08/12 Javascript
javascript用户注册提示效果的简单实例
2013/08/17 Javascript
javascript与jquery中跳出循环的区别总结
2013/11/04 Javascript
利用JS来控制键盘的上下左右键(示例代码)
2013/12/14 Javascript
使用jquery组件qrcode生成二维码及应用指南
2015/02/22 Javascript
深入理解JavaScript系列(39):设计模式之适配器模式详解
2015/03/04 Javascript
JQuery中DOM事件绑定用法详解
2015/06/13 Javascript
使用AngularJS制作一个简单的RSS阅读器的教程
2015/06/18 Javascript
javascript的变量、传值、传址、参数之间关系
2015/07/26 Javascript
AngularJS基础 ng-if 指令用法
2016/08/01 Javascript
微信小程序微信支付接入开发实例详解
2017/04/12 Javascript
基于JavaScript实现活动倒计时效果
2017/04/20 Javascript
jQuery选择器之属性筛选选择器用法详解
2017/09/19 jQuery
React Native中的RefreshContorl下拉刷新使用
2017/10/09 Javascript
使用原生js封装的ajax实例(兼容jsonp)
2017/10/12 Javascript
Angular自定义组件实现数据双向数据绑定的实例
2017/12/11 Javascript
vue2中,根据list的id进入对应的详情页并修改title方法
2018/08/24 Javascript
vue中添加与删除关键字搜索功能
2019/10/12 Javascript
Element DateTimePicker日期时间选择器的使用示例
2020/07/27 Javascript
[03:17]2014DOTA2 国际邀请赛中国区预选赛 四强专访
2014/05/23 DOTA
[00:30]明星选手化身超级英雄!2018DOTA2亚洲邀请赛全明星赛来临!
2018/04/06 DOTA
[08:17]Ti9 现场cosplay
2019/09/10 DOTA
利用Python脚本实现ping百度和google的方法
2017/01/24 Python
Python调用系统底层API播放wav文件的方法
2017/08/11 Python
Tornado 多进程实现分析详解
2018/01/12 Python
python实现对求解最长回文子串的动态规划算法
2018/06/02 Python
python卸载后再次安装遇到的问题解决
2019/07/10 Python
Django 后台获取文件列表 InMemoryUploadedFile的例子
2019/08/07 Python
python标准库OS模块详解
2020/03/10 Python
Python Tricks 使用 pywinrm 远程控制 Windows 主机的方法
2020/07/21 Python
详解利用canvas实现环形进度条的方法
2019/06/12 HTML / CSS
营销与策划应届生求职信
2013/11/04 职场文书
南阳市白酒市场的调查报告
2019/11/08 职场文书
Nginx代理同域名前后端分离项目的完整步骤
2021/03/31 Servers
关于python中模块和重载的问题
2021/11/02 Python