javascript - 反应useReducer没有显示来自array.reduce的值
问题描述
我正在使用 useReducer 来保存一些状态,如下面的代码所示,但它没有从数组 reducer 函数返回值。
let [entriesByEmployer, dispatchEntriesByEmployer] = useReducer(
(state, action) => {
const reducer = (employerEntries, entry) => {
console.log("adding to employerEntries");
employerEntries[entry.employerId] = employerEntries[entry.employerId] || [];
employerEntries[entry.employerId].push(entry);
console.log(employerEntries);
return employerEntries;
};
return batchEntries.reduce(reducer, []);
},
[]
);
过程:
- 当我单击屏幕上的按钮时,它会从数据库中获取信息
- 该信息存储在 batchEntries 变量中。
- 当 batchEntries 改变时,我使用 useEffect 来触发 dispatchEntriesByEmployer
- 这会导致减速器运行。
我知道内部 reduce 函数会运行,因为如果我将它包装在控制台日志中,它会将我期望的数据输出到控制台。
console.log(batchEntries.reduce(reducer, []));
但是,当我返回 reduce 函数的结果时,React DevTools 在我检查组件时显示“Reducer: Array (empty)”
解决方案
问题出在减速器本身。因为我正在分配数组键,所以它没有显示数组。相反,我将其更改为一个对象
let [entriesByEmployer, dispatchEntriesByEmployer] = useReducer(
(state, action) => {
const reducer = (employerEntries, entry) => {
console.log("adding to employerEntries");
employerEntries[entry.employerId] = employerEntries[entry.employerId] || [];
employerEntries[entry.employerId].push(entry);
console.log(employerEntries);
return employerEntries;
};
return batchEntries.reduce(reducer, {});
},
{}
);
推荐阅读
- ios - WebCore 崩溃,iOS 11,与 UIWebView 脚本有关。(JSC::JSLock::DropAllLocks::DropAllLocks)
- vba - VBA R1C1 表示法循环参考不匹配
- python - 我想将 DataFrame 与 CSV 合并
- charts - 在表格折线图中添加维度
- shell - 通过 shell 脚本运行命令行不起作用
- android - 短动态链接错误 com.google.android.gms.common.api.ApiException: 8:
- java - Thymeleaf 下拉列表 + 引导程序
- python - python的命令行参数
- python - 如何使用 python 和 STOMP 从 Activemq 队列中读取消息
- java - 根据值列表获取 Elasticsearch 匹配