【发布时间】:2021-11-15 03:12:12
【问题描述】:
我按照这个线程中的答案尝试更新我在 React 中深度嵌套的对象。 React: Setting State for Deeply Nested Objects w/ Hooks
在那里看起来像一个魅力的东西,在我执行以下操作时会以某种方式破坏:
我有一个表格,其中填充了来自这样定义的数组中的项目:
const [items, setItems] = useState([
{
selected: false,
title: 'Item 1',
status: 'new'
},
{
selected: false,
title: 'Item 2',
status: 'used'
},
]);
当从该列表中选择一个项目时,会调用此函数来更新索引为 i 的对象的 selected 变量,如下所示:
const select = (e) => {
const i = e.target.getAttribute('data-index');
setItems((prevState) => {
prevState[i].selected = !prevState[i].selected;
return [...prevState];
});
};
这只会工作一次。如果我第二次触发select 或之后的任何时间return [...prevState] 以某种方式保持状态不变。 (selected 永远保持 true)。我无法解决这个问题。
items 附加到组件List,如下所示:
<List
items={items}
/>
在List 内部(缩写代码):
{items.map((item, i) => {
return (
<tr className="list-table-tr">
{hasSelector ? (
<td className="list-table-td-selector">
{item.selected ? (
<div
data-index={i}
className="global-selector-selected"
onClick={select}
></div>
) : (
<div
data-index={i}
className="global-selector-unselected"
onClick={select}
></div>
)}
</td>
) : null}
【问题讨论】:
-
这里必须成为一个很好的欺骗目标。有人有吗?
标签: javascript reactjs ecmascript-6 use-state