React Context API-Reducer编辑整个对象而不是其属性

问题描述

所以在我的状态下,我有一个帖子数组,每个帖子都是这样的:

{
    "likes": 1,"comments": [],"_id": "5f3eb143167cbe1014ecdf3d","user": {
        "_id": "5f39496b7e78810b801b3ff8","name": "jon doe"
    },"title": "post 1","img_url": "https://url.com","date": "2020-08-20T17:22:11.324Z","__v": 1
}

我有一个函数喜欢我的操作中的帖子,这里是:

    const postAddLike = async (id) => {
        try {
            const res = await axios.put(`/api/posts/like/${id}`)
            console.log(res.data)
            dispatch({
                type: POST_ADD_LIKE,payload: res.data
            })
            
        } catch (err) {
        
        }
    }

API运行良好,并且确实类似于post,但是我的reducer做了其他事情,这里是reducer:

case POST_ADD_LIKE:
            return {
                ...state,allPosts : state.allPosts.map(post => post._id === action.payload._id ? post.likes = post.likes+1 : post = post)
            }

(allPosts是我处于上下文状态的帖子数组),

我的化简器所做的就是用'1'替换我的整个对象,我想它来自化简器中的'+1',我只是想让'likes'属性增加。 有人帮忙!在此先感谢:D

解决方法

您可以尝试这样的事情

allPosts: state.allPosts.map(post => post._id === action.payload._id ? { ...post,likes: post.likes+1 } : post);

尽管我会说像这样格式化它会使阅读起来更容易

allPosts: state.allPosts.map(post => (
  ...post,likes: post.likes + (post._id === action.payload._id ? 1: 0),)