reactjs - 在减速器中复制状态导致缓慢
问题描述
我有一个减速器,它给了我一些缓慢。我已将克隆/复制我的状态的一部分的步骤确定为慢步骤。
export default function itemReducer(state = initialState, action) {
case ITEM_FETCH_IMPACT_UPDATE:
{
let index = action.payload.index
slow step-> let items = [...state.items];
items[index] = {...items[index], overallIsLoading: true};
return {...state, items}
};
}
items
是一个相当大的数组,包含大约 300 个对象,每个对象有大约 10 个属性。我应该如何在保持最佳 Redux/React 实践的同时加快速度?
解决方案
这是使用Immer 编写不可变更新的用例。
手动编写不可变的更新逻辑通常很困难并且容易出错。Immer 允许您使用“可变”逻辑编写更简单的不可变更新,甚至可以冻结您在开发中的状态以捕获应用程序中其他地方的突变。我们推荐使用 Immer 来编写不可变的更新逻辑,最好作为Redux Toolkit的一部分。
使用 Immer 草案或任何不可变库,此类代码将变为:
const index = action.payload.index;
state.items[index].overallIsLoading = true;
它将修补状态并返回不可变数据。
请参阅Redux Style Guide的推荐。
推荐阅读
- pydot - 如何使用 python pydot 包从嵌套的字典中绘制一个比特树
- codeigniter - codeigniter 中部分视图的最佳实践和好处
- node.js - E11000 重复键错误集合:amaxon.products 索引:name_1 重复键:{名称:“Nike SLim Shirt”}
- python - 如何在python3中请求之前查看输入提示
- typescript - 如何将strapi、graphql和postgres连接在一起?
- c - 扫描文件会将功能发送到无响应模式?
- angular - Angular:Karma 给出错误错误:NullInjectorError:没有提供 ElementRef!从 v7 升级到 v8 后
- node.js - 如何在建立连接时使用 knex npm 包获取 MySQL connectionId?
- aws-sdk-js - @aws-sdk/client-s3 getObject 不获取最新版本的版本化存储桶对象
- android - Flutter 项目中使用 Cocos 引擎作为模块