微信小程序(三十一)自定义watch监听属性

简介: 微信小程序并没有为我们在普通的页面中提供类似vue中watch类似的监听属性。还是那句话,人家没给,你还想用,自己定义一个。

微信小程序并没有为我们在普通的页面中提供类似vue中watch类似的监听属性。

还是那句话,人家没给,你还想用,自己定义一个。

监听器的原理,将data中需监听的属性写在watch对象中,并给其提供一个方法,当被监听属性的值改变时,调用该方法。

所以,我们需要用到Javascript中的Object.defineProperty()方法,来手动劫持对象的getter/setter,从而实现给对象赋值时(调用setter)执行watch对象中相对应的函数,达到监听效果。

Object.defineProperty()不在这里详细介绍,详情参照《深入浅出Object.defineProperty()

同样,VUE中的watch监听属性滥用会造成性能问题,我这里自定义的watch也是一样的,要适度使用。

一:自定义watch属性:

ini

复制代码

const 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: (value) =>
    {
      watchFun.call(page, value, val);
      val = value;
      if (deep)
      {
        observe(obj, key, watchFun, deep, page);
      }
    },
    get: () => {
      return val;
    }
  });
}
/**
 * @name: 自定义watch 监听属性
 * @author: camellia
 * @date: 2021-11-12
 */
const 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);
  });
}
/**
 * 
// 引入自定义监听属性
const watch = require("../../utils/watch.js");
Page({
  data: {
    name: "时间里的"
  },
  onLoad() {
    watch.setWatcher(this);
  },
  watch: {
    name: function(newVal, oldVal) {
      console.log(newVal, oldVal);
    }
  }
});
 */
module.exports = {
  setWatcher
};

二:使用watch监听属性

1:文件存放位置

具体文件放在那里,这个纯看个人喜好,我在这里说一下我存放的位置仅供参考。

小程序根目录下的utils目录下:

image.png

2:调用:

(1):引入:

ini

复制代码

// 引入自定义监听属性
const watch = require("../../utils/watch.js");

(2):在onload中实例化监听函数

javascript

复制代码

onLoad() {
    watch.setWatcher(this);
  },

(3):调用watch监听属性:

css

复制代码

watch: {
    name: function(newVal, oldVal) {
      console.log(newVal, oldVal);
    }
  }

以下是完整的代码调用实例:

javascript

复制代码

const watch = require("../../utils/watch.js");
Page({
  data: {
    name: "时间里的"
  },
  onLoad() {
    watch.setWatcher(this);
  },
  watch: {
    name: function(newVal, oldVal) {
      console.log(newVal, oldVal);
    }
  }
});

最后再强调一下,适度的调用watch属性。否则会造成性能问题

有好的建议,请在下方输入你的评论。

欢迎访问个人博客:guanchao.site

欢迎访问我的小程序:打开微信->发现->小程序->搜索“时间里的”

目录
相关文章
|
2月前
|
人工智能 小程序 API
【一步步开发AI运动小程序】十三、自定义一个运动分析器,实现计时计数02
本文介绍如何利用“云智AI运动识别小程序插件”开发AI运动小程序,详细解析了俯卧撑动作的检测规则构建与执行流程,涵盖卧撑和撑卧两个姿态的识别规则,以及如何通过继承`sports.SportBase`类实现运动分析器,适用于小程序开发者。
|
2月前
|
人工智能 小程序 API
【一步步开发AI运动小程序】十二、自定义一个运动分析器,实现计时计数01
随着AI技术的发展,AI运动APP如雨后春笋般涌现,如“乐动力”、“天天跳绳”等,推动了云上运动会、线上健身等热潮。本文将指导你从零开始开发一个AI运动小程序,利用“云智AI运动识别小程序插件”,介绍运动识别原理、计量方式及运动分析器基类的使用,帮助你在小程序中实现运动计时和计数功能。下篇将继续探讨运动姿态检测规则的编写。
|
4月前
|
小程序
微信小程序动态tabBar实现:基于自定义组件,灵活支持不同用户角色与超过5个tab自由组合(更新版)
微信小程序动态tabBar实现:基于自定义组件,灵活支持不同用户角色与超过5个tab自由组合(更新版)
870 1
|
4月前
|
小程序 搜索推荐 API
微信小程序:自定义关注公众号组件样式
尽管关注公众号组件的样式固定且不可修改,但产品经理的需求却需要个性化的定制。在这种情况下,我们需要寻找解决方案,以满足这些特殊需求,尽管这可能有点棘手。
135 0
微信小程序:自定义关注公众号组件样式
|
5月前
|
小程序 前端开发 索引
微信小程序中的条件渲染和列表渲染,wx:if ,wx:elif,wx:else,wx:for,wx:key的使用,以及block标记和hidden属性的说明
这篇文章介绍了微信小程序中条件渲染和列表渲染的使用方法,包括wx:if、wx:elif、wx:else、wx:for、wx:key以及block标记和hidden属性的使用。
微信小程序中的条件渲染和列表渲染,wx:if ,wx:elif,wx:else,wx:for,wx:key的使用,以及block标记和hidden属性的说明
|
6月前
|
小程序 开发者
Taro@3.x+Vue@3.x+TS开发微信小程序,使用自定义tabBar
本文介绍了如何在Taro项目中实现自定义tabBar。首先,在`app.config.ts`中设置`custom: true`并配置`tabBar`。
246 0
Taro@3.x+Vue@3.x+TS开发微信小程序,使用自定义tabBar
|
6月前
|
Web App开发 缓存 小程序
【Azure API 管理】从微信小程序访问APIM出现200空响应的问题中发现CORS的属性[terminate-unmatched-request]功能
【Azure API 管理】从微信小程序访问APIM出现200空响应的问题中发现CORS的属性[terminate-unmatched-request]功能
|
27天前
|
小程序 前端开发 关系型数据库
基于Uniapp+php校园小程序,校园圈子论坛系统功能,校园跑腿二手交流功能设计
校园圈子论坛及综合服务平台集成了校园跑腿、兼职信息、外卖团购、闲置交换、租赁服务、表白墙等多功能模块,提供一站式校园生活解决方案。系统采用uniapp前端和PHP后端开发,支持多城市、多学校切换,配备分站式后台管理,确保稳定性和安全性。通过融云IM SDK实现即时通讯功能,增强用户互动与粘性。适用于大学校园、城市及社区圈子,满足多样化需求,提升便捷体验。
|
30天前
|
移动开发 小程序
thinkphp+uniapp开发的多端商城系统源码/H5/小程序/APP支持DIY模板直播分销
thinkphp+uniapp开发的多端商城系统源码/H5/小程序/APP支持DIY模板直播分销
27 0
|
1月前
|
移动开发 小程序 前端开发
超详细攻略!uniapp陪玩系统,打包陪玩小程序、H5需要注意什么?
陪玩系统的打包过程涵盖APP、小程序和H5平台。APP打包需使用uni-app开发工具,配置项目信息并选择云打包;小程序打包需在微信公众平台注册账号并提交审核;H5打包则直接通过uni-app生成文件并上传至服务器。各平台需注意权限配置、代码规范及充分测试,确保应用稳定性和兼容性。

热门文章

最新文章