【问题标题】:React reducer how to update nested object using find by id?React reducer 如何使用按 id 查找更新嵌套对象?
【发布时间】:2017-11-03 03:40:11
【问题描述】:

我有以下状态

const initialState = {
    photos: [],
    selectedPhoto:{},
    photosTeamId:'',
    photosProjectId:''
};

photos 是一个数组,其中包含一个 photo 对象,并且在 photo 对象内部,有一个 cmets 数组。我正在尝试找到正确的照片,然后找到正确的评论并更新该评论。

这是我的代码

case actionTypes.COMMENT_UPDATED_TO_PHOTOS:
            console.log(action.data)
            return {
                ...state,
                photos: state.photos.map((photo) => {
                     photo.id === action.data.selectedPhotoId ? {
                        comments: photo.comments.map((comment) => {
                            console.log(comment)
                            return comment.id === action.data.commentId ? { ...comment, comment: action.data.fullComment } : comment
                        })
                    } : photo
                })
            }

【问题讨论】:

  • 这不是你的代码。这是您第一个问题的答案。在这里,您将第二个问题构建为第一个问题及其答案的集合:stackoverflow.com/q/47068926/747579
  • 第一个问题是不同的用例
  • 嗯,好的!对不起阿尔莫格。 @ShubhnikSingh 请您帮忙。
  • 问题在哪里?
  • React reducer 如何使用 find by id 更新嵌套对象?

标签: reactjs react-native redux


【解决方案1】:

代码看起来没问题,除了外部匿名函数周围的花括号。由于这些声明了一个代码块,所以在photo.is === ... 之前应该有一个return 语句,或者您可以将它们完全删除以获得一个表达式:

case actionTypes.COMMENT_UPDATED_TO_PHOTOS:
            console.log(action.data)
            return {
                ...state,
                photos: state.photos.map((photo) =>
                    photo.id === action.data.selectedPhotoId ? {
                        ...photo,
                        comments: photo.comments.map((comment) => {
                            console.log(comment)
                            return comment.id === action.data.commentId ? { ...comment, comment: action.data.fullComment } : comment
                        })
                    } : photo
                )
            }

更新:如 cmets 中所述,还缺少一个 ...photo,

【讨论】:

  • 谢谢,如果我只想更新评论数据,我该怎么做?这里是评论对象 {createdBy: {…},评论:“New jjjj ggggg ggg”,createdAt:“2017- 11-03T02:38:16.828Z", id: "59fbd698e0048b1474207e8f"} 评论:"New jjjj ggggg ggg" createdAt : "2017-11-03T02:38:16.828Z" createdBy : {lastName: "Koren", firstName: " Almog”,全名:“Almog Koren”,id:“59d4821f3c28f634c99e5abf”} id:“59fbd698e0048b1474207e8f”
  • 不完全确定您在这里问的是什么,因为您已经拥有的代码似乎可以做到这一点。您可以通过将其他字段添加到结果对象来更新其他字段,例如{...comment, comment: .., createdAt: ..},或者您可以将要更新的字段放在另一个对象updates 中并使用{...comment, ...updates}。有很多不同的方法。
  • 当我运行更新时,其他字段似乎已被删除,createdAt 不见了?就像它覆盖了一切
  • 此代码将保留每个评论对象中的所有字段,因此如果其他字段消失,则可能是其他问题。也许他们不在该州? (在这种情况下,您的 console.log 语句也不会显示它们)
  • 所以是的,它会更新并保存所有 cmets,但照片中的所有其他对象都消失了,就像在外部照片对象中的 uploadAt 一样
猜你喜欢
  • 2018-06-03
  • 2022-01-25
  • 2021-02-01
  • 2021-12-30
  • 2017-08-08
  • 2020-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多