(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是否存在(findIndexreturns -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;
  }
}