微信小程序开发,在js页Page({ data: { current: wx.getStorageSync('visits').length, },这样写current为什么取不到length?
时间: 2024-03-06 15:47:49 浏览: 68
可能是因为在调用 `wx.getStorageSync('visits').length` 时,`wx.getStorageSync('visits')` 返回的是一个异步对象,而此时该异步对象还未完成,因此调用 `.length` 会返回 undefined。
为了解决这个问题,我们可以将获取 visits 数据的逻辑放在页面的 `onLoad` 生命周期函数中,确保数据已经获取到后再进行操作。具体代码如下:
```
Page({
data: {
current: 0
},
onLoad: function() {
let visits = wx.getStorageSync('visits') || [];
this.setData({
current: visits.length
});
}
});
```
这段代码中,我们使用 `wx.getStorageSync('visits')` 获取 visits 数据,如果该数据不存在,则将其设置为一个空数组。然后在 `onLoad` 生命周期函数中,将 visits 数组的长度设置为页面的 current 数据,以便在页面中使用。注意,由于 `wx.getStorageSync` 方法是同步方法,因此可以确保在 onLoad 函数中获取到 visits 数据。
相关问题
以下代码可以优化吗?如果可以请给出优化代码并注释const app = getApp(); function formatDate(date) { const year = date.getFullYear(); const month = date.getMonth() + 1; const day = date.getDate(); return `${year}-${month < 10 ? '0' + month : month}-${day < 10 ? '0' + day : day}`; } Page({ data: { visits: wx.getStorageSync('visits'), dateString: "", current: 0, laifangzongrenshu: "", filteredDataArray: [], }, you: function () { var that = this; var current = that.data.current; if (current < that.data.visits.length - 1) { that.setData({ current: current + 1, }) } let dateString = that.data.dateString; let date = new Date(dateString); date.setDate(date.getDate() + 1); let year = date.getFullYear(); let month = date.getMonth() + 1; let day = date.getDate(); let nextDay = year + '-' + (month < 10 ? '0' + month : month) + '-' + (day < 10 ? '0' + day : day); this.setData({ dateString: nextDay, }); }, zuo: function () { var that = this; var current = that.data.current; if (current > 0) { that.setData({ current: current - 1, }) } let dateString = that.data.dateString; let date = new Date(dateString); date.setDate(date.getDate() - 1); let year = date.getFullYear(); let month = date.getMonth() + 1; let day = date.getDate(); let prevDay = year + '-' + (month < 10 ? '0' + month : month) + '-' + (day < 10 ? '0' + day : day); this.setData({ dateString: prevDay, }); },})
可以对代码进行如下优化:
```js
const app = getApp();
function formatDate(date) {
const year = date.getFullYear();
const month = date.getMonth() + 1;
const day = date.getDate();
return `${year}-${month.toString().padStart(2, '0')}-${day.toString().padStart(2, '0')}`;
}
Page({
data: {
visits: wx.getStorageSync('visits'),
dateString: formatDate(new Date()),
current: 0,
},
you() {
const current = this.data.current;
if (current < this.data.visits.length - 1) {
this.setData({
current: current + 1,
});
}
const dateString = this.data.dateString;
const nextDate = new Date(new Date(dateString).getTime() + 24 * 60 * 60 * 1000);
this.setData({
dateString: formatDate(nextDate),
});
},
zuo() {
const current = this.data.current;
if (current > 0) {
this.setData({
current: current - 1,
});
}
const dateString = this.data.dateString;
const prevDate = new Date(new Date(dateString).getTime() - 24 * 60 * 60 * 1000);
this.setData({
dateString: formatDate(prevDate),
});
},
});
```
优化思路:
1. 将日期格式化代码封装成一个函数`formatDate`,并使用`padStart`函数补全日期格式中的0。
2. 在`data`中的`dateString`字段中,直接存储格式化后的当天日期,而不是默认为空字符串。
3. 在点击左右按钮时,使用`const`代替`var`,并直接在`setData`中更新数据。
4. 在点击左右按钮时,使用`new Date(dateString)`获取日期对象,而不是使用`new Date()`再转换成日期对象。
5. 在点击左右按钮时,使用`getTime()`获取日期的时间戳,再加上或减去24小时的毫秒数,最后使用`new Date()`将时间戳转换成日期对象。
这样做的好处是,代码更加简洁易读,同时也提高了代码的可维护性。
不需要存储到其他变量中,以最优化的代码剔除wx.getStorageSync('visits')里面的重复值,更新wx.getStorageSync('visits')保证里面的值是不重复的
可以直接对原 visits 数组进行操作,将已经遍历过的日期从数组中删除,最终 visits 数组中就会保留不重复的数据。具体代码如下:
```
let visitedDates = new Set();
for(let i = 0; i < visits.length; i++) {
let currentDate = visits[i].date;
if(visitedDates.has(currentDate)) {
visits.splice(i, 1);
i--; // 因为删除了一个元素,所以需要将 i 向前移动一位
} else {
visitedDates.add(currentDate);
}
}
wx.setStorageSync('visits', visits);
```
这段代码与之前的代码唯一的区别就是在遍历 visits 数组时,直接对 visits 数组进行操作,将已经遍历过的日期从数组中删除。最后再调用 wx.setStorageSync 方法,将更新后的 visits 数组存储到本地缓存中。
阅读全文