like
切换不正常
addLike: (state, like) => {
let posts = state.posts;
for (let i = 0; i < posts.length; i++) {
if (posts[i]._id == like.post) {
if (posts[i].likes.findIndex((el) => el._id === like._id) === -1) {
posts[i].likes.push(like);
}
}
}
},
removeLike: (state, like) => {
let posts = state.posts;
for (let i = 0; i < posts.length; i++) {
if (posts[i]._id == like.post) {
if (posts[i].likes.findIndex((el) => el._id === like._id) === -1) {
posts[i].likes.splice(posts[i].likes.indexOf(like), 1);
}
}
}
}
如果没有问题中的复制,很难说问题是什么,但我看到removeLike()
中的一些问题:
-
if
条件检查like
不是否存在(未找到findIndex
返回-1
):if (posts[i].likes.findIndex((el) => el._id === like._id) === -1) { ^^^^^^
但应该是相反的:
if (posts[i].likes.findIndex((el) => el._id === like._id) >= 0) {
-
like
是一个对象,因此indexOf(like)
将始终返回-1
,而splice(-1, 1)
将删除数组的最后一项,如果预期的like
实际上不是最后一项,这可能是意外的:posts[i].likes.splice(posts[i].likes.indexOf(like), 1); ^^^^
要修复这个错误,缓存
findIndex
的索引,并在随后的splice
中使用它:const likeIndex = posts[i].likes.findIndex((el) => el._id === like._id) if (likeIndex >= 0) { posts[i].likes.splice(likeIndex, 1); }
假设like
只属于单个post
,addLike()
和removeLike()
中的for
-循环在相关post
被修改后应该是break
:
for (let i = 0; i < posts.length; i++) {
if (posts[i]._id == like.post) {
// add or remove like...
break;
}
}