Maison  >  Questions et réponses  >  le corps du texte

Titre réécrit en : TypeError : isOpen n'est pas une fonction appelable

<p>J'essaie de convertir mon composant basé sur une classe en un composant basé sur une fonction, que j'ai écrit il y a quelque temps en apprenant REACT, mais lors de la conversion, j'ai eu une erreur indiquant que isOpen n'est pas une fonction, je' Je suis un peu confus car je l'ai défini comme un état et je l'ai appelé dans handleToggle(), puis je l'ai appelé au logo du composant. </p> <pre class="brush:php;toolbar:false;">importer React, { useState, useEffect } depuis "react" ; importer le logo depuis "../images/logo.svg" ; importer { FaAlignRight } depuis "react-icons/fa" ; importer {Lien} depuis "react-router-dom" ; importer le badge depuis '@mui/material/Badge' ; importer le menu depuis '@mui/material/Menu' ; importer MenuItem depuis '@mui/material/MenuItem' ; exporter la fonction par défaut Navbar(){ const [anchorEl, setAnchorEl] = useState(null); const open = Boolean(anchorEl); const handleClick = (événement) => setAnchorEl(event.currentTarget); } ; const handleFermer = () => setAnchorEl(null); } ; const [isOpen, setIsOpen] = useState(null); useEffect(() =>{ handleToggle(); }); // état = { // estOuvert : faux, // }; const handleToggle = () => setIsOpen(isOpen() ); } ; retour ( <nav className="barre de navigation"> <div className="nav-center"> <div className="nav-header"> <Lien vers="/"> <img src={logo} alt="Beach Resort" /> </Lien> <bouton type="bouton" className="nav-btn" onClick={handleToggle} > <FaAlignRight className="icône de navigation" </bouton> </div> <ul className={isOpen ? "nav-links show-nav" : "liens-nav"} > <li> <Lien vers="/">Accueil</Lien> ≪/li> <li> <Lien vers="/chambres">Chambres</Lien> ≪/li> </ul> <Badge badgeContent={4} color="primaire" id="bouton-de base" aria-controls={ouvrir ? 'menu-de base' : non défini} aria-haspopup="vrai" aria-expanded={ouvrir ? 'vrai' : indéfini} onClick={handleClick} > <i className="fa-solid fa-cart-shopping text-light" style={{ fontSize : 25, curseur : "pointeur" }} >≪/i> </Badge> </div> <Menu id="menu-de base" ancreEl={ancreEl} ouvert={ouvert} onClose={handleClose} MenuListProps={{ 'aria-labelledby' : 'bouton-de-base', }} > <MenuItem onClick={handleClose}>Profil</MenuItem> <MenuItem onClick={handleClose}>Mon compte</MenuItem> <MenuItem onClick={handleClose}>Déconnexion</MenuItem> </Menu> </nav> ); }</pré> <p>将非常感谢任何建议。</p>
P粉642920522P粉642920522438 Il y a quelques jours514

répondre à tous(1)je répondrai

  • P粉951914381

    P粉9519143812023-09-02 12:24:18

    useState 返回一个包含两个元素的数组:一个存储在状态中的值和一个用于更新它的函数。如果你调用 const [isOpen, setIsOpen] = useState(null)isOpen 是你的值(最初设置为 null),setIsOpen est une fonction utilisée pour le mettre à jour.

    Quand vous écrivez const handleToggle = () => { setIsOpen(isOpen() ) } 时,你试图调用一个 null valeur, ce n'est pas possible car ce n'est pas une fonction. C'est ce que vous dit le message d'erreur.

    Si vous souhaitez changer isOpen 的值,你应该将 isOpen 声明为一个布尔值,并使用 isOpen 的相反值来调用 setIsOpen :

    const [isOpen, setIsOpen] = useState(false);  // <= 将其最初设置为 false
    
    const handleToggle = () => {
      setIsOpen(!isOpen); // <= 当它为 false 时,将 isOpen 设置为 true,当它为 true 时,将 isOpen 设置为 false
    };
    

    Cependant, si vous êtes dans useEffect 中调用 handleToggle,就像你正在做的那样,它将在每次重新渲染时被调用,这可能不是你想要的。你很可能希望在响应用户交互时调用它 - 例如在响应 HTML 元素事件(如 onClick)时。否则,你应该重构你的代码,添加必要的依赖项到 useEffect sans tableau de dépendances.

    répondre
    0
  • Annulerrépondre