首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >React redux -更新状态中的嵌套数组

React redux -更新状态中的嵌套数组
EN

Stack Overflow用户
提问于 2017-11-23 23:20:29
回答 4查看 2.4K关注 0票数 1

我正在尝试react redux中的一些应用程序,但我在更新(推送、移除、更新)状态中的嵌套数组时遇到了问题。

我有一个名为service的对象,如下所示:

代码语言:javascript
运行
复制
{
    name: 'xzy',
    properties: [
       { id: 1, sName: 'xxx'},
       { id: 2, sName: 'zzz'}, 
    ]
}

无论我在带有属性集合的reducer中做了什么(在将属性添加到集合的情况下),都会产生问题,即所有属性的值与我最近添加的最后一个属性的值相同。->添加的属性对象位于服务属性集合中,但操作将替换此集合中所有属性中的所有值。我的reducer:

代码语言:javascript
运行
复制
export function service(state = {}, action) {
        switch (action.type) {
            case 'ADD_NEW_PROPERTY':
                console.log(action.property) // correct new property
                const service = {
                    ...state, properties: [
                        ...state.properties, action.property
                    ]
                }
                console.log(service); // new property is pushed in collection but all properties get same values
                return service

            default:
                return state;
        }
    }

我尝试了一些使用不变性帮助器库的解决方案,它产生了同样的问题:

代码语言:javascript
运行
复制
export function service(state = {}, action) {
    case 'ADD_NEW_PROPERTY':

                return update(state, {properties: {$push: [action.property]}})

            default:
                return state;
        }

例如,当我将新属性{ id: 1, sName: 'NEW'}添加到上面的示例中时,我将获得以下状态:

代码语言:javascript
运行
复制
{
    name: 'xzy',
    properties: [
       { id: 1, sName: 'NEW'},
       { id: 1, sName: 'NEW'}, 
       { id: 1, sName: 'NEW'}
    ]
}

有人能帮忙吗?:)

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-11-23 23:54:08

也要复制一份action.property。无论调度此操作的是什么,它都可能重用相同的对象。

代码语言:javascript
运行
复制
export function service(state = {}, action) {
  switch (action.type) {
    case 'ADD_NEW_PROPERTY':
      console.log(action.property) // correct new property
      const service = {
        ...state,
        properties: [
          ...state.properties, 
          { ...action.property }
        ]
      }
      console.log(service); // new property is pushed in collection but all properties get same values
      return service

    default:
      return state;
  }
}

票数 2
EN

Stack Overflow用户

发布于 2017-11-24 01:15:08

我建议您使用不可变的数据https://facebook.github.io/immutable-js/docs/#/List

代码语言:javascript
运行
复制
import { fromJS, List } from 'immutable';

const initialState = fromJS({
  propeties: List([{ id: 1, sName: 'xyz' }]
}

function reducer(state = initialState, action) {
  case ADD_NEW_PROPERTY:
    return state
      .update('properties', list => list.push(action.property));
 // ...
}
票数 1
EN

Stack Overflow用户

发布于 2017-11-23 23:38:41

您的服务缩减程序可能看起来有点像这样:

代码语言:javascript
运行
复制
// Copy the state, because we're not allowed to overwrite the original argument
const service = { ...state }; 
service.properties.append(action.property)
return service
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47458735

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档