起因:众所周知,微信小程序的数据监听器observers只能在自定义组件中使用,如果想要在页面中实现类似的功能,就只有通过其他的方法。其一就是通过模拟vue的watch来监听数据变化。

实现如下:

1.新建一个watch.js文件存放监听器的逻辑函数,代码如下:

/*** 设置监听器*/
export function setWatcher(page) {let data = page.data;let watch = page.watch;Object.keys(watch).forEach(v => {let key = v.split('.'); // 将watch中的属性以'.'切分成数组let nowData = data; // 将data赋值给nowDatafor (let i = 0; i < key.length - 1; i++) { // 遍历key数组的元素,除了最后一个!nowData = nowData[key[i]]; // 将nowData指向它的key属性对象}let lastKey = key[key.length - 1];let watchFun = watch[v].handler || watch[v]; // 兼容带handler和不带handler的两种写法let deep = watch[v].deep; // 若未设置deep,则为undefineobserve(nowData, lastKey, watchFun, deep, page); // 监听nowData对象的lastKey})
}
/**
* 监听属性 并执行监听函数
*/
function observe(obj, key, watchFun, deep, page) {var val = obj[key];// 判断deep是true 且 val不能为空 且 typeof val==='object'(数组内数值变化也需要深度监听)if (deep && val != null && typeof val === 'object') {Object.keys(val).forEach(childKey => { // 遍历val对象下的每一个keyobserve(val, childKey, watchFun, deep, page); // 递归调用监听函数})}Object.defineProperty(obj, key, {configurable: true,enumerable: true,set: function(newVal) {watchFun.call(page, newVal, val); val = newVal;if (deep) { // 若是深度监听,重新监听该对象,以便监听其属性。observe(obj, key, watchFun, deep, page);}},get: function() {return val;}})
}
module.exports = {setWatcher: setWatcher
}

2.在页面中使用:假如有个同级页面login.js,在该文件中引入watch.js,用法如下:
   tips:如果有多个页面都需要使用watch监听,可以直接在app.js中引入该文件,注册成全局函数,这样就不用每个文件都去引入watch.js了,只需要在使用的页面onLoad的时候调用一次该函数,就能愉快的使用watch了。

// 在需要使用的页面引入
import { setWatcher } from './watch.js';
Page({data: {val: '',obj: {},},onLoad() {// 在onload的时候调用一次监听函数,然后就可以像vue一样愉快的使用watch了setWatcher(this);}// 用法完全和vue一样,也能实现对象的深度监听watch: {val(v) {consolfe.log(v)},obj: {handler(v) {console.log(v)},deep: true}}
})

微信小程序实现watch监听数据变化相关推荐

  1. 微信小程序使用watch监听数据变化

    众所周知,Vue中,可以使用监听属性 watch来观察和响应 Vue 实例上的数据变化,那么小程序能不能实现这一点呢? 监听器的原理,是将data中需监听的数据写在watch对象中,并给其提供一个方法 ...

  2. 微信小程序实现watch监听,无需页面引入!!!

    目录 1监听函数实现 2.页面Page重写(实现无需引入) 3完整代码实现 4微信小程序代码片段 大家都知道小程序其实和Vue的写法以及原理都存在很大的相同,但是里有watch监听可以监听data定义 ...

  3. H5及微信小程序实测可用——监听手机返回键操作

    目录 1.自定义导航(只能拦截左上角返回) 2.内嵌H5实现拦截物理键返回(均可监听) 微信小程序开发过程中我们经常遇到需要监听点击左上角返回.手机物理返回键或者左滑返回的需求 微信原生是没有API支 ...

  4. 微信小程序全局变量改变监听

    问题来源 最近工作需要写小程序页面,其中有个页面情况为:父页面中包含了一个组件页面,组件页面中又包含了另外一个组件页面.需求为:点击最后一个组件页面中的一个view,需要显示最外层父页面中的一个弹出层 ...

  5. 微信小程序,实现 watch 属性,监听数据变化

    转自微信小程序,实现 watch 属性,监听数据变化 目标 在微信小程序实现 watch 属性,监听 data 中的属性,当被监听属性的值改变时,执行我们指定的方法.​​ 思路 Vue 的 compu ...

  6. 微信小程序-注册登录功能-本地数据保存-页面数据交替

    Title:微信小程序-注册登录功能-本地数据保存-页面数据交替 完美-小程序登录注册功能.rar-- 访问码:yqa5 1.主页面 主页面login.js代码 // pages/login/logi ...

  7. 微信小游戏的电量监听

    在说小游戏的电量监听事件之前,我想先提一下小程序的电量监听事件. 在微信小程序中,是没有电量监听事件的,因为小程序没有全屏,手机端的电量和wifi等信息一直可以看得到,所以小程序里就没有这样的api了 ...

  8. PHP更新小程序,微信小程序Tab页切换更新数据详细介绍

    这篇文章主要介绍了微信小程序 Tab页切换更新数据的相关资料,需要的朋友可以参考下 微信小程序 Tab页切换更新数据 微信小程序还处于内测阶段,最不方便的莫过于官方在不停的更新,前几天写的功能隔个几天 ...

  9. 微信小程序使用echarts实时更新数据以及常见bug

    ** 微信小程序使用echarts实时更新数据以及常见bug ** 参考echarts官方文档:https://echarts.apache.org/zh/tutorial.html 下载小程序ech ...

最新文章

  1. ELK6.0已取消filebeat配置document_type
  2. Nginx小功能合集
  3. MySQL的优化(大纲)
  4. Object o = new Object()在内存中占几个字节
  5. manacher(马拉车)算法详解
  6. 软件详细设计说明书_软件测试的基本理论 笔记
  7. 菜单栏底部线条切换效果
  8. 一步一步手绘Spring AOP运行时序图(Spring AOP 源码分析)
  9. acm模板 java_java 之acm模板
  10. 计算机二级第24套Excel解析,Excel | 操作题第 24 套
  11. 用linux制作Mac OS U盘启动
  12. 小程序毕设作品之微信酒店预订小程序毕业设计(6)开题答辩PPT
  13. ISE14.7从程序设计到下载
  14. java db4o 教程_面向Java开发人员db4o指南:数组和集合 (1)
  15. 服务器自带软件怎么样卸载,如何安装和卸载远程服务器管理工具
  16. phpstudy以及DVWA安装使用
  17. 小程序项目:基于微信小程序的超市购物系统——计算机毕业设计
  18. java编程自学教程笔记,大量教程
  19. 1414,成绩(C++一本通评测系统)
  20. 计算机软件知识产权保护主要保护哪些内容,计算机软件知识产权保护制度.pptx...

热门文章

  1. 寻找客户的“痛点”---离岸开发的新视点
  2. 【计算机科学】【2016.05】基于递归神经网络的股市预测研究
  3. MYSQL函数YEAR,MONTH,QUARTER,WEEK用法
  4. 将自己的网站上传至服务器并通过域名进行访问
  5. 一文读懂pg AGG聚集算子计划与执行(更新中)
  6. 心情平静时看书,还是看书得到平静
  7. java pnpoly算法_PNPoly算法代码例子,判断一个点是否在多边形里面
  8. 2023年网络安全比赛--网页渗透测试中职组(超详细)
  9. 5.1再次优化httpserver
  10. “百思不得姐,2021最新Java面试笔试题目分享