【微信小程序】之监听函数

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

watch.js

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()等方法并不会触发监听函数。

index.js

测试类

//index.js
//获取应用实例
const app = getApp()
import * as watch from "../../utils/watch.js";

Page({
  data: {
    motto: 'Hello World'
  },
  onReady: function() {
    //启用数据监听
    watch.setWatcher(this);
  },
  watch: {
    motto: function(newVal, oldVal) {
      console.log(newVal, oldVal);
    }
  },
  ss: function() {
    if ('Hello World' == this.data.motto) {
      this.setData({
        motto: '你好,世界'
      })
    } else {
      this.setData({
        motto: 'Hello World'
      })
    }
  }
})

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

index.wxml

测试页面

<text bindtap='ss'>{{motto}}</text>

供参考!
参考文章

当在微信小程序使用组件时,可以通过监听函数来实现组件和页面之间的交互。下面是一个示例,展示了如何在微信小程序使用组件监听函数: 1. 在组件的js文件定义监听函数: ```javascript Component({ methods: { // 监听函数 onTap: function(e) { // 执行某些操作 console.log('组件被点击了'); // 触发自定义事件,将数据传递给页面 this.triggerEvent('myEvent', { value: 'Hello World' }); } } }) ``` 2. 在页面的wxml文件引入组件,并绑定监听函数: ```html <view> <!-- 引入组件,并绑定监听函数 --> <my-component bind:myEvent="onComponentEvent"></my-component> </view> ``` 3. 在页面的js文件定义监听函数的回调方法: ```javascript Page({ // 监听函数的回调方法 onComponentEvent: function(e) { // 获取传递过来的数据 var value = e.detail.value; // 执行某些操作 console.log('接收到组件传递的数据:', value); } }) ``` 在以上示例组件定义了一个名为`onTap`的监听函数,并在函数内部执行了一些操作,并通过`triggerEvent`方法触发了一个自定义事件`myEvent`,并将数据`{ value: 'Hello World' }`传递给页面。 在页面引入该组件时,使用`bind:myEvent`将页面的`onComponentEvent`方法绑定到组件的`myEvent`事件上。当组件内部的`onTap`监听函数被触发时,会执行`triggerEvent`方法,触发`myEvent`事件,并将数据传递给页面的`onComponentEvent`方法。 页面的`onComponentEvent`方法就是监听函数的回调方法,可以在该方法内部获取传递过来的数据,并执行一些操作。 这样,组件和页面之间就可以通过监听函数进行交互了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值