J'utilise une variable d'état ordinaire au lieu d'une référence.
// Initializing didMount as false
const [didMount, setDidMount] = useState(false)
// Setting didMount to true upon mounting
useEffect(() => { setDidMount(true) }, [])
// Now that we have a variable that tells us wether or not the component has
// mounted we can change the behavior of the other effect based on that
const [count, setCount] = useState(0)
useEffect(() => {
if (didMount) document.title = `You clicked ${count} times`
}, [count])
Nous pouvons refactoriser la logique didMount comme un hook personnalisé comme ceci.
function useDidMount() {
const [didMount, setDidMount] = useState(false)
useEffect(() => { setDidMount(true) }, [])
return didMount
}
Enfin, nous pouvons l'utiliser dans notre composant comme ceci.
const didMount = useDidMount()
const [count, setCount] = useState(0)
useEffect(() => {
if (didMount) document.title = `You clicked ${count} times`
}, [count])
UPDATE Utilisation du hook useRef pour éviter le rerender supplémentaire (Merci à @TomEsterez pour la suggestion)
Cette fois, notre crochet personnalisé renvoie une fonction renvoyant la valeur actuelle de notre réf. Vous pouvez aussi utiliser la référence directement, mais je préfère cette méthode.
function useDidMount() {
const mountRef = useRef(false);
useEffect(() => { mountRef.current = true }, []);
return () => mountRef.current;
}
Utilisation
const MyComponent = () => {
const didMount = useDidMount();
useEffect(() => {
if (didMount()) // do something
else // do something else
})
return (
<div>something</div>
);
}
En passant, je n'ai jamais eu à utiliser ce crochet et il y a probablement de meilleures façons de gérer cela, qui seraient plus conformes au modèle de programmation React.
2 votes
Avez-vous regardé dans
React.useMemo
?