Je veux que mon nom de classe change lorsque je passe la souris sur mon div. Si la console enregistre l'état, il passe de vrai à faux en fonction de la position de la souris. Lorsque j'essaie de l'utiliser avec un opérateur ternaire, il se définit toujours sur false?
import React, { useState } from 'react'; function NavigationBar() { const [hover, setHover] = useState({hover: false}) const noHovering = 'flex flex-row bg-white' const hovering = 'flex flex-row bg-black' return ( <div className='h-screen max-h-screen w-1/6 float-left shadow-2xl flex flex-col' style={{backgroundColor: '#2b2b2b'}}> <div className='h-20 flex justify-center items-center' style={{backgroundColor:'#202020'}}> <h1 className='text-white items-center font-hairline tracking-widest text-lg'>{hover === true ? "NOT WOKRING" : 'PREVENTION ADMIN'}</h1> </div> <div className='pl-4 h-full flex flex-col justify-around'> <div className= {hover ? hovering : noHovering} onMouseOver={() => setHover({hover:true})} onMouseLeave={() => setHover({hover:false})}> <img src={require('../../images/analysis-gray.png')} alt='analysis' className='mr-5 w-6'/> <h5 className='antialiased' style={{color:'#c8c8c8'}} >Insights</h5> </div>
4 Réponses :
L'opérateur ternaire renvoie toujours vrai parce que vous vérifiez l'instance hover
qui est une valeur de vérité.
En fonction de la façon dont vous avez défini votre état, vous devez vérifier le champ hover
avec hover.hover
const [hover, setHover] = useState(false) <div className= {hover ? hovering : noHovering} onMouseOver={() => setHover(true)} onMouseLeave={() => setHover(false)}> .. </div>
Ou, alternativement, passez à une valeur booléenne qui simplifie les choses:
const [hover, setHover] = useState({hover: false}) <div className= {hover.hover ? hovering : noHovering} onMouseOver={() => setHover({hover:true})} onMouseLeave={() => setHover({hover:false})}> .. </div>
survole? ...
renvoie toujours true
car c'est un objet {hover: false}
, vous n'avez pas besoin d'un objet ici, changez votre état en: XXX
et lorsque vous souhaitez définir hover
:
hover.hover ? hovering : noHovering
Si vous souhaitez le conserver en tant qu'objet, changez simplement votre condition en:
setHover(true) // Or setHover(false)
Je ne pense pas qu'il soit nécessaire d'avoir l'état hover
en tant qu'objet, puis de lire la propriété à l'intérieur. Vous pouvez simplement le faire comme ceci: -
const [hover, setHover] = useState(false); const noHovering = 'flex flex-row bg-white' const hovering = 'flex flex-row bg-black' <div className= {hover? hovering : noHovering} onMouseOver={() => setHover(true)} onMouseLeave={() => setHover(false)}> .. </div>
Si vous souhaitez conserver la forme de l'état actuel, utilisez simplement un affectation déstructurée pour extraire la propriété hover
:
// v v extract hover property from state const [{ hover }, setHover] = useState({hover: false})
Je pense que vous initialisez votre état d'une manière incorrecte. Essayez ceci -
const [hover, setHover] = useState (false)