reactjs 删除索引时使用react tsx呈现的数组索引不正确

ryoqjall  于 2023-06-05  发布在  React
关注(0)|答案(1)|浏览(139)

基本上,我正在创建一个抽认卡类型的应用程序,您可以查看抽认卡(这是一个数组),也可以编辑它们。在编辑阶段,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>
        );
}
kwvwclae

kwvwclae1#

它删除了正确的元素,你的问题是你使用数组索引作为React(<div key={index}>)中的键,这是一个禁忌。你看到这个问题是因为数组键作为索引和defaultValue的组合。

TL;DR选择了不同的密钥,如

const flashcards = [
    ["key", "a", "1"],
    ["key", "b", "2"],
    ["key", "c", "3"]
  ];
  const [flashcardsState, setFlashcardsState] = useState<string[][]>(
    flashcards
  );

  //...

        {flashcardsState.map((flashcardsState, index) => (
          <div key={flashcardsState[2]}>
            ...
          </div>
        ))}

看这个example on Codepen
或者,如果您将defaultValue更改为value,您可以看到您的删除工作正常(我在下面解释原因)。
你还应该安装ESLint,它会警告你不要使用数组键作为索引。
你告诉React每个元素的唯一标识符是数组索引。数组中的第一个元素的索引为0。React说:“好的,我将渲染id为0的元素,我会记住我渲染的内容,以便稍后进行比较。
然后你删除了索引为0的元素,但你的数组仍然有一个索引为0的元素。所以你把新数组还给React。React说:

  • “好的,我这里有相同的元素,id为0,所以我只需要在id为0的新渲染与我已经拥有的不同时更改它
  • React重新渲染了id为0的元素,即使它是数组中的不同元素,渲染输出也是相同的。这是因为defaultValue仅在第一次渲染时设置,而不是在后续渲染时设置。
  • React说:“好的,id 0中没有任何变化,我将继续前进,不更新DOM
  • React获取数组中最后一个元素2的“id”,并看到“啊,不再有2的id,我将为您删除列表中的最后一个组件。

相关问题