当前位置: 首页 > 知识库问答 >
问题:

在Redux reducer中设置深度嵌套对象,不将更新传播到我的组件

卫君博
2023-03-14

我试图通过一个reducer在我的react.js/redux应用程序中设置一个深度嵌套的对象,但是对象更改并没有传播到我的组件中。我应该如何更新和mapStateToProps这样的对象?

我已经尝试了…在我的reducer中添加我的操作的有效负载,在mapStateToProps中映射一个更高级别的对象,并将我映射到组件道具的对象扁平化。

我的初始状态:

const initialState = {
    myObject : {
        prop1 : {
            prop2 : {
                array1 : [],
                array2: [],
                array3: []
            }
        }
    }
}
const app = (state = initialState, action) => {
  switch(action.type) {
    case SET_DATA:
      return {
        ...state,
        myObject: action.payload
      };
  } default:
      return state;
}

export default app;
class Component extends React.PureComponent() {
    render() {
        return (
            {
                JSON.stringify(this.props.componentObject)
            }
        );
    }
}

function mapStateToProps(state) {
    return {
        componentObject: state.myObject
    };
}

export default connect(mapStateToProps)(Component);
export function setData(newDeeplyNestedObject) {
  return {
    type: SET_DATA,
    payload: newDeeplyNestedObject
  };
}

结果是我的组件没有显示Redux的状态。似乎Redux没有检测到组件道具中的更改,因此没有更新组件。有谁能告诉我当一个深度嵌套的对象结构发生变化时,如何确保Redux向我的组件发送更新?

我知道Redux对更新做了一个肤浅的比较,但我觉得在我的reducer中使用json.parse(json.stringify())不是正确的方向。

共有1个答案

戈嘉慕
2023-03-14

1)通过以下方式实现存储:从“redux”导入{createStore};导出const store=createStore(app)//传入reducer名称

2)在mapStateToProps中,访问您的myObject状态,例如:函数mapStateToProps(state){return{myObject:state.myObject}};

3)绑定您的操作调度程序:

   import {bindActionCreators} from "redux";
   const mapDispatchToProps = dispatch =>(bindActionCreators({setData}, dispatch));
   //Now we can use the setData action creator as this.props.setData()
export default connect(mapStateToProps,mapDispatchToProps)(Component);

5)假设您在INITIAL_STATE中定义了myObjects,例如:

    myObject : {
        prop1 : {
            prop2 : {
                array1 : [{a:'1'},{b:'2'}],
                array2: [{q:'6'},{w:'4'}],
                array3: [{m:'9'},{n:'0'}]
            }
        }
    }
};

6)现在,您需要使用任何changeHandlers或按下按钮来启动操作函数setData,并传递您想作为参数添加的新对象。操作符)并追加要添加的新项。假设您想对onClick事件触发操作并更改array1值:

<input type="button" onClick={()=>this.props.setData({...this.props.myObject.prop1.prop2,array1:[{changedA:'21'},{changedB:'32'}]})}/>

这将触发该操作,并且只有array1将被更改。类似地,您可以对任何嵌套对象执行此操作。无论要做什么更改,都必须分散对象,然后追加新项

 类似资料:
  • 嗨,伙计们,我有一个问题,从一开始,我会提到我已经尝试过这个和这个 我的情况如下。我有API,它发送给我 根目录处于组件状态! 我如何更新,,,,,与?最后一个约束是我不能更改root的名称(我不能将其重命名为newRoot等) 我尝试的是调用这个函数: 因此:

  • 我需要更新嵌套在我的用户文档中的一个字段,该字段包含一个part对象数组,以添加新的part。一个part对象如下所示: 所以这意味着$addToset对我的情况没有好处...现在我不知道该怎么办。

  • 我试图更新嵌套数组中的对象,下面是我的状态示例。我试图在目标内更新对象,我成功地更新了对象。 但是 每次我更新任何对象。索引0处的对象将获得所有对象的副本。我更新的次数越多,它就会创建更多的副本,它们就会嵌套在索引0处的对象中。 索引0处的对象也将使用任何对象的最新更新进行更新。 keyName=列表中对象的索引。(位于“0”和“1”上方的两个值:{) 此外,如果你知道任何好的留档或规范化的教程,

  • 问题内容: 我正在寻找一种使用dict update内容更新dict dictionary1的方法 我知道update会删除level2中的值,因为它正在更新最低的密钥level1。 鉴于dictionary1和update可以有任何长度,我该如何解决? 问题答案: @FM的答案具有正确的总体思路,即递归解决方案,但有些特殊的编码和至少一个错误。我建议改为: Python 2: Python 3:

  • 假设我们有以下集合,我对此没有什么问题: > 我想增加“item_name”的价格:“my_item_two”,如果它不存在,应该将它追加到“items”数组中。

  • 我有一个深度嵌套的文档结构,如下所示: 我正在尝试更新集合以插入新配置,如下所示: 我正在mongo(Python)中尝试类似的内容: 但是,我得到了“如果没有包含数组的相应查询字段,则无法应用位置运算符”错误。在mongo这样做的正确方式是什么?这是mongo v2。4.1.