【发布时间】:2021-11-29 10:52:43
【问题描述】:
我正在制作一个 ecommrece 项目,在搜索栏中,我正在显示带有 API 类别的复选框,默认情况下,所有这些都具有值 active == true。这就是我映射它们的方式:
{categories.map((category) => {
return (
<>
<input type="checkbox" onClick={() => handleCheckbox(category)}
defaultChecked={category.active} key={category.name} />
<label style={{marginLeft:"5px"}} htmlFor={category.name}>{category.name}</label><br/>
</>
)
})}
然后我运行此函数将 category.active 属性从 true 更改为 false,当单击确切的复选框时,我想使用 useState 更新此对象
const handleCheckbox = (category) => {
let tempCategory = category
if (tempCategory.active == true) {
tempCategory.active = false;
} else {
tempCategory.active = true;
}
setCategories({...categories, [tempCategory.id]: tempCategory})
console.log(category.active)
}
不幸的是,当我单击复选框时,我从 React 收到错误消息:
TypeError: categories.map is not a function
它指向 categories.map,我不知道如何修复它。我只想更新categories 数组中的特定对象。
【问题讨论】:
-
我们似乎遗漏了创建类别的地方。
-
当您点击 handleCheckbox 时,您将类别设置为一个对象,因此任一类别都不是一个数组,您应该尝试执行
Object.values(categories).map(),或者更改 setCategories 以将其设置为实际数组 -
@KrzysztofKrzeszewski 我将 setCategories 更改为
setCategories([...categories, tempCategory])并且它可以工作,但现在每次我点击复选框时都会附加另一个对象而不是更新现有对象 -
然后也许把它变成一个对象,然后让 setter 保持原样
标签: javascript reactjs react-hooks use-state