【发布时间】:2023-03-05 23:00:01
【问题描述】:
我的props中有嵌套数组,用户可以通过拖放列重新排序二级数组。我(使用 redux)制作 getState 外部数组的浅表副本,进行重新排序(通过基于索引重新分配数组对象),并将新数组返回到状态(在我的 reducer 中使用扩展运算符)。但是,componentDidUpdate 不会被调用如果此排序是我在页面加载后做的第一件事。如果我采取其他更新道具/状态的操作,然后尝试重新排序,排序工作正常并调用componentDidUpdate。
在前一种情况下,排序是我在页面加载/刷新后尝试做的第一件事,渲染函数被命中(使用正确重新排序的道具)但 DOM 永远不会更新,大概是因为 redux 无法识别状态变化?
似乎其他一些 props 发生了变化(即使与数组无关)“唤醒”redux 或 connect 并允许它识别变化。
这里是我在 reducer 中复制、调度然后释放更新状态的地方:
在 actionCreator 方法中:
...
const newProjects = getState().tracker.projects.slice().map(p => {
if (p.innerArray) {
const from = p.innerArray[draggedId-1];
const to = p.innerArray[droppedId-1];
p.innerArray[draggedId - 1] = { ...to, order: draggedId };
p.innerArray[droppedId - 1] = { ...from, order: droppedId };
}
return p;
})
dispatch({ type: 'RECEIVE_FIELD_UPDATE', projects: newProjects, message: "Sorted" });
减速器:
case 'RECEIVE_FIELD_UPDATE':
return {
...state,
projects: action.projects,
message: action.message
}
如您所见,我没有在 reducer 中改变状态或做其他反模式的事情(据我所知)。
FWIW,无论componentDidUpdate 是否被命中,message 属性上的“Sorted”值似乎都可以通过(我有一个模式会弹出消息以确认)。
任何指针或相关文档都会有所帮助;我一直在阅读我能找到的所有内容,包括其他 StackOverflow 帖子,但无济于事。
更新 解决了这个问题,它确实与 redux 不区分属性有关,但不是因为我的预期,如果有兴趣,请阅读以下内容。
【问题讨论】:
标签: reactjs redux react-redux