reactjs React状态更改不是重新渲染数组map

9njqaruj  于 2023-05-28  发布在  React
关注(0)|答案(1)|浏览(178)

我有一个页面,其中有一列div,每个div都有自己的isVisible状态。在鼠标输入时,div淡出并使用帧运动从DOM中删除。我试图跟踪div的数量,因为当最后一个被删除时,我想再次运行randNumber数组来重新填充列,但它不起作用。它也似乎像React状态是不计数删除的div正确

<div
      className={`grid h-[var(--vh)] grid-cols-6 gap-x-[10px] overflow-hidden p-[10px] md:gap-x-[20px] lg:grid-cols-10`}
    >
      <LogoStack />
      <LogoStack />
      <LogoStack />
      <LogoStack hideTablet />
      <LogoStack hideTablet />
    </div>

const LogoStack = ({ hideTablet }: { hideTablet?: boolean }) => {
    const [randNumber, setRandNumber] = useState<number | undefined>(undefined)
  useEffect(() => {
    setRandNumber(getRandomInt(10, 30))
  }, [setRandNumber])

  useEffect(() => {
    if (randNumber === 0) {
      setRandNumber(getRandomInt(10, 30))
    }
  }, [randNumber, setRandNumber])
  return (
    <div
      className={`col-span-2 flex-col-reverse justify-start ${
        hideTablet ? 'hidden lg:flex' : 'flex'
      }`}
    >
      {[...Array(randNumber)].map((_, i: number) => {
        return (
          <LogoAnim
            key={i}
            idx={i}
            randNumber={randNumber}
            setRandNumber={setRandNumber}
          />
        )
      })}
    </div>
  )
}

const LogoAnim = ({
  randNumber,
  setRandNumber,
  idx,
}: {
  randNumber?: number
  setRandNumber?: Dispatch<SetStateAction<number>>
  idx?: number
}) => {
  const [isVisisble, setIsVisible] = useState<boolean>(true)

  return (
    <AnimatePresence mode="sync">
      {isVisisble && (
        <motion.div
          key={'logo-' + idx}
          className={`logo cursor-pointer overflow-hidden`}
          initial={'visible'}
          animate={isVisisble ? 'visible' : 'hidden'}
          exit={'hidden'}
          variants={variants}
          transition={{
            duration: 0.4,
            delay: 0,
          }}
          onMouseEnter={() => {
            setTimeout(() => {
              setRandNumber(randNumber - 1)
            }, 0)
            setIsVisible(false)
          }}
        >
          <motion.div
            key={'text-anim-' + idx}
            className=""
            initial={'hidden'}
            animate={'visible'}
            exit={'hidden'}
            variants={variants}
            transition={{
              duration: 0.3,
              delay: (idx * 100) / 1000,
            }}
          >
            <motion.div
              key={'text-anim-' + idx}
              className=""
              initial={'visible'}
              animate={isVisisble ? 'visible' : 'hidden'}
              exit={'hidden'}
              variants={textVariants}
              transition={{
                duration: 0,
                delay: 0.4,
              }}
            >
              <MainLogo />
            </motion.div>
          </motion.div>
        </motion.div>
      )}
    </AnimatePresence>
  )
}
ru9i0ody

ru9i0ody1#

Don't use loop indexes as keys
从数组中移除一个项时,所有后续项的键都将更改。这使得React(和Framer)很难跟踪哪些元素被更改/删除等。
相反,您需要使用一个唯一的值,该值不会随着列表的重新排序而改变。通常,您会使用数据结构中的某种唯一ID。

相关问题