微信小程序中使用watch监听

想直接使用的走这边 https://blog.csdn.net/singlever/article/details/106276787

Vue里面的监听很方便,虽然很消耗资源,但确实有些时候极大提升了开发效率

我的案例是写在component组件里面的,当然page页面也是一样的,把 attached 换成 onload
把 watch 直接写入 Page 里面即可

注意,使用defineProperty重构get和set之后,一定要写入get,不然会出现数据监听后赋值正常,但访问为undefined的情况

Component({
  properties: {},
  data: {
    // 这里是一些组件内部数据
    ze:'123',
    dd:'312'
  }, 
  methods: {
    watch(){
      return{
        ze:(val) => {
          console.log(val)
        }
      }
    },
    btns(){
      this.setData({ze:321})
    }
  },
  attached(){   //类似于beforeMounted 组件挂载前
    Object.keys(this.watch()).some(item => {
      Object.defineProperty(this.data,item,{
        set:this.watch()[item]
      })  
    })
  }
})

需要监听的变量,和vue的写法一样,写入watch中,不过,这里要加到 return 中即可 例如 例子 ze
如果监听需要调用到  this.setData()  把监听的函数结构换成箭头函数 例如 例子 ze

总的来说没有什么技术难点,主要依靠原生的Object APi   Object.defineProperty() 没有学过的可以看下

跟进:
如果直接在watch中直接把val赋值给变量,这里只在逻辑层发生了变化,如果要将数据同步到视图层,在watch中直接setData会报错例如:
 

        ze:(val) => {
          this.setData({ze:val})
        }
//erorr

因为本质上watch中的ze函数是本质是个set,在一个变量的set中给自己赋值,这是个死循环,当然会报错,可能会有更好的办法
因为某些原因暂时没时间了,给出
方法1:
 

Component({
  properties: {},
  data: {
    // 这里是一些组件内部数据
    ze:'123', //逻辑层数据
    dd:'312', //视图层数据
  }, 
  methods: {
    watch(){
      return{
        ze:(val) => {
          this.setData({dd:val})
        }
      }
    }
  }


通过监听ze去改变dd,dd就相当于ze在视图层的替身,问题:1.变量浪费  2.不好看(hhh)

// 2020 5.22
抽空封装了下 https://blog.csdn.net/singlever/article/details/106276787

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值