微信小程序实现watch监听


Posted in Javascript onJune 04, 2020

Vue 提供了一种通用的方式来观察和响应 Vue 实例上的数据变动:监听属性 watch。

虽然watch的滥用会导致性能不佳,但在一些情况下我们还是需要watch,使得代码更加简洁、逻辑更加清晰(其实就是嫌麻烦...)。

小程序实现 类似vue 一样的watch 监听数据

将方法注册到app.js 中也可以使用高级一点的写法

使用装饰器模式将小程序page 重写挂在到生命周期函数上或者挂在页面this 上每次就不需要重新在调用初始化一次。本文对装饰器模式不做介绍这是个思路。等待下次实现

setWatcher(page) {
   let data = page.data; // 获取page 页面data
   let watch = page.watch;
   for(let i in watch){
     let key = i.split('.'); // 将watch中的属性以'.'切分成数组
     let nowData = data; // 将data赋值给nowData
     let lastKey = key[key.length - 1];
     let watchFun = watch[i].handler || watch[i]; // 兼容带handler和不带handler的两种写法
     let deep = watch[i].deep; // 若未设置deep,则为undefine
     this.observe(nowData, lastKey, watchFun, deep, page); // 监听nowData对象的lastKey
     }
 },
 /\*\*
 \* 监听属性 并执行监听函数
 \*/
   observe(obj, key, watchFun, deep, page) {
     let val = obj[key];
     // 判断deep是true 且 val不能为空 且 typeof val==='object'(数组内数值变化也需要深度监听)
     if (deep && val != null && typeof val === 'object') {
     for(let i in val){
     this.observe(val, i, watchFun, deep, page); // 递归调用监听函数
   }
 }
   let that = this;
   Object.defineProperty(obj, key, {
   configurable: true,
   enumerable: true,
   set: function (value) {
     // 用page对象调用,改变函数内this指向,以便this.data访问data内的属性值
     watchFun.call(page, value, val); // value是新值,val是旧值
     val = value;
     if (deep) { // 若是深度监听,重新监听该对象,以便监听其属性。
      that.observe(obj, key, watchFun, deep, page);
     }
   },
   get: function () {
    return val;
   }
   })
 }

页面使用:

onLoad: function () {
   app.setWatcher(this);
     setTimeout(()=>{
     this.setData({
     name:"kangbosodoa"
     })
   },2000)
   },
   watch: {
     name: {
     handler(newValue,oldvalue) {
     console.log(this)
     console.log(newValue,oldvalue,"变化了");
     },
    deep: true
   },
   type:{
     handler(newValue) {
     console.log(newValue,"属性发生变化");
     },
    deep: true // 是否深度监听
   }
 },

到此这篇关于微信小程序实现watch监听的文章就介绍到这了,更多相关小程序watch监听内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
js浮动图片的动态效果
Jul 10 Javascript
使用javascript创建快捷方式的简单实例
Aug 09 Javascript
Jquery中的层次选择器与find()的区别示例介绍
Feb 20 Javascript
Javascript学习笔记之数组的构造函数
Nov 23 Javascript
JS实现超炫网页烟花动画效果的方法
Mar 02 Javascript
js表单验证实例讲解
Mar 31 Javascript
JQuery.validationEngine表单验证插件(推荐)
Dec 10 Javascript
微信小程序使用二次贝塞尔曲线画波浪
Dec 25 Javascript
使用webpack搭建pixi.js开发环境
Feb 12 Javascript
Javascript基于OOP实实现探测器功能代码实例
Aug 26 Javascript
vue中利用three.js实现全景图的完整示例
Dec 07 Vue.js
javascript实现计算器功能详解流程
Nov 01 Javascript
微信小程序学习总结(二)样式、属性、模板操作分析
Jun 04 #Javascript
实现一个Vue自定义指令懒加载的方法示例
Jun 04 #Javascript
vue基础知识--axios合并请求和slot
Jun 04 #Javascript
vue webpack build资源相对路径的问题及解决方法
Jun 04 #Javascript
微信小程序学习总结(一)项目创建与目录结构分析
Jun 04 #Javascript
JavaScript冒泡算法原理与实现方法深入理解
Jun 04 #Javascript
js实现无刷新监听URL的变化示例代码详解
Jun 03 #Javascript
You might like
PHP分页显示制作详细讲解
2008/11/19 PHP
解析php多线程下载远程多个文件
2013/06/25 PHP
PHP中new static()与new self()的区别异同分析
2014/08/22 PHP
Yii2.0 Basic代码中路由链接被转义的处理方法
2016/09/21 PHP
Gird事件机制初级读本
2007/03/10 Javascript
javascript 避免闭包引发的问题
2009/03/17 Javascript
JQuery 学习笔记 选择器之一
2009/07/23 Javascript
js实现在页面上弹出蒙板技巧简单实用
2013/04/16 Javascript
浅析Js中的单引号与双引号问题
2013/11/06 Javascript
JavaScript中的Math.E属性使用详解
2015/06/12 Javascript
JQuery实现左右滚动菜单特效
2015/09/28 Javascript
使用EVAL处理jqchart jquery 折线图返回数据无效的解决办法
2015/11/26 Javascript
微信小程序 获取相册照片实例详解
2016/11/16 Javascript
Angular.js中控制器之间的传值详解
2017/04/24 Javascript
使用JavaScript保存文本文件到本地的两种方法
2019/01/22 Javascript
js实现简易拖拽的示例
2020/10/26 Javascript
举例讲解Django中数据模型访问外键值的方法
2015/07/21 Python
python实现爬虫统计学校BBS男女比例(一)
2015/12/31 Python
使用Python读写文本文件及编写简单的文本编辑器
2016/03/11 Python
使用rst2pdf实现将sphinx生成PDF
2016/06/07 Python
CentOS6.9 Python环境配置(python2.7、pip、virtualenv)
2019/05/06 Python
浅谈PyQt5 的帮助文档查找方法,可以查看每个类的方法
2019/06/25 Python
使用Python实现跳一跳自动跳跃功能
2019/07/10 Python
opencv导入头文件时报错#include的解决方法
2019/07/31 Python
Python openpyxl模块原理及用法解析
2020/01/19 Python
世界上最大的汽车共享网站:Zipcar
2017/01/14 全球购物
将世界上最美丽的摄影作品转化为艺术作品:Photos.com
2017/11/28 全球购物
联想新西兰官方网站:Lenovo New Zealand
2018/10/30 全球购物
高级运动鞋:GREATS
2019/07/19 全球购物
餐厅销售主管职责范本
2014/02/19 职场文书
节能环保演讲稿
2014/08/28 职场文书
物理分数没达标检讨书
2014/09/13 职场文书
学生吸烟检讨书
2014/09/14 职场文书
校长个人总结
2015/03/03 职场文书
SpringBoot整合MongoDB的实现步骤
2021/06/23 MongoDB
教你使用Jenkins集成Harbor自动发布镜像
2022/04/03 Servers