Redux使用双嵌套创建状态

时间:2017-01-11 20:47:59

标签: redux state

我有一个redux应用程序,除其他外,更新单个字符串,因此状态可以反映为:

{
  theDataString: "someString",
  otherData: { ...some other data... },
  someListItems: [  ...a data array... ]
}

因此我有以下减速器:

function updateDataString(state = {}, action) {
  switch (action.type) {
    case UPDATE_DATA_STRING:
      return Object.assign({}, ...state, {theDataString: action.theDataString});
    default:
      return state;
  }
}

但是,在调度UPDATE_DATA_STRING操作时,状态中的theDataString值会变为双重嵌套:

{
  theDataString: {theDataString: "someString"},
  otherData: {... some other data... },
  someListItems: [ ... a data array ... ]
}

已遇到同样的问题here。但是,他们的解决方案是,当没有必要时,他们在单个reducer上调用combineReducers。在我的情况下,我在多个减速器上调用combineReducers - 所以他们的答案对我不起作用。另请注意,其他数据不会出现相同的嵌套问题,只有顶级字符串才会双嵌套。

这里出了什么问题?

编辑: 我正在连接更新theDataString的组件,如下所示:

import {connect} from 'react-redux';
import {updateDataString} from './actions/actions';
import SomeList from './components/someList';

const mapStateToProps = (state) => {
  return {someListItems: state.someListItems}
};

const mapDispatchToProps = (dispatch, placeHolder) => {
  return {
    updateDataString: (aString) => dispatch(updateDataSting(aString))
  }
};


export default SomeListConnected = connect(mapStateToProps, mapDispatchToProps)(SomeList)

操作设置如下:

export const UPDATE_DATA_STRING = 'UPDATE_DATA_STRING';

export function updateDataString(aString) {
  return {type: UPDATE_DATA_STRING, theDataString: aString}
}

EDIT2:改变reducer更新状态的方式是寻找答案的自然场所。但是我在这里尝试了各种排列,效果不大:

Object.assign({}, ...state, {theDataString: action.theDataString});
Object.assign({}, state, {theDataString: action.theDataString});
{...state, {theDataString: action.theDataString}};

以上都没有解决问题。

2 个答案:

答案 0 :(得分:1)

假设您使用了combineReducers,您的updateDataString reducer应该将状态视为字符串,而不是对象:

function updateDataString(state = "", action) {
    switch(action.type) {
        case UPDATE_DATA_STRING: return action.newString;
        default; return state;
    }
}

切片缩减器只会将字符串值视为“状态”,因此您需要以这种方式对待它。

有关该主题的更多信息,请参阅http://redux.js.org/docs/recipes/reducers/UsingCombineReducers.html

答案 1 :(得分:0)

试试这个

return { ...state, theDataString: action.newString};

而不是

return Object.assign({}, ...state, {theDataString: action.newString});

在减速机中。

我认为你以错误的方式使用...点差运算符。而且无需在此使用Object.assign()

阅读有关传播运营商here

的更多信息