【发布时间】:2017-01-26 23:40:39
【问题描述】:
我从视图发送到操作 this.props.appClasses 这是视图:
<div key={key} className='SDWanAppClassTreeItem' onClick={this.props.actions.handleToggleAppClass.bind(this,this.props.appClasses, 0, key)}>
在我修改从视图中获得的 appClasses 的操作中,我想将修改后的 appClasses 发送到 reducer 以更新 appClasses 状态。但它在到达减速器之前给了我一个错误。
检测到状态突变 这是行动:
export function handleToggleAppClass(appClasses, parentAppClassId, appClassId) {
// console.log('handleToggleAppClass', appClassId, this.appClasses[appClassId]);
if (appClass.parentAppClassId == 0) {
// Flip the appClass Show Property
appClasses[appClass.appClassId].show = appClasses[appClass.appClassId].show ? false : true;
if (Object.keys(appClasses[appClass.appClassId].children).length !== 0) {
// Regardless if we enable or disabled the parent, all children should be disabled
for (var childKey in appClasses[appClass.appClassId].children) {
appClasses[appClass.appClassId].children[childKey].show = false;
}
}
} else {
// If we are enabling a child, make sure parent is disabled
if (!appClasses[appClass.parentAppClassId].children[appClass.appClassId].show) {
appClasses[appClass.parentAppClassId].show = false;
}
appClasses[appClass.parentAppClassId].children[appClass.appClassId].show = appClasses[appClass.parentAppClassId].children[appClass.appClassId].show ? false : true;
}
dispatch(handleUpdateInitialSourceFetch(appClasses));
return { type: types.TOGGLE_APP_CLASS, appClasses };
}
如您所见,我确实想修改 action 上的 appClasses,因为我必须使用新修改的 appClasses 来更新另一个 reducer 上的另一个状态。在这里,我想修改 appClasses 状态(在一个 reducer 中)并通过在函数调用 onother action dispatch(handleUpdateInitialSourceFetch(appClasses)) 中调度修改后的 appClasses; 我想修改另一个状态 selection.appClassesIds(在另一个处理用户选择的减速器中):
const selection = {
timespan: "-3660",
direction: 0,
appClassIds: []
};
export function updateAppClassesIds(appClasses) {
var appClassIds = [];
for (var key in appClasses) {
if (appClasses[key].show) appClassIds.push(key);
if (Object.keys(appClasses[key].children).length !== 0) {
// Regardless if we enable or disabled the parent, all children should be disabled
for (var childKey in appClasses[key].children) {
if (appClasses[key].children[childKey].show) appClassIds.push(childKey);
}
}
}
return { type: types.UPDATE_APP_CLASSES_IDS, appClassIds };
}
如何将 appClasses 变量从视图发送到操作而不会出现该错误。 或者我应该将 selection 和 appClasses 状态放在一个大状态中,以便能够访问这两个状态,因为它们相互依赖?
【问题讨论】:
-
appClasses是否已经处于状态?即,您是否直接改变状态? -
Yes 是我从 this.props.appClasses 得到的状态
-
你不能直接改变状态;这是 Redux 的主要理念之一。通常,这种转换不会通过在此处设置整个数组来表示,而是通过传递一个 ID 及其新状态来表示。在 reducer 中,您将复制旧状态并在新的应用程序类状态中拼接。
-
我知道,但是我需要那个变量来发送给动作,它可以是副本或类似的东西,我从帖子中读到有人做了类似 const a = [... this.props.appClasses] 但没有用。如何发送该变量的值?
-
(出于格式原因将评论移至答案。)
标签: javascript reactjs redux react-redux