javascript React:为什么整个数组会重新呈现?

a2mppw5e  于 2023-06-28  发布在  Java
关注(0)|答案(1)|浏览(98)

我有一个数组,它被Map到一个react组件中,并为每个项目创建另一个react组件,如下所示:

import React, { FC, useState } from 'react'
import { v4 as uuidv4 } from 'uuid'

const Parent: FC = () => {

  const [testArray, setTestArray] = useState([0,1,2,3])

  const addToArray = (item: number) => {
    const newArray = [...testArray, item]
    setTestArray(newArray)
  }

  return <>
        <button onClick={() => addToArray(testArray.length)}>Add</button>
        {
            testArray.map(item => {
                return <ChildItem
                    value={item}
                    key={uuidv4()}
                ></ChildItem>
            })
        }
        </>    
}
export default Parent

addToArray函数只是向数组中添加一个元素。据我所知,react应该只渲染添加的项目,而不是重新渲染所有其他项目,因为这些项目的 prop 没有改变。
但是,当调用该函数时,似乎所有子级都被重新渲染。在ChildItem中,console.log()为每个项运行。我只希望它为刚刚创建的项目运行。

import React, { FC } from 'react'

const ChildItem: FC<{ value: number }> = (props) => {

    console.log('render', props.value)

    return <>
        <li>{props.value}</li>
    </>
}

export default ChildItem

有没有人看到,我错过了什么?我还尝试将子项设置为备忘录组件(export default memo(ChildItem)),但这并没有什么不同。我用的是react 18.2.0

sdnqo3pr

sdnqo3pr1#

当状态改变时,React组件会重新呈现自己及其所有子组件,这是正常的行为。
在本例中,可以使用React.memo来记忆子组件,但不能使用uuidv4作为键,因为每次父组件重新呈现时,它都会生成新的uuid。这会导致子组件的键在每个渲染周期中都不同(=子组件在每次渲染时重新安装)。
因此,将子组件 Package 在memo中

const ChildItem = React.memo(({value}) => {

并使用dirrefend键值

return <ChildItem
           value={item}
           key={item}
        ></ChildItem>

应该可以了

相关问题