javascript - 根据条件计算项目
问题描述
商店的初始状态是:
let initialState = {
items: [],
itemsCount: 0,
completedCount: 0
};
当我使用该类型调度一个动作时,ADD_ITEM
新项目被添加到items
数组中并itemsCount
递增(尽管我不确定我是否正确执行)
case "ADD_ITEM": {
return {
...state,
items: [
...state.items,
{
title: action.name,
dateCreated: action.date,
id: action.id,
isChecked: false
}
],
itemsCount: state.items.length + 1
};
}
并且对于TOGGLE_ITEM
case "TOGGLE_ITEM": {
return Object.assign({}, state, {
items: state.items.map(item => {
if (item.id !== action.id) {
return item;
}
return Object.assign({}, item, {
isChecked: !item.isChecked
});
})
});
}
当我调度具有以下类型REMOVE_ITEM
的操作时,将执行以下操作:
case "REMOVE_ITEM": {
return Object.assign({}, state, {
items: [...state.items.filter(item => item.id !== action.id)],
itemsCount: state.items.length - 1
});
}
现在我正在尝试计算拥有的isChecked
项目true
state.items.map(item => {
if(item.isChecked){
//Increment count
}
})
我不确定在哪里做那件事。
行动内部TOGGLE_ITEM
?
在一个新的COUNT_ITEM
动作里面?如果是这样,该操作何时发送?
以及如何将递增的数字分配给状态的一部分?
解决方案
您可以在您的操作/组件等中需要它时计算它:
items.filter(item => item.isChecked).length
在您的状态中存储派生值(例如某些项目(包括itemsCount
变量)的计数)并不是一个好习惯(原因类似于您对状态进行规范化的原因)。
如果您担心性能(它是 O(n),所以一般来说应该不是什么大问题),您可以使用memoization library。
推荐阅读
- r - 如何避免用户定义函数的命名空间歧义
- tensorflow - 如何在 TPU 上实现布尔屏蔽
- python - 我现在应该怎么做才能解决这个问题,因为它显示 x 未定义?
- android - 如何从 webview 中的存储访问 IndexedDB?
- python - Python Tkinter“exportselection”在 Windows 机器上不起作用
- python - 获取列表中最小项的索引
- php - 将包含空格的字符串作为响应从 php 发送到 Android
- jquery - 在新选项卡中打开外部链接,但排除某些链接
- r - R mutate ifelse 用计算的函数值更新条件行
- python - 动态规划 - 洗车