小程序使用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 相关文章推荐
qTip2 精致的基于jQuery提示信息插件
Feb 17 Javascript
cookie的复制与使用记住用户名实现代码
Nov 04 Javascript
深入理解javascript动态插入技术
Nov 12 Javascript
js钢琴按钮波浪式图片排列效果代码分享
Aug 26 Javascript
JavaScript原生xmlHttp与jquery的ajax方法json数据格式实例
Dec 04 Javascript
BootStrap下拉菜单和滚动监听插件实现代码
Sep 26 Javascript
JavaScript生成.xls文件的代码
Dec 22 Javascript
jQuery 改变P标签文本值方法
Feb 24 jQuery
JS中的JSON对象的定义和取值实现代码
May 09 Javascript
vue-cli监听组件加载完成的方法
Sep 07 Javascript
Vue.js组件通信之自定义事件详解
Oct 19 Javascript
javascript-hashchange事件和历史状态管理实例分析
Apr 18 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
php实现专业获取网站SEO信息类实例
2015/04/02 PHP
php去掉文件前几行的方法
2015/07/29 PHP
iOS自定义提示弹出框实现类似UIAlertView的效果
2016/11/16 PHP
thinkphp5使html5实现动态跳转的例子
2019/10/16 PHP
laravel 执行迁移回滚示例
2019/10/23 PHP
如何在PHP中读写文件
2020/09/07 PHP
从阿里妈妈发现的几个不错的表单验证函数
2007/09/21 Javascript
jQuery关于导航条背景切换效果实现示例
2013/09/04 Javascript
JS小功能(button选择颜色)简单实例
2013/11/29 Javascript
javascript 自定义回调函数示例代码
2014/09/26 Javascript
JavaScript前端图片加载管理器imagepool使用详解
2014/12/29 Javascript
js与jquery实时监听输入框值的oninput与onpropertychange方法
2015/02/05 Javascript
clipboard.js无需Flash无需依赖任何JS库实现文本复制与剪切
2015/10/10 Javascript
JS iFrame加载慢怎么解决
2016/05/13 Javascript
浅谈JavaScript 数据属性和访问器属性
2016/09/01 Javascript
jQuery实现的仿百度,仿谷歌搜索下拉框效果示例
2016/12/30 Javascript
分析JS单线程异步io回调的特性
2017/12/01 Javascript
vue 页面加载进度条组件实例
2018/02/05 Javascript
详解如何在vue项目中使用eslint+prettier格式化代码
2018/11/10 Javascript
Vue中的情侣属性$dispatch和$broadcast详解
2019/03/07 Javascript
再谈Python中的字符串与字符编码(推荐)
2016/12/14 Python
Python基于Matplotlib库简单绘制折线图的方法示例
2017/08/14 Python
Python内置模块turtle绘图详解
2017/12/09 Python
python实现关键词提取的示例讲解
2018/04/28 Python
python 已知一个字符,在一个list中找出近似值或相似值实现模糊匹配
2020/02/29 Python
普通PHP程序员笔试题
2016/01/01 面试题
求职信的要素有哪些呢
2013/12/26 职场文书
大学生咖啡店创业计划书
2014/01/21 职场文书
优秀学生获奖感言
2014/02/15 职场文书
学历公证委托书
2014/04/09 职场文书
班长竞选演讲稿
2014/04/24 职场文书
团支部建设方案
2014/05/02 职场文书
实训报告范文大全
2014/11/04 职场文书
困难补助申请报告
2015/05/19 职场文书
六年级语文教学反思
2016/03/03 职场文书
从原生JavaScript到React深入理解
2022/07/23 Javascript