微信小程序实现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 相关文章推荐
iis6+javascript Add an Extension File
Jun 13 Javascript
javascript 兼容鼠标滚轮事件
Apr 07 Javascript
关于javascript中this关键字(翻译+自我理解)
Oct 20 Javascript
html文本框提示效果的示例代码
Jun 28 Javascript
详解JavaScript对W3C DOM模版的支持情况
Jun 16 Javascript
jquery实现加载进度条提示效果
Nov 23 Javascript
详解Vue SSR( Vue2 + Koa2 + Webpack4)配置指南
Nov 13 Javascript
详解Vue This$Store总结
Dec 17 Javascript
Vue2.4+新增属性.sync、$attrs、$listeners的具体使用
Mar 08 Javascript
javascript实现前端成语点击验证
Jun 24 Javascript
elementui实现预览图片组件二次封装
Dec 29 Javascript
react项目从新建到部署的实现示例
Feb 19 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
帝国cms常用标签汇总
2015/07/06 PHP
thinkPHP5.0框架整体架构总览【应用,模块,MVC,驱动,行为,命名空间等】
2017/03/25 PHP
你需要知道的JavsScript可以做什么?
2007/06/29 Javascript
jquery ready函数源代码研究
2009/12/06 Javascript
JS 实现完美include载入实现代码
2010/08/05 Javascript
jquery使用ColorBox弹出图片组浏览层实例演示
2013/03/14 Javascript
javascript使用正则控制input输入框允许输入的值方法大全
2014/06/19 Javascript
js实现回放拖拽轨迹从过程上进行分析
2014/06/26 Javascript
Javascript中call与apply的学习笔记
2014/09/22 Javascript
jquery实现页面关键词高亮显示的方法
2015/03/12 Javascript
jQuery插件MixItUp实现动画过滤和排序
2015/04/12 Javascript
js命名空间写法示例
2015/12/18 Javascript
JavaScript中undefined和null的区别
2017/05/03 Javascript
js 中rewrap-ajax.js插件实例代码
2017/10/20 Javascript
jquery+css实现Tab栏切换的代码实例
2019/05/14 jQuery
JavaScript在web自动化测试中的作用示例详解
2019/08/25 Javascript
vue实现扫码功能
2020/01/17 Javascript
jQuery实时统计输入框字数及限制
2020/06/24 jQuery
在Uni中使用Vue的EventBus总线机制操作
2020/07/31 Javascript
JavaScript实现原型封装轮播图
2020/12/27 Javascript
python删除列表中重复记录的方法
2015/04/28 Python
Python程序退出方式小结
2017/12/09 Python
python3中获取文件当前绝对路径的两种方法
2018/04/26 Python
Centos部署django服务nginx+uwsgi的方法
2019/01/02 Python
使用Python中的reduce()函数求积的实例
2019/06/28 Python
Python pip替换为阿里源的方法步骤
2019/07/02 Python
python pandas模块基础学习详解
2019/07/03 Python
通过celery异步处理一个查询任务的完整代码
2019/11/19 Python
Python生成个性签名图片获取GUI过程解析
2019/12/16 Python
Python Sphinx使用实例及问题解决
2020/01/17 Python
Django 解决阿里云部署同步数据库报错的问题
2020/05/14 Python
地图可视化神器kepler.gl python接口的使用方法
2020/12/22 Python
安全生产月演讲稿
2014/05/09 职场文书
离婚协议书的书写要求
2014/09/17 职场文书
2014年检察院个人工作总结
2014/12/09 职场文书
导游词之南京栖霞山
2019/10/18 职场文书