微信小程序实现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 相关文章推荐
DHTML 中的绝对定位
Nov 26 Javascript
jQuery-onload让第一次页面加载时图片是淡入方式显示
May 23 Javascript
javascript 系统文件夹文件操作及参数介绍
Jan 08 Javascript
JavaScript异步编程:异步数据收集的具体方法
Aug 19 Javascript
JavaScript中访问节点对象的方法有哪些如何使用
Sep 24 Javascript
JavaScript的各种常见函数定义方法
Sep 16 Javascript
在Javascript中处理字符串之big()方法的使用
Jun 08 Javascript
简单实现异步编程promise模式
Jul 31 Javascript
jQuery实用技巧必备(下)
Nov 03 Javascript
jQuery 特性操作详解及实例代码
Sep 29 Javascript
Bootstrap复选框和单选按钮美化插件(推荐)
Nov 23 Javascript
解决在vue项目中,发版之后,背景图片报错,路径不对的问题
Mar 06 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中过滤非法字符的具体实现
2013/10/29 PHP
php实现的微信红包算法分析(非官方)
2015/09/25 PHP
JS获取scrollHeight问题想到的标准问题
2007/05/27 Javascript
基于jQuery实现的当离开页面时出现提示的实现代码
2011/06/27 Javascript
js之ActiveX控件使用说明 new ActiveXObject()
2014/03/03 Javascript
一个JavaScript操作元素定位元素的实例
2014/10/29 Javascript
5个数组Array方法: indexOf、filter、forEach、map、reduce使用实例
2015/01/29 Javascript
javascript实现图像循环明暗变化的方法
2015/02/25 Javascript
BootStrap中Datetimepicker和uploadify插件应用实例小结
2016/05/26 Javascript
JS读写CSS样式的方法汇总
2016/08/16 Javascript
JavaScript数据操作_浅谈原始值和引用值的操作本质
2016/08/23 Javascript
深入浅析Vue组件开发
2016/11/25 Javascript
bootstrap datetimepicker日期插件超详细使用方法介绍
2017/02/23 Javascript
jQuery获取复选框选中的当前行的某个字段的值
2017/09/15 jQuery
原生js实现form表单序列化的方法
2018/08/02 Javascript
vue实现列表滚动的过渡动画
2020/06/29 Javascript
解决vuex改变了state的值,但是页面没有更新的问题
2020/11/12 Javascript
Python如何实现文本转语音
2016/08/08 Python
利用Python yagmail三行代码实现发送邮件
2018/05/11 Python
Python2.7环境Flask框架安装简明教程【已测试】
2018/07/13 Python
Python使用pickle模块储存对象操作示例
2018/08/15 Python
python简单操作excle的方法
2018/09/12 Python
基于django ManyToMany 使用的注意事项详解
2019/08/09 Python
python 实现图片上传接口开发 并生成可以访问的图片url
2019/12/18 Python
Python数据可视化实现漏斗图过程图解
2020/07/20 Python
使用html2canvas.js实现页面截图并显示或上传的示例代码
2018/12/18 HTML / CSS
Dune London官网:英国著名奢华鞋履品牌
2017/11/30 全球购物
MIRTA官网:手工包,100%意大利制造
2020/02/11 全球购物
加拿大拼图大师:Puzzle Master
2020/12/28 全球购物
环境工程专业自荐信
2014/03/03 职场文书
住宅使用说明书
2014/05/09 职场文书
2015年前台接待工作总结
2015/05/04 职场文书
入党转正介绍人意见
2015/06/03 职场文书
《春酒》教学反思
2016/02/22 职场文书
Python实现排序方法常见的四种
2021/07/15 Python
win10壁纸在哪个文件夹 win10桌面背景图片文件位置分享
2022/08/05 数码科技