reactjs - Redux 工具包切片。如何正确添加新数组?
问题描述
让我们想象一个服务器向我们发送数组。它可以相同或不同。我们不知道。如何在切片中正确添加?
https://codesandbox.io/s/redux-toolkit-state-new-array-4sswi?file=/src/redux/slices/slice.js
像这样?
const someSlice = createSlice({
name: "someSlice",
initialState: {
users: []
},
reducers: {
actionSuccess: (state, { payload }) => {
state.users = payload.users;
}
}
});
如果我们得到相同的数组怎么办?这样,actionSuccess 无论如何都会像新数组一样返回!这意味着会有多余的渲染。
所以,我的决定是这样的
const someSlice = createSlice({
name: "someSlice",
initialState: {
users: []
},
reducers: {
actionSuccess: (state, { payload }) => {
if (JSON.stringify(state.users) !== JSON.stringify(payload.users)) {
state.users = payload.users;
}
return state
}
}
});
但我认为有更好的方法。你怎么看?
解决方案
我认为让 redux-store 在数据从服务器到达时获取数据,但使用 React 的一些功能来记忆你想要的东西。
我已经分叉了您的示例并React.memo
在一个Dumb
组件中利用来展示如果新的东西来自服务器,React 将不会Dumb
为旧数据呈现该组件,因为它已被记忆。
这是叉子:-
https://codesandbox.io/s/redux-toolkit-state-new-array-forked-fgeym?file=/src/dumb.js
如果您删除该React.memo
位,所有三个列表项将一次又一次地呈现,否则,只有新项目将呈现。
检查控制台日志。
注意 - 默认情况下浅比较。您可以提供自定义比较函数React.memo
作为第二个参数。
推荐阅读
- c# - Emgu CV 捕获类不存在
- mysql - 当字段为 NULL 且过滤器 LIKE '%' 时,MySQL 中的 SELECT 不返回行
- javascript - jQuery 在 wordpress 的 footer.php 文件中不起作用?
- rest - Burp 如何准确扫描请求
- django - Django 和 python memcached 和会话引擎
- php - 是否可以从 gettext 过滤器访问订单元或发布元
- python - Python subprocess.Popen 不接受文本参数
- prestashop - Prestashop 添加名为“产品数量”的自定义列,显示从“ps_order”表订购的数量
- asp.net-mvc - 使用自定义路由创建 Umbraco 上下文
- c# - 将对象转换为 CSV,然后在不接触物理存储的情况下进行压缩