クラスベースのコンポーネントを関数ベースのコンポーネントに変換しようとしています。これは REACT の学習中に書いたものですが、変換中に isOpen は関数ではないというエラーが発生しました。これを状態として定義し、handleToggle() で呼び出してから、コンポーネントのロゴで呼び出したので、少し混乱しました。
import React, { useState, useEffect } from "react"; 「../images/logo.svg」からロゴをインポートします; import { FaAlignRight } から "react-icons/fa"; import { Link } from "react-router-dom"; 「@mui/material/Badge」からバッジをインポートします。 '@mui/material/Menu' からメニューをインポートします。 '@mui/material/MenuItem' から MenuItem をインポートします。 デフォルト関数をエクスポート Navbar(){ const [anchorEl, setAnchorEl] = useState(null); const open = Boolean(anchorEl); const handleClick = (イベント) => { setAnchorEl(event.currentTarget); }; const handleClose = () => { setAnchorEl(null); }; const [isOpen, setIsOpen] = useState(null); useEffect(() =>{ ハンドルトグル(); }); // 状態 = { // isOpen: false, // }; const handleToggle = () => { setIsOpen(isOpen() ); }; 戻る (どのような約束も非常に重要です。 メニュー> ボタン>
useState
状態に格納されている値とその更新に使用される関数の 2 つの要素を含む配列を返します。const [isOpen, setIsOpen] = useState(null)
を呼び出す場合、isOpen
は値 (最初はnull
に設定されます)、setIsOpen
はそれを更新するために使用される関数です。const handleToggle = () => { setIsOpen(isOpen() ) }
と書くと、
null値を呼び出そうとしていますが、これは不可能です。機能。これがエラー メッセージの内容です。
isOpen
useEffectの値を切り替えたい場合は、
isOpenをブール値として宣言し、反対の値
isOpen#setIsOpen を指定して ## を呼び出す必要があります。
:リーリー
ただし、今のように、依存関係配列を使用せずにで
handleToggle
を呼び出すと、再レンダリングのたびに呼び出されるため、希望どおりではない可能性があります。 。ほとんどの場合、ユーザー インタラクションに応答して、たとえばonClick
などの HTML 要素イベントに応答してこの関数を呼び出すことができます。それ以外の場合は、コードをリファクタリングして、必要な依存関係をuseEffect
に追加する必要があります。