【发布时间】:2019-06-11 02:24:15
【问题描述】:
我的 redux 状态有一个 SessionList,它是一个 SessionObjects 数组,每个 SessionObject 都有一个 HandObjects 数组。
我使用状态通过添加新的 HandObjects 来更新单个 SessionObjects,但是我想用我更新的 SessionObject 更新 redux 存储(如果可能,不可变)。
SessionList 中 SessionObject 的索引是 action.payload.Id(我想?我会展示我的 SessionObject 构造函数)
**添加会话工作得很好,我只用商店中已有的会话更新会话
我已经尝试了我能找到的每个链接,但我的代码完全不同,以至于我似乎无法正确更新我的 SessionList。
我的减速器,初始状态 store.js(我的减速器所在的位置)
const initialState = {
SessionList: [],
}
...
case "UPDATE_SESSION":
//action.payload is a SessionObject
//action.payload.Id is the Id that i want to update
// i want to set SessionList[action.payload.Id] = action.payload
state = {
...state,
SessionList : state.SessionList.map((item, index) => {
if (index != action.payload.id) {
return item
}
return action.payload
//This code doesn't visibly do anything that I can find
})
// *******FIRST TRY*******
// ...state,
// SessionList: {
// ...state.SessionList,
// SessionList[action.payload.id] : action.payload
//syntax error, but basically what i want to do
// }
// }
// ***********************
};
break;
SessionObject 构造函数 会话.js
export function SessionObject(_id, _name, _hands) {
this.id = _id, //int
this.name = _name, //string
this.HandList = _hands //array of HandObject objects
}
var defaultSession = new SessionObject(0, "default", []);
*如果我做错了, 我打电话 (Session.js)
this.props.navigation.state.params.updateMethod(this.state.Session); //update store
来自堆栈导航器子组件。
然后在父组件中,
我打电话
(Home.js)
UpdateSession = (session) => {
this.props.updateSession(session);
};
我的调度员看起来像: (Home.js)
updateSession: (session) => {
dispatch({
type: "UPDATE_SESSION",
payload: session
});
}
通过测试,我有点确定我的减速器被正确调用了。
我想在 SessionList 的正确索引中将 SessionObject 替换为 action.payload。
编辑 *
Session.js
addItem = () => {
this.setState((state, props) => ({
Session : {
...state,
HandList: [...state.Session.HandList, new HandObject(state.HandCount)]
},
HandCount : state.HandCount + 1,
}));
this.props.navigation.state.params.updateMethod(this.state.Session); //update store
};
Session.js 中的状态是一个 SessionObject
【问题讨论】:
-
您在哪里创建提供给
updateSession的session?您有可能一遍又一遍地传递相同的引用吗?即,如果您尝试使用 ``` payload: { ...session } ``` 问题仍然存在? -
@sminutoli 我在我的问题中添加了代码,我正在更新会话。我认为我这样做的方式会创建一个新对象?就我的工作流程而言,我的主屏幕访问 redux 存储,并将 SessionList(充满 SessionObjects)放在 FlatList 中。每一个都是一个按钮,它导航到一个会话页面,该页面以相同的方式显示单个 SessionObject 的 HandObjects 列表。 Hands 被添加/更新,更新 Session.js 状态的 SessionObject,将 session 发送回 Home 屏幕,更新 redux store 的完整结构。
-
setState不是同步调用,你不能使用this.state.Session期望它是全新的对象,也许你可以将这个新会话存储在一个变量上,同时传递setState和updateMethod同一个对象。我不明白你为什么要混合 redux w setState。 -
SessionObject 构造函数使用小写“i”作为其
id属性,而在reducer 的UPDATE_SESSION情况下,写入action.payload.Id(大写“I”),这将评估如undefined.如果您登录action.payload,这就是您所看到的吗? -
@leitdeux 很好,但这并没有改变结果
标签: javascript reactjs react-native redux react-redux