簡體   English   中英

如何在 React (Hooks) 中從數組 state 中刪除元素

[英]How to remove an element from an array state in React (Hooks)

我有一個文本輸入列表,其中的數據來自一個包含 URL 的數組(狀態),並給出了一個我想刪除相應元素的索引。 我有這段代碼,其中console.log正確顯示了沒有我刪除的元素的新數組,但由於某種原因,頁面上的最后一個輸入總是將從列表中刪除(直觀地說 - 下圖)。

const [videosList, setVideosList] = useState(videos.split(","))

const deleteVideo = (e) => {

    e.preventDefault()

    const index = parseInt(e.currentTarget.dataset.urlIndex)

    const removeFromVideosList = [...videosList]

    const newFromVideosList = {
        data: removeFromVideosList.filter((_, i) => i !== index)
    }

    console.log(newFromVideosList.data);

    setVideosList([...newFromVideosList.data])
}

...

{
    videosList.map((value, key) => {

        return (
            <Row key={key}>
                <Col xs={10}>
                    {inputUrl(value)}
                </Col>
                <Col xs={2}>
                    <a 
                        href="#" 
                        className="delete-video"
                        onClick={deleteVideo}
                        data-url-index={key}
                    >
                        <FaTrash />
                    </a>
                </Col>
            </Row>
        )
    })
}

無論我點擊哪里,最后一個輸入總是會從列表中刪除(但console.log(newFromVideosList.data);正確顯示新數組)。

在此處輸入圖像描述

有誰知道我在這里做錯了什么? 謝謝!

EDIT1 - 我已經根據這里的人的建議改變了刪除元素的方式,但仍然是相同的行為(console.log 很好,但最后一個元素正在被 React 刪除):

const deleteVideo = (e) => {

    e.preventDefault()

    const removeFromVideosList = [...videosList]

    var index = removeFromVideosList.indexOf(e.currentTarget.dataset.url)

    if (index !== -1) {

        removeFromVideosList.splice(index, 1)

        console.log(removeFromVideosList);

        setVideosList([...removeFromVideosList])
    }
}

編輯2:

{
    videosList.map((value, key) => {

        return (
            <Row key={`video_${key}`}>
                <Col xs={10}>
                    {inputUrl(value)}
                </Col>
                <Col xs={2}>
                    <a 
                        href="#" 
                        className="delete-video"
                        onClick={deleteVideo}
                        data-url={value}
                    >
                        <FaTrash />
                    </a>
                </Col>
            </Row>
        )
    })
}

{ 視頻列表.map((值, 鍵) => {

    return (
        /*use key as something unique to each row except the array's index */
        <Row key={value.id}>
            <Col xs={10}>
                {inputUrl(value)}
            </Col>
            <Col xs={2}>
                <a 
                    href="#" 
                    className="delete-video"
                    onClick={deleteVideo}
                    data-url-index={key}
                >
                    <FaTrash />
                </a>
            </Col>
        </Row>
    )
})

}

你渲染的Row是從數組索引中刪除的,但是它們應該從每個值完全唯一的東西中刪除,以便 React 正確地知道要更新哪些元素。 就像是:

<Row key={value}>

而不是

<Row key={key}> (其中 key 是數組中值的索引)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM