useState钩子不适用于usePrevious钩子

时间:2018-12-11 19:01:13

标签: javascript reactjs react-hooks

我已经创建了一个菜单组件,并且试图使用useState钩子来存储打开的子菜单。当菜单关闭时(从父级使用props),我想关闭所有子菜单,然后使用react-hanger库中的usePrevious钩子来确定主菜单何时从OPEN> CLOSED进入。这是我的代码。

import React, { useState } from 'react';
import { usePrevious } from "react-hanger"

const defaultMenusOpen = {menu1:false, menu2:false}

function Menu(props) {

    const [subMenusOpen, setSubMenusOpen] = useState(defaultMenusOpen))
    const prevIsOpen = usePrevious(props.isOpen);


    if(props.isOpen === false && prevIsOpen === true){
        setSubMenusOpen(defaultMenusOpen)
    }

    return (
        {props.isOpen && 
            ... JSX
        }
    );

}

export default Menu

问题在于,这会导致无限循环错误并不断重新呈现菜单。

这似乎是因为他的if语句在每次重新渲染时都为TRUE,因为调用setSubMenusOpen似乎并没有导致usePrevious再次存储新值。我认为这是正在发生的事情。

  • props.isOpen从TRUE> FALSE更改
  • prevIsOpen和props.isOpen在这一点上是TRUE和FALSE,所以...
  • 调用
  • setSubMenusOpen()会导致重新渲染。
  • 现在不再是previsOpen和props.isOpen,而是保持FALSE和FALSE,它们保持不变,因此setSubMenusOpen再次被调用

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

问题是您直接在渲染中设置状态,这导致设置状态和重新渲染的无限循环。而是使用useEffect钩子并仅在isOpen道具更改时执行它

function Menu(props) {

    const [subMenusOpen, setSubMenusOpen] = useState(defaultMenusOpen))
    const prevIsOpen = usePrevious(props.isOpen);

    useEffect(() => {
        if(props.isOpen === false && prevIsOpen === true){
            setSubMenusOpen(defaultMenusOpen)
        }
    }, [props.isOpen])


    return (
        {props.isOpen && 
            ... JSX
        }
    );

}

export default Menu