codecamp

百度智能小程序 数据监听器

数据监听器可以用于监听和响应任何属性和数据字段的变化。数据监听器自小程序基础库版本 3.105.9 开始支持。

使用数据监听器

有时,需要组合监听一些数据字段。

例如,this.data.sum永远是  this.data.numberA 与 this.data.numberB 的和。此时,可以使用数据监听器进行如下实现。

代码示例

开发者工具中预览效果

Component({
    properties: {
        numberA: {
            type: Number,
            value: 0
        },
        numberB: {
            type: Number,
            value: 0
        }
    },
    attached: function() {
        this.setData({
            numberA: 1,
            numberB: 2
        })
    },
    observers: {
        'numberA, numberB': function (numberA, numberB) {
            // 在 numberA 或者 numberB 被设置时,执行这个函数
            this.setData({
                sum: numberA + numberB
            })
        }
    }
});

监听字段语法

数据监听器支持监听属性或内部数据的变化,可以同时监听多个。一次setData最多触发每个监听器一次。

同时,监听器可以监听子数据字段,如下例所示。

代码示例

Component({
    observers: {
        'some.subfield': function(subfield) {
            // 使用 setData 设置 this.data.some.subfield 时触发
            // (除此以外,使用 setData 设置 this.data.some 也会触发)
            subfield === this.data.some.subfield
        },
        'arr[12]': function(arr12) {
            // 使用 setData 设置 this.data.arr[12] 时触发
            // (除此以外,使用 setData 设置 this.data.arr 也会触发)
            arr12 === this.data.arr[12]
        },
    }
});

如果需要监听所有子数据字段的变化,可以使用通配符 **。

Component({
    observers: {
        'some.field.**': function(field) {
            // 使用 setData 设置 this.data.some.field 本身或其下任何子数据字段时触发
            // (除此以外,使用 setData 设置 this.data.some 也会触发)
            field === this.data.some.field
        },
    },
    data: {
        some: {
            field: {
                subfield: [1, 2, 3]
            }
        }
    },
    attached: function() {
        // 会触发 observers
        this.setData({
            'some.field': {}
        });
        
        // 会触发 observers
        // this.setData({
        //     'some.field.xxx': {}
        // });

        // 会触发 observers
        // this.setData({
        //     'some': {}
        // });
    }
});

特别地,仅使用通配符**可以监听全部 setData。

Component({
    observers: {
        '**': function(value) {
            // 数据发生变化即触发,这里的 value 是 properties 和 data 的合集
        }
    }
})

Bugs & Tips

  • 数据监听器监听的是setData中涉及的数据字段,并且只有这些字段发生改变时才会触发,类似observer;
  • 在数据监听器中再次进行setData设置被监听的字段,可能会造成循环监听,请注意使用;
  • 由于小程序对setData进行了优化操作,所以如果同步的多次设置setData那么实际上只会执行最后一次setData引起的observers。

代码示例

Component({
    properties: {
        numberA: {
            type: Number,
            value: 0
        },
        numberB: {
            type: Number,
            value: 0
        }
    },
    attached: function() {
        this.setData({
            numberA: 1,
            numberB: 2
        });
        this.setData({
            numberA: 2,
            numberB: 3
        })
    },
    observers: {
        'numberA, numberB': function (numberA, numberB) {
            // 在 numberA 或者 numberB 被设置时,执行这个函数
            this.setData({
                sum: numberA + numberB
            })
        }
    }
});

以上只会执行一次 observers。


百度智能小程序 behaviors
百度智能小程序 抽象节点
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

百度智能小程序开发文档

百度智能小程序 组件

百度智能小程序 地图

百度智能小程序 画布

百度智能小程序 API

百度智能小程序 界面

百度智能小程序 关注小程序引导组件

百度智能小程序 自定义组件

百度智能小程序 媒体

百度智能小程序 设备

百度智能小程序 拨打电话

百度智能小程序 内存警报

百度智能小程序 手机联系人

百度智能小程序 用户截屏事件

百度智能小程序 第三方平台

百度智能小程序 开放接口

百度智能小程序 百度收银支付

百度智能小程序 分包预下载

百度智能小程序 数据分析

百度智能小程序 服务端

百度智能小程序 云开发

百度智能小程序 初始化

百度智能小程序 云函数

百度智能小程序 服务端初始化

百度智能小程序 服务器获取上下文

百度智能小程序 服务端云函数

百度智能小程序 开发教程

百度智能小程序 功能开发

百度智能小程序 基本原理

百度智能小程序 小程序自动化

百度智能小程序 视频教程

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }