微信小程序实现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中最常看到切最容易迷惑的语法(转)
Oct 29 Javascript
js实现点击注册按钮开始读秒倒计时的小例子
May 11 Javascript
解决Extjs4中form表单提交后无法进入success函数问题
Nov 26 Javascript
在jquery boxy中添加百度地图坐标拾取注意流程
Apr 03 Javascript
JS实现鼠标经过好友列表中的好友头像时显示资料卡的效果
Jul 02 Javascript
js网页右下角提示框实例
Oct 14 Javascript
EasyUI,点击开启编辑框,并且编辑框获得焦点的方法
Mar 01 Javascript
Node.js模块封装及使用方法
Mar 06 Javascript
第九篇Bootstrap导航菜单创建步骤详解
Jun 21 Javascript
JavaScript浮点数及运算精度调整详解
Oct 21 Javascript
IntelliJ IDEA编辑器配置vue高亮显示
Sep 26 Javascript
JS+CSS+HTML实现“代码雨”类似黑客帝国文字下落效果
Mar 17 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 的ArrayAccess接口 像数组一样来访问你的PHP对象
2010/10/12 PHP
ajax 的post方法实例(带循环)
2011/07/04 PHP
php实现购物车功能(下)
2016/01/05 PHP
php array_merge_recursive 数组合并
2016/10/26 PHP
javascript中巧用“闭包”实现程序的暂停执行功能
2007/04/04 Javascript
javascript实现的动态文字变换
2007/07/28 Javascript
Jquery Post处理后不进入回调的原因及解决方法
2014/07/15 Javascript
angularjs指令中的compile与link函数详解
2014/12/06 Javascript
JS实现在网页中弹出一个输入框的方法
2015/03/03 Javascript
深入分析javascript中console命令
2016/08/14 Javascript
AngularJS  自定义指令详解及实例代码
2016/09/14 Javascript
js生成随机颜色方法代码分享(三种)
2016/12/29 Javascript
angular中的http拦截器Interceptors的实现
2017/02/21 Javascript
jquery.validate.js 多个相同name的处理方式
2017/07/10 jQuery
JS分页的实现(同步与异步)
2017/09/16 Javascript
手把手教你如何使用nodejs编写cli命令行
2018/11/05 NodeJs
JS实现提示效果弹出及延迟隐藏的功能
2019/08/26 Javascript
原生JS与CSS实现软件卸载对话框功能
2019/12/05 Javascript
40行代码把Vue3的响应式集成进React做状态管理
2020/05/20 Javascript
浅谈vue.watch的触发条件是什么
2020/11/07 Javascript
Nodejs实现微信分账的示例代码
2021/01/19 NodeJs
pygame播放音乐的方法
2015/05/19 Python
用python记录运行pid,并在需要时kill掉它们的实例
2017/01/16 Python
Python装饰器原理与用法分析
2018/04/30 Python
python 求某条线上特定x值或y值的点坐标方法
2019/07/09 Python
Python编程学习之如何判断3个数的大小
2019/08/07 Python
Python实现JS解密并爬取某音漫客网站
2020/10/23 Python
2021年值得向Python开发者推荐的VS Code扩展插件
2021/01/25 Python
中国酒类在线零售网站:酒仙网
2016/08/20 全球购物
SQL数据库笔试题
2016/03/08 面试题
励志演讲稿600字
2014/08/21 职场文书
客户答谢会活动方案
2014/08/31 职场文书
出差报告怎么写
2014/11/06 职场文书
新员工试用期自我评价
2015/03/10 职场文书
学习焦裕禄先进事迹心得体会
2016/01/23 职场文书
django如何自定义manage.py管理命令
2021/04/27 Python