小程序使用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 相关文章推荐
基于jquery的页面划词搜索JS
Sep 14 Javascript
JS 毫秒转时间示例代码
Sep 22 Javascript
给超链接添加特效鼠标移动展示提示信息且随鼠标移动
Oct 17 Javascript
js跨域资源共享 基础篇
Jul 02 Javascript
Vue Spa切换页面时更改标题的实例代码
Jul 15 Javascript
使用Node.js实现简易MVC框架的方法
Aug 07 Javascript
详解js的视频和音频采集
Aug 09 Javascript
原生js实现淘宝放大镜效果
Oct 28 Javascript
js常用正则表达式集锦
May 17 Javascript
修改layui的后台模板的左侧导航栏可以伸缩的方法
Sep 10 Javascript
使用layer模态框给新页面传值的方法
Sep 27 Javascript
JavaScript前端面试组合函数
Jun 21 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下将多个数组合并成一个数组的方法与实例代码
2011/02/03 PHP
PHP页面中文乱码分析
2013/10/29 PHP
基于laravel-admin 后台 列表标签背景的使用方法
2019/10/03 PHP
各种效果的jquery ui(接口)介绍
2008/09/17 Javascript
javascript setAttribute, getAttribute 在不同浏览器上的不同表现
2010/08/05 Javascript
JavaScript打开word文档的实现代码(c#)
2012/04/16 Javascript
jQuery中attr()方法用法实例
2015/01/05 Javascript
JavaScript使用slice函数获取数组部分元素的方法
2015/04/06 Javascript
JS基于Ajax实现的网页Loading效果代码
2015/10/27 Javascript
Javascript基础_标记文字的实现方法
2016/06/14 Javascript
浅谈Angular的$q, defer, promise
2016/12/20 Javascript
Ajax异步获取html数据中包含js方法无效的解决方法
2017/02/20 Javascript
vue实现页面加载动画效果
2017/09/19 Javascript
Windows安装Node.js报错:2503、2502的解决方法
2017/10/25 Javascript
浅谈react 同构之样式直出
2017/11/07 Javascript
详解vue-cli之webpack3构建全面提速优化
2017/12/25 Javascript
Vue.js分页组件实现:diVuePagination的使用详解
2018/01/10 Javascript
JavaScript中字符串的常用操作方法及特殊字符
2018/03/18 Javascript
vue 不使用select实现下拉框功能(推荐)
2018/05/17 Javascript
JavaScript实现的拼图算法分析
2019/02/13 Javascript
Vue js 的生命周期(看了就懂)(推荐)
2019/03/29 Javascript
微信小程序学习笔记之文件上传、下载操作图文详解
2019/03/29 Javascript
使用Python实现一个简单的项目监控
2015/03/31 Python
Python 闭包的使用方法
2017/09/07 Python
matplotlib作图添加表格实例代码
2018/01/23 Python
解决tensorflow打印tensor有省略号的问题
2020/02/04 Python
python 制作本地应用搜索工具
2021/02/27 Python
软件测试工程师结构化面试题库
2016/11/23 面试题
奥巴马连任演讲稿
2014/05/15 职场文书
元旦晚会活动总结
2014/07/09 职场文书
网络文明传播志愿者活动方案
2014/08/20 职场文书
化工实习心得体会
2014/09/09 职场文书
2014年协会工作总结
2014/11/22 职场文书
vue中利用mqtt服务端实现即时通讯的步骤记录
2021/07/01 Vue.js
MySQL中的隐藏列的具体查看
2021/09/04 MySQL
世界无敌的ICOM IC-R9500宽频接收机
2022/03/25 无线电