(Vuejs)添加喜欢和删除喜欢不起作用
(Vuejs) add like and remove like does not work
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
returns -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)
将始终 return -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
循环应该 break
修改相关post
后:
for (let i = 0; i < posts.length; i++) {
if (posts[i]._id == like.post) {
// add or remove like...
break;
}
}
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
returns-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)
将始终 return-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
循环应该 break
修改相关post
后:
for (let i = 0; i < posts.length; i++) {
if (posts[i]._id == like.post) {
// add or remove like...
break;
}
}