6

メニュー コンポーネントを作成し、useState フックを使用して、開いているサブメニューを保存しようとしています。(小道具を使用して親から) メニューが閉じられたら、すべてのサブメニューを閉じたいと思います。これを行うには、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

問題は、これが無限ループ エラーを引き起こし、継続的にメニューを再レンダリングすることです。

これは、setSubMenusOpen を呼び出しても usePrevious が新しい値を再度格納しないように見えるため、再レンダリングのたびに if ステートメントが TRUE の場合に発生するようです。これが起こっていると思います。

  • props.isOpen は TRUE > FALSE から変更されます
  • prevIsOpen と props.isOpen は、この時点で TRUE と FALSE であるため、...
  • setSubMenusOpen() が呼び出され、再レンダリングが発生します。
  • previsOpen と props.isOpen が FALSE と FALSE になるのではなく、変更されないままであるため、setSubMenusOpen が再度呼び出されます。

どんな助けでも大歓迎です。

4

1 に答える 1