微信小程序实现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 相关文章推荐
jquery实现弹出窗口效果的实例代码
Nov 28 Javascript
Script标签与访问HTML页面详解
Jan 10 Javascript
javascript实现禁止复制网页内容
Dec 16 Javascript
在Ubuntu系统上安装Ghost博客平台的教程
Jun 17 Javascript
浅谈JavaScript 标准对象
Jun 02 Javascript
详解在express站点中使用ejs模板引擎
Sep 21 Javascript
详解解决Vue相同路由参数不同不会刷新的问题
Oct 12 Javascript
JavaScript中import用法总结
Jan 20 Javascript
jQuery内容过滤选择器与子元素过滤选择器用法实例分析
Feb 20 jQuery
如何实现双向绑定mvvm的原理实现
May 28 Javascript
详解Node.js异步处理的各种写法
Jun 09 Javascript
webpack安装配置与常见使用过程详解(结合vue)
Jun 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
原生Js与jquery的多组处理, 仅展开一个区块的折叠效果
2011/01/09 Javascript
Jquery进度条插件 Progress Bar小问题解决
2011/07/12 Javascript
表单提交前触发函数返回true表单才会提交
2014/03/11 Javascript
JavaScript设计模式之原型模式(Object.create与prototype)介绍
2014/12/28 Javascript
浅谈javascript的call()、apply()、bind()的用法
2016/02/21 Javascript
老生常谈JavaScript数组的用法
2016/06/10 Javascript
AngularJs基本特性解析(一)
2016/07/21 Javascript
JS匹配日期和时间的正则表达式示例
2017/05/12 Javascript
详解微信小程序中的页面代码中的模板的封装
2017/10/12 Javascript
浅谈FastClick 填坑及源码解析
2018/03/02 Javascript
微信小程序chooseImage的用法(从本地相册选择图片或使用相机拍照)
2018/08/22 Javascript
react在安卓中输入框被手机键盘遮挡问题的解决方法
2018/09/03 Javascript
JS中的算法与数据结构之字典(Dictionary)实例详解
2019/08/20 Javascript
解决layui table表单提示数据接口请求异常的问题
2019/09/24 Javascript
vue项目中常见问题及解决方案(推荐)
2019/10/21 Javascript
vue实现在线预览pdf文件和下载(pdf.js)
2019/11/26 Javascript
vue 实现websocket发送消息并实时接收消息
2019/12/09 Javascript
npx create-react-app xxx创建项目报错的解决办法
2020/02/17 Javascript
Python编写百度贴吧的简单爬虫
2015/04/02 Python
实例Python处理XML文件的方法
2015/08/31 Python
结合Python的SimpleHTTPServer源码来解析socket通信
2016/06/27 Python
Python获取文件所在目录和文件名的方法
2017/01/12 Python
Python反爬虫技术之防止IP地址被封杀的讲解
2019/01/09 Python
Django实现学生管理系统
2019/02/26 Python
Python向excel中写入数据的方法
2019/05/05 Python
CSS 3.0 结合video视频实现的创意开幕效果
2020/06/01 HTML / CSS
详解通过变换矩阵实现canvas的缩放功能
2019/01/14 HTML / CSS
JAVA程序员面试题
2012/10/03 面试题
应届毕业生求职信范例分享
2013/12/17 职场文书
2014年党支部学习材料
2014/05/19 职场文书
部队个人年终总结
2015/03/02 职场文书
售后前台接待岗位职责
2015/04/03 职场文书
无罪辩护词范文
2015/05/21 职场文书
MySQL 数据类型选择原则
2021/05/27 MySQL
Python借助with语句实现代码段只执行有限次
2022/03/23 Python
Python自动操作神器PyAutoGUI的使用教程
2022/06/16 Python