javascript - 为什么 Redux reducer 上的计时器会帮助触发重新渲染
问题描述
我遇到了一些奇怪的行为,我会觉得理解起来更安全
下面是我的减速器的代码。我不明白为什么,但是使用这段代码,绑定到 redux 状态的组件不会重新渲染。我可以通过开发者工具判断状态已正确更新。
const initialState = {
allItems: [],
favItems: [],
}
export default (state = initialState, action) => {
let allItems
case CREATE_ITEM:
allItems = state.allItems
allItems.unshift(action.item)
return {
...state,
allItems: allItems,
}
}
和我的reducer中的其他动作比较,我终于猜到了操作的时间成本,其他一些稍微复杂一点的操作似乎效果更好......
所以我添加了一个计时器
case CREATE_ITEM:
allItems = state.allItems
allItems.unshift(action.item)
setTimeout(() => {
return {
...state,
allItems: allItems,
}
}, 0)
繁荣,它奏效了!
我真的不喜欢这种高度hacky的解决方案。
有没有人知道正在发生的事情以及如何以更好的方式解决这个问题。
备注:
- 我正在研究 react-native,但它似乎不相关
useSelector
在组件中,使用钩子选择redux状态
const items = useSelector((state) => state.items.allItems)
解决方案
“allItems.unshift(action.item)” 直接将数据添加到reducer状态,因为allItems引用了redux状态变量。因此,在返回状态之前,您正在更新减速器。返回状态后,redux 数据不会有任何变化,因此不会重新渲染组件。
为了更好地理解,请参阅此答案https://stackoverflow.com/a/48819216/7822241
推荐阅读
- python - 如何使用 python 在包含特定单词的文档中获取句子?
- swift - 通过按下按钮更改约束
- c - 如何使用 g_signal_connect 传递整数
- swift - 无法同时满足约束错误是什么原因造成的?
- python - 如何从图像中仅提取外部轮廓(OpenCV)
- c# - WinForms ComboBox 检测是否选择了项目 - 即使项目相同
- sql-server - Sql-server 2008R2 数据库中只有一张表在使用 ADODB ODBC 连接访问时工作缓慢
- reactjs - 如何在 React Big Calendar 中将事件时间格式更改为 24 小时
- reactjs - React-Jest 单元测试影响状态的外部模块方法
- java - 如何在springboot中访问GCS存储桶?