【问题标题】:Redux - where to prepare dataRedux - 在哪里准备数据
【发布时间】:2016-05-27 14:29:52
【问题描述】:

我是 Redux 的新手,我有一个问题。我有一组处于状态的对象,在该数组中添加一个新对象后,我想更改所有其他对象。例如,像这样:

[{id : 0, visible: false}, {id : 1, visible: true}] - old array
[{id : 0, visible: false}, {id : 1, visible : false}, {id : 2, visible : true}] - that I want

我应该在哪里准备旧状态?正如 redux 文档所说,在 reducer 中我不应该用状态做任何事情,我只需要返回新状态。我可以在 reducer 中编写函数来准备先前状态的副本并作为新状态返回吗?比如:

export function ui(state = initialState, action){
switch (action.type){
  case "SOME_ACTION" :
    var newState = someFunction(state.items, action)
    return Object.assign({}, state, {
      items : newState
    });
  default:
     return state;
  }}

function someFunction(array, action){
    .... some code
    return newArray
}

或者我应该把这个功能放在另一个地方?在 state 中编辑数据的最佳做法是什么?

【问题讨论】:

    标签: javascript reactjs redux


    【解决方案1】:

    所有对状态的修改都应该在你的 reducer 中完成。当您以不可变的方式进行操作时,返回新状态和修改旧状态是一回事。也就是说,新状态是来自旧状态的数据,可能已修改,并带有新数据。

    根据你的例子,我可能会这样做:

    function rootReducer(state = initialState, action) {
     switch(action.type) {
       case: "SOME_ACTION":
        var allStateVisibleFalse = state.map(x => Object.assign({}, x, { visible: false} ));
        return [...allStateVisibleFalse, { id: 2, visible: true}];
     }
     ...
    }
    

    【讨论】:

    • 好的,但是如果状态需要一些“不纯”的改变呢?就像-此刻我需要状态列表中的所有对象道具都变成Math.random()?我想那它需要采取行动,但行动如何才能获得状态?
    • 你能告诉我更多关于你想要做什么的信息吗?我目前不了解您的用例。
    • 我想我解决了这个问题,在 redux 中我只是 getState 在 action thunk 中返回新的状态元素,而不是在 reducer 中我将它合并到新状态。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-19
    • 2020-01-10
    • 1970-01-01
    • 2010-12-13
    • 2016-02-21
    相关资源
    最近更新 更多