目录

微信小程序this.setData与that.setData的区别,挖坑自填系列

目录

微信小程序this.setData({})与that.setData({})的区别,挖坑自填系列

今天修改微信小程序的bug:滑动删除功能页面不能及时刷新页面、更新数据。以下是滑动删除功能的js代码截选。

const app = getApp()

Page({
  data: {
    clist: [],
    isOver: false,
    loading: true,
    startX: '',
    startY: ''
  },
 // 给每一项设置x值
  setListX() {
      this.data.clist.map(item => {
          item.x = 0;
      })
      this.setData({
          clist: this.data.clist
      })
  },
  // 开始滑动
  touchMoveStartHandle(e) {
    // 我们要记录滑动开始的坐标点,后面计算要用到
      if (e.touches.length == 1) {
          this.setData({
              startX: e.touches[0].clientX,
              startY: e.touches[0].clientY
          });
      }
  },
  // 滑动事件处理,一次只能滑出一个删除按钮 为了防止滑动出现抖动,我们用滑动结束事件
  touchMoveEndHandle: function (e) {
      var currentIndex = e.currentTarget.dataset.index, //当前索引
          startX = this.data.startX, //开始X坐标
          startY = this.data.startY, //开始Y坐标
          touchMoveEndX = e.changedTouches[0].clientX, //滑动变化X坐标
          touchMoveEndY = e.changedTouches[0].clientY, //滑动变化Y坐标
          //获取滑动角度
          angle = this.angle({
              X: startX,
              Y: startY
          }, {
              X: touchMoveEndX,
              Y: touchMoveEndY
          });
      //滑动超过50度角 return,防止上下滑动触发
      if (Math.abs(angle) > 50) return;
      this.data.clist.map((item, index) => {
          if (touchMoveEndX > startX) {
              // 右滑
              if (index == currentIndex) item.x = 0;
          } else {
              // 左滑
              item.x = -120
              if (index != currentIndex) item.x = 0;
          }
      })
      this.setData({
          clist: this.data.clist
      })
  },
  /**
   * 计算滑动角度
   * start 起点坐标
   * end 终点坐标
   * Math.PI 表示一个圆的周长与直径的比例,约为 3.14159;PI就是圆周率π,PI是弧度制的π,也就是180°
   */
  angle: function (start, end) {
      var _X = end.X - start.X,
          _Y = end.Y - start.Y
      return 360 * Math.atan(_Y / _X) / (2 * Math.PI);
  },
  // 删除收藏方法,获取诗词id从表中删除对应的记录
  rmCollect(e){
    let i = 0
    let that = this
    let {clist} = this.data
    wx.showModal({
      title: '提示',
      content: '确认要删除此条信息么?',
      success: function(res) {
        if (res.confirm) {
          console.log('用户点击确定')
          // 首先处理一下clist,把选中的删除,所以把index序号放入i,从clist中把它的对应项删除
          i = e.currentTarget.dataset.index
          console.log(i)
          //删除起始下标为1,长度为1的一个值(len设置1,如果为0,则数组不变) 
          // var arr = ['a','b','c','d']; 
          clist.splice(i, 1); 
          console.log(clist); 
          that.setData({
            clist: clist
          })
          // 监听touch事件,平移布局显示和隐藏删除按钮
          wx.cloud.callFunction({
            name: 'update',
            data: {
              database: 'collection',
              id: 'collect' + app.globalData.openid,
              data: {
                collectList: clist
              },
            }, 
            success: function (res) {
              console.log(res)
             },
            fail: console.error
            //  不能刷新页面
          })
        } else if (res.cancel) {
          console.log('用户点击取消')
        }
      }
    })
  }
})

其中,this.setData({})用于将数据从逻辑层发送到视图层(异步),同时改变对应的 this.data 的值(同步)。用this.data而不用this.setData({})会造成页面内容不更新的问题。

在javascript中, 在默认情况下 ,this会指向一个已经初始化的window对象。不论有多少全局变量,全局函数,默认都是追加到window对象上。所以,在这种情况下无论怎么使用this,都是在这个window对象上去查找各种变量,函数等。 在实际编码中 ,this的默认情况只能适用于业务比较简单的场景中。但是在大部分业务场景中,this都需要改变其指向来实现一定的业务逻辑。

谁调用this,this就指向谁 ,像Call方法,Apply方法和Bind方法,都会改变this的作用域。

that是存在于内存中的数据,用that替代this以后就不怕this指向改变,调取不到自己想改变的数据了。(大致理解这样,参考博文提及了闭包和自执行函数,不是特别明白)

参考博文: