微信小程序实现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 相关文章推荐
网页编辑器ckeditor和ckfinder配置步骤分享
May 24 Javascript
鼠标划过实现延迟加载并隐藏层的js代码
Oct 11 Javascript
JS实现随页面滚动显示/隐藏窗口固定位置元素
Feb 26 Javascript
Jquery表单验证失败后不提交的解决方法
Oct 18 Javascript
JavaScript中浅讲ajax图文详解
Nov 11 Javascript
js事件委托和事件代理案例分享
Jul 25 Javascript
js 索引下标之li集合绑定点击事件
Jan 12 Javascript
JavaScript设计模式之单例模式原理与用法实例分析
Jul 26 Javascript
vue根据值给予不同class的实例
Sep 29 Javascript
Vue Echarts实现可视化世界地图代码实例
May 07 Javascript
vue.js实现照片放大功能
Jun 23 Javascript
Vue实现手机计算器
Aug 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
Smarty中调用FCKeditor的方法
2014/10/27 PHP
DEDECMS首页调用图片集里的多张图片
2015/06/05 PHP
yii2实现根据时间搜索的方法
2016/05/25 PHP
Javascript 强制类型转换函数
2009/05/17 Javascript
理解JSON:3分钟课程
2011/10/28 Javascript
jQuery+CSS实现菜单滑动伸展收缩(仿淘宝)
2013/03/22 Javascript
jquery的选择器的使用技巧之如何选择input框
2013/09/22 Javascript
JavaScript返回当前会话cookie全部键值对照的方法
2015/04/03 Javascript
JavaScript随机生成信用卡卡号的方法
2015/04/07 Javascript
JS使用cookie设置样式的方法
2016/06/30 Javascript
一步一步封装自己的HtmlHelper组件BootstrapHelper(二)
2016/09/14 Javascript
vue组件Prop传递数据的实现示例
2017/08/17 Javascript
基于JavaScript表单脚本(详解)
2017/10/18 Javascript
IntelliJ IDEA 安装vue开发插件的方法
2017/11/21 Javascript
解决Vue axios post请求,后台获取不到数据的问题方法
2018/08/11 Javascript
JavaScript原型继承和原型链原理详解
2020/02/04 Javascript
[16:21]教你分分钟做大人:圣堂刺客
2014/12/03 DOTA
轻松实现python搭建微信公众平台
2016/02/16 Python
python实现简单flappy bird
2018/12/24 Python
python爬虫获取小区经纬度以及结构化地址
2018/12/30 Python
python使用正则筛选信用卡
2019/01/27 Python
python requests指定出口ip的例子
2019/07/25 Python
python中bs4.BeautifulSoup的基本用法
2019/07/27 Python
浅析Python3 pip换源问题
2020/01/06 Python
让Django的BooleanField支持字符串形式的输入方式
2020/05/20 Python
伦敦最著名的老字号百货公司:Selfridges(塞尔福里奇百货)
2016/07/25 全球购物
Lookfantastic希腊官网:英国知名美妆购物网站
2018/09/15 全球购物
2014年新生军训方案
2014/05/01 职场文书
中国梦主题教育活动总结
2014/05/05 职场文书
工作作风懒散检讨书
2014/10/29 职场文书
公司仓管员岗位职责
2015/04/01 职场文书
2015年大学社团工作总结
2015/04/09 职场文书
读《推着妈妈去旅行》有感1500字
2019/10/15 职场文书
java如何实现socket连接方法封装
2021/09/25 Java/Android
apache ftpserver搭建ftp服务器
2022/05/20 Servers
Nginx代理Redis哨兵主从配置的实现
2022/07/15 Servers