【发布时间】:2020-12-30 12:36:43
【问题描述】:
我有一个组件,您可以在其中添加或删除一个选项项。当我删除一个选项项时,它只是从使用index 值存储在状态中的options 列表中删除。
我本以为因为我使用 index 作为键,所以每当我删除一个选项项时,最后一个元素会被错误地删除,但它似乎按预期工作。
displayedOptions = options.map((option, optionIndex) => (
<DropdownOption
option={option}
onRemoveOption={() => onRemoveOption(optionIndex)}
onChange={onChangeOption(optionIndex)}
key={optionIndex}
/>
));
const onRemoveOption = (taskIndex: number) => (optionIndex: number) => {
const newTaskFields = [...taskFields];
newTaskFields[taskIndex].options = newTaskFields[taskIndex].options.filter(
(_option, index) => {
return optionIndex !== index;
}
);
setTaskFields(newTaskFields);
};
这样做有什么风险吗? 有人知道为什么会按预期工作吗?
我认为我的应用中的行为与此处报告的行为相似:React - Deleting from middle of list removes last element instead
也就是说,如果我有一个使用索引作为包含以下值的键的列表:
[a, b, c]
并且我删除了索引 0 ('a'),我认为差异会在:
Original:
[0:a, 1:b, 2:c]
and
Updated:
[0:b, 1:c]
在这种情况下,React 会看到键 0 和 1 仍然存在,并将继续渲染 a 和 b,因为它会假设这些键没有改变。这将导致c 消失(而不是a)。
谢谢。
【问题讨论】:
-
好吧,大概如果按索引删除删除处理程序正确过滤了该索引处元素 not 的选项,那么我希望它能够按预期工作。但是,我们看不到您的
onRemoveOption代码。您的问题真的是“我的代码有效,但我不知道为什么吗?” -
@DrewReese 我已经包含了
onRemoveOption。是的,这本质上是我的问题。 -
是的,你创建一个状态的浅拷贝,改变它(删除与索引匹配的元素)并更新状态。看起来大部分都符合我的预期。首先缺少的是
newTaskFields[taskIndex]的浅拷贝,但我想这不会给你带来问题;这是状态突变的可能性。
标签: reactjs