博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
微信小程序,实现 watch 属性,监听数据变化
阅读量:6429 次
发布时间:2019-06-23

本文共 1584 字,大约阅读时间需要 5 分钟。

目标

在微信小程序实现 watch 属性,监听 data 中的属性,当被监听属性的值改变时,执行我们指定的方法。​​

思路

Vue 的 computedwatch 可以很方便的检测数据的变化,从而做出相应的改变,所以,模仿 vue 肯定是一个不错的选择。

与 Vue 一样,我们使用 ES5 的Object.defineProperty()方法,劫持对象的 getter/setter,从而实现给对象赋值时(调用 setter),执行 watch 对象中相对应的函数,达到监听效果。

代码

不啰嗦,上代码,真实可用。

function observe(obj, key, watchFun, deep, page) {  let val = obj[key];  if (val != null && typeof val === "object" && deep) {    Object.keys(val).forEach((item) => {      observe(val, item, watchFun, deep, page);    });  }  Object.defineProperty(obj, key, {    configurable: true,    enumerable: true,    set: function(value) {      watchFun.call(page, value, val);      val = value;      if (deep) {        observe(obj, key, watchFun, deep, page);      }    },    get: function() {      return val;    }  });}export function setWatcher(page) {  let data = page.data;  let watch = page.watch;  Object.keys(watch).forEach((item) => {    let targetData = data;    let keys = item.split(".");    for (let i = 0; i < keys.length - 1; i++) {      targetData = targetData[keys[i]];    }    let targetKey = keys[keys.length - 1];    let watchFun = watch[item].handler || watch[item];    let deep = watch[item].deep;    observe(targetData, targetKey, watchFun, deep, page);  });}复制代码

注意事项:

  • watch 只能监听已存在的属性,数组的 push()pop()等方法并不会触发监听函数。

使用

import * as watch from "./watch.js";Page({  data: {    name: "二狗子"  },  onLoad() {    watch.setWatcher(this);  },  watch: {    name: function(newVal, oldVal) {      console.log(newVal, oldVal);    }  }});复制代码
  • 首先在需要的页面引入
  • 在 Page 的onLoad钩子设置监听器

然后就可以愉快的使用了。

总结

watch 会使代码更简洁,逻辑更清晰,在响应式数据处理上很方便。

转载地址:http://ignga.baihongyu.com/

你可能感兴趣的文章
jsp入门
查看>>
ORM之轻量级框架--Dapper
查看>>
自动化邮件报告平台-邮件发送highchart图表
查看>>
进程池的返回值
查看>>
053(二十一)
查看>>
ADO.NET笔记——执行事务
查看>>
QueryString 传值
查看>>
小谈一下反射
查看>>
C#调用SQlite常见问题汇总
查看>>
动态规划的简洁说明
查看>>
java中对MySql的配置
查看>>
K - Kia's Calculation (贪心)
查看>>
android笔试题一
查看>>
【JavaEE企业应用实战学习记录】getConnListener
查看>>
了解轮询、长轮询、长连接、websocket
查看>>
bzoj2427[HAOI2010]软件安装
查看>>
bzoj1593[Usaco2008 Feb]Hotel 旅馆*
查看>>
WPF个人助手更新
查看>>
NLPIR技术助力中文智能数据挖掘
查看>>
python操作redis--------------数据库增删改查
查看>>