【问题标题】:Problem with updating object property in array of objects in React在 React 中更新对象数组中的对象属性的问题
【发布时间】: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


【解决方案1】:

我相信您的类别从类别对象数组开始,您的本意是将 setCategories 设置为数组 - 但您将其设置为对象。

你还需要确保你不要加倍tempCategory。像这样:

setCategories([
 ...categories.filter(x => x.id != tempCategory.id), 
 tempCategory
]);

但是,这将重新排序您的类别,将 tempCategory 放在最后,因此另一种选择是正确分割数组

const tmpIdx = categories.findIndex(x => x.id == tempCategory.id);
setCategories([
     ...categories.slice(0,tmpIdx), 
     tempCategory,
     ...categories.slice(tmpIdx+1), 
]);

另一种选择是将您的 categories 设为对象并使用 Object.values(categories).map(...),但这会使您的类别更难排序,因为对象键/值没有像数组那样的固定顺序。

【讨论】:

  • 它起作用了,当我点击复选框时,它会将它的位置更改为表格中的最后一个,FE:(X)类别 1(X)类别 2(X)类别 3 当我取消选中时第 2 类它是这样的: (X) 第 1 类 (X) 第 3 类 (O) 第 2 类 希望你能理解。你知道怎么解决吗?
  • @mateuszlaczynski 您可能会错过在该评论之前对该答案所做的更新。刷新页面
  • @mateuszlaczynski 微妙的错误 - 我使用了splice,我打算使用slice!现已更新
  • 它工作得很好。谢谢你让我开心! :)
  • 很高兴我能帮上忙,很抱歉最初的答案令人困惑:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-13
  • 2018-09-23
  • 2020-12-30
  • 2021-11-19
  • 2021-08-21
  • 2023-03-18
  • 1970-01-01
相关资源
最近更新 更多