基本上,我正在创建一个抽认卡类型的应用程序,您可以查看抽认卡(这是一个数组),也可以编辑它们。在编辑阶段,2个输入框旁边有一个按钮,您可以编辑文本或删除整个索引。问题在于删除,一旦删除按钮被点击,在正确的索引被删除的数组中,我使用控制台日志验证,但在用户界面底部的索引被删除.比如说我有一个有4个索引的数组,我删除了第二个,UI将显示1 2 3,但数组本身将有1 3 4。我不知道如何修复它,但这是我的代码:
const [flashcardsState, setFlashcardsState] = useState(flashcards);
const handleDeleteClick = (index: number) => {
const updatedFlashcards = [...flashcardsState];
updatedFlashcards.splice(index, 1);
setFlashcardsState(updatedFlashcards);
}
const handleCardChange = (cardIndex: number, fieldIndex: number, newValue: string) => {
const updatedFlashcards = [...flashcardsState];
updatedFlashcards[cardIndex][fieldIndex] = newValue;
setFlashcardsState(updatedFlashcards);
};
const renderEdit = () =>{
return (
<div className="card-container">
<div className="inputcardstext">
<h4>Front</h4>
<h4>Back</h4>
</div>
{flashcardsState.map((flashcardsState, index) => (
<div key={index}>
<div className="inputcards">
<input
type="text"
className='front-back'
defaultValue={flashcardsState[0]}
onChange={(e) => handleCardChange(index, 0, e.target.value)}
/>
<input
type="text"
className='front-back'
defaultValue={flashcardsState[1]}
onChange={(e) => handleCardChange(index, 1, e.target.value)}
/>
<button onClick={() => handleDeleteClick(index)}></button>
</div>
</div>
))}
</div>
);
}
1条答案
按热度按时间kwvwclae1#
它删除了正确的元素,你的问题是你使用数组索引作为React(
<div key={index}>
)中的键,这是一个禁忌。你看到这个问题是因为数组键作为索引和defaultValue
的组合。TL;DR选择了不同的密钥,如
看这个example on Codepen。
或者,如果您将
defaultValue
更改为value
,您可以看到您的删除工作正常(我在下面解释原因)。你还应该安装ESLint,它会警告你不要使用数组键作为索引。
你告诉React每个元素的唯一标识符是数组索引。数组中的第一个元素的索引为
0
。React说:“好的,我将渲染id为0
的元素,我会记住我渲染的内容,以便稍后进行比较。然后你删除了索引为
0
的元素,但你的数组仍然有一个索引为0
的元素。所以你把新数组还给React。React说:0
,所以我只需要在id为0
的新渲染与我已经拥有的不同时更改它0
的元素,即使它是数组中的不同元素,渲染输出也是相同的。这是因为defaultValue
仅在第一次渲染时设置,而不是在后续渲染时设置。0
中没有任何变化,我将继续前进,不更新DOM2
的“id”,并看到“啊,不再有2
的id,我将为您删除列表中的最后一个组件。