监听对象中属性变化(一个或多个属性、全部属性)

一、数据监听器

  1. 什么是数据监听器
    数据监听器用于监听和响应任何属性和数据自动的变化,从而执行特定的操作。它的作用类似于vue中的watch侦听器。在小程序中,基本语法格式如下:
Component({
  observers: {
    '字段A,字段B': function(字段A的新值,字段B的新值){

    }
  }
})
  1. 数据监听器的基本用法
<view>n1 的值:{{n1}}</view>
<view>n2 的值:{{n2}}</view>
<view>sum 的值:{{n1}} + {{n2}} = {{sum}}</view>
<button bindtap="addN1">点我 n1 + 1</button>
<button  bindtap="addN2">点我 n2 + 1</button>

// components/test2/test2.js
Component({
  /**
   * 组件的初始数据
   */
  data: {
    sum: 0,
    n1: 0,
    n2: 0
  },

  /**
   * 组件的方法列表
   */
  methods: {
    addN1() {
      this.setData({
        n1: this.data.n1 + 1
      });
    },
    addN2() {
      this.setData({
        n2: this.data.n2 + 1
      })
    }
  },
  // 数据监听器
  observers: {
    'n1, n2': function(n1, n2) {
      this.setData({
        sum: n1 + n2
      })
    }
  }
})

  1. 监听对象属性的变化:支持监听对象中单个或多个属性的变化,语法如下:
Component({
  observers: {
    '对象.属性A, 对象.属性B': function(属性A的新值,属性B的新值) {
      // 触发此监听器的3种情况:
      // 为属性A赋值:使用setData设置 this.data.对象.属性A 时触发
      // 为属性B赋值:使用setData设置 this.data.对象.属性B 时触发
      // 直接为对象赋值:使用setData设置 this.data.对象 时触发
    }
  }
})
  1. 监听对象中所有属性的变化
    如果某个对象中需要被监听的属性太多,可以使用通配符**来监听对象中所有属性的变化,示例代码如下:
observers: {
  'rgb.**': function(obj) {
    this.setData({
      fullColor: `${obj.r}, ${obj.g}, ${obj.b}`
    })
  } 
}

二、案例

  1. 案例实现效果:当点击页面中RGB任意一个按钮,对应的值发生变化,页面上面显示的值变化 并且view组件的背景颜色发生变化。
    在这里插入图片描述
  2. 代码
  • WXML文件
<view style="background-color: rgb({{fullColor}});" class="colorBox">颜色值为:{{fullColor}}</view>
<button size="mini" bindtap="changeR" type="default">R</button>
<button size="mini" bindtap="changeG" type="primary">G</button>
<button size="mini" bindtap="changeB" type="warn">B</button>
<view>rgb的值:{{rgb.r}},{{rgb.g}},{{rgb.b}}</view>
  • WXSS文件
.colorBox {
  color: #fff;
  line-height: 200rpx;
  text-align: center;
  text-shadow: 1rpx 1rpx 2rpx black;
}
  • JS文件
// components/test3/test3.js
Component({
  /**
   * 组件的属性列表
   */
  properties: {

  },

  /**
   * 组件的初始数据
   */
  data: {
    rgb: {
      r: 0,
      g: 0,
      b: 0
    },
    fullColor: '0,0,0'
  },

  /**
   * 组件的方法列表
   */
  methods: {
    changeR() {
      this.setData({
        'rgb.r': this.data.rgb.r + 5 >= 255 ? 255 : this.data.rgb.r + 5
      })
    },
    changeG() {
      this.setData({
        'rgb.g': this.data.rgb.g + 5 >= 255 ? 255 : this.data.rgb.g + 5
      })
    },
    changeB() {
      this.setData({
        'rgb.b': this.data.rgb.b + 5 >= 255 ? 255 : this.data.rgb.b + 5
      })
    }
  },

  observers: {
  	// 监听对象中的一个、或多个属性
    // 'rgb.r,rgb.g,rgb.b': function(r,b,g){
    //   this.setData({
    //     fullColor: `${r},${g},${b}`
    //   })
    // }
    // 监听对象中的全部属性
    'rgb.**': function(obj) {
      this.setData({
        fullColor: `${obj.r}, ${obj.g}, ${obj.b}`
      })
    } 
  }
})

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值