我有一个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}};
以上都没有解决问题。
答案 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
的更多信息