Redux - 通过其键在状态数组中查找对象并更新其另一个键

Posted

技术标签:

【中文标题】Redux - 通过其键在状态数组中查找对象并更新其另一个键【英文标题】:Redux - Find object in state array by its key and update its another key 【发布时间】:2017-12-01 01:49:29 【问题描述】:

我正在开发一个在后端使用 NodeJS 并在前端使用 React + Redux 的 CRUD 应用程序。这是其中所有工作方式的快速模式:

添加项目

    用户输入帖子的标题 然后将标题发送到调度,该调度在 NodeJS 中获取 POST 路由并通过正文发送标题 在 NodeJS 路由中,我在集合中添加一个具有该标题的新项目

BACKEND DONE,新帖子在服务器中

    我在第 2 步的 dispatch 函数上添加了 .then()。其中我使用 type: 'ADD_POST'post: post 调度了一个动作(我从 NodeJS res.json(post: result from database) 收到了帖子)

    在我的减速器中,我设置了一个CASE 'ADD_POST': return action.post

FRONTEND DONE,同一篇文章现在对用户可见而无需刷新

我想使用相同的逻辑来更新特定帖子的。这是我到目前为止所做的:

    点击帖子上的按钮会触发获取 NodeJS PUT 路由的调度 NodeJS 路由使用 ID 找到帖子,并将帖子的喜欢的旧值加 1

BACKEND DONE,帖子现在在服务器中多了 1 个赞

    我再次将.then 添加到获取NodeJS 路由的调度中,在该调度中我使用type 'ADD_LIKE'post ID 调度我更新的操作

    在 reducer 中,我设置了一个 CASE 'ADD_LIKE':,它使用以下 sn-p 中的代码遍历状态。

这是sn-p:

state.map(item => 
    if(item.id === action.postid) 
      //i find the specific item, but now im stuck on how to update the likes property of it
    
)

如果有帮助,这是我一直在看的播放列表,如果你想看看这家伙是如何实现删除功能的,我想用同样的逻辑添加点赞功能:Link to playlist

【问题讨论】:

【参考方案1】:
state.map(item => 
    if (item.id !== action.postid) return item; // no need to change other items
    const likes = item.likes;
    return Object.assign(, item, likes: likes + 1); // [1]
);

[1] 行创建一个新对象,该对象具有item 的所有相同属性,但它会覆盖现有属性likes 并简单地添加1

确保您实际上为 reducer 中更改的项目创建了一个新对象,因为您的状态中的所有内容都应该是不可变的。

【讨论】:

以上是关于Redux - 通过其键在状态数组中查找对象并更新其另一个键的主要内容,如果未能解决你的问题,请参考以下文章

如果对象数组中两个不同对象的两个键在JavaScript中相同,则通过键查找对象[重复]

不可变状态更新。在 Redux 中更新对象数组

Redux reducer,检查状态数组中是不是存在值并更新状态

在redux中更新深层嵌套数组

在 Redux 状态下更新单个值

在 Redux 中更新递归对象状态