微信小程序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指向改变,调取不到自己想改变的数据了。(大致理解这样,参考博文提及了闭包和自执行函数,不是特别明白)
参考博文: