微信小程序实现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 相关文章推荐
Prototype ObjectRange对象学习
Jul 19 Javascript
jquery实现点击TreeView文本父节点展开/折叠子节点
Jan 10 Javascript
对Jquery中的ajax再封装,简化操作示例
Feb 12 Javascript
JavaScript中的alert()函数使用技巧详解
Dec 29 Javascript
JS拖动鼠标画出方框实现鼠标选区的方法
Aug 05 Javascript
angular实现图片懒加载实例代码
Jun 08 Javascript
AngularJS表单验证功能
Oct 19 Javascript
Vue2.0实现调用摄像头进行拍照功能 exif.js实现图片上传功能
Apr 28 Javascript
使用vue打包时vendor文件过大或者是app.js文件很大的问题
Jun 29 Javascript
vue安装遇到的5个报错及解决方法
Jun 12 Javascript
js实现模拟购物商城案例
May 18 Javascript
深入讲解Vue中父子组件通信与事件触发
Mar 22 Vue.js
微信小程序学习总结(二)样式、属性、模板操作分析
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高级对象构建 工厂模式的使用
2012/02/05 PHP
php启用zlib压缩文件的配置方法
2013/06/12 PHP
PHP 获取文件权限函数介绍
2013/07/11 PHP
destoon公司主页模板风格的添加方法
2014/06/20 PHP
Yii快速入门经典教程
2015/12/28 PHP
javascript高亮效果的二种实现方法
2008/09/14 Javascript
jQuery中innerWidth()方法用法实例
2015/01/19 Javascript
基于javascript实现精确到毫秒的倒计时限时抢购
2016/04/17 Javascript
JS实现放大、缩小及拖拽图片的方法【可兼容IE、火狐】
2016/08/23 Javascript
谈谈target=_new和_blank的不同之处
2016/10/25 Javascript
深入理解javascript函数参数与闭包
2016/12/12 Javascript
ES6 Promise对象概念与用法分析
2017/04/01 Javascript
Vue表单验证插件的制作过程
2017/04/01 Javascript
微信小程序实现二维码签到考勤系统
2020/01/16 Javascript
使用JavaScript获取Django模板指定键值数据
2020/05/27 Javascript
vue 监听窗口变化对页面部分元素重新渲染操作
2020/07/28 Javascript
[04:02]2014DOTA2国际邀请赛 BBC每日综述中国战队将再度登顶
2014/07/21 DOTA
python使用urlparse分析网址中域名的方法
2015/04/15 Python
python开发之IDEL(Python GUI)的使用方法图文详解
2015/11/12 Python
Django查询数据库的性能优化示例代码
2017/09/24 Python
Python手绘可视化工具cutecharts使用实例
2019/12/05 Python
python 利用已有Ner模型进行数据清洗合并代码
2019/12/24 Python
Python程序控制语句用法实例分析
2020/01/14 Python
Pandas实现一列数据分隔为两列
2020/05/18 Python
解决Django Haystack全文检索为空的问题
2020/05/19 Python
Python的Tqdm模块实现进度条配置
2021/02/24 Python
html5 canvas里绘制椭圆并保持线条粗细均匀的技巧
2013/03/25 HTML / CSS
营销与策划应届生求职信
2013/11/04 职场文书
外企办公室竞聘演讲稿
2013/12/29 职场文书
策划创业计划书
2014/02/06 职场文书
教师民族团结演讲稿
2014/08/27 职场文书
乡镇干部先进性教育活动个人整改措施
2014/09/16 职场文书
员工试用期自我评价
2014/09/18 职场文书
个人自荐书怎么写
2015/03/26 职场文书
python基础之匿名函数详解
2021/04/21 Python
MySQL中出现乱码问题的终极解决宝典
2021/05/26 MySQL