Site icon Blog ARC Optimizer

Deux Hooks React que vous devriez apprendre


Apprenez à utiliser le hook useCallback pour éviter les rendus inutiles dans notre application, et le hook useRef pour garder une trace des références.

Dans cet article, nous allons en apprendre plus sur deux hooks React spécifiques qui ont été publiés dans la version React 16.8: le crochet useCallback et le crochet useRef . Nous en saurons plus sur la façon dont ces deux crochets spécifiques fonctionnent sous le capot, les bons cas d'utilisation pour chacun d'eux et comment nous pouvons en tirer profit dans nos applications réelles.

No More Classes

De retour en octobre 2018, l'équipe React a publié une version de React dont nous pouvons maintenant affirmer que c'était l'une des versions les plus importantes de la courte histoire de React. Ils ont publié une nouvelle fonctionnalité appelée React Hooks – une nouvelle façon que nous pouvons utiliser pour gérer très facilement notre application d'état, en supprimant les classes de nos composants, afin que nous puissions avoir un code plus concis et diviser notre logique d'état.

In our React applications avant React Hooks, pour gérer notre état, nous aurions des composants de classe. Par exemple, si nous voulions créer un état pour avoir un compteur voici comment nous le ferions:

  1. Premièrement, nous créerions notre composant, et notre état serait un simple counter .
 class   App   extend   Component   {
  constructor  ( props )   {
    super [19659013] ( accessoires ) ; 
    ceci .  état  =   {
     compteur :   0 
   } ; 
 } 
  render  ()   {
    return   (
      < div > 
        < h1 >  compteur :   { this .  state .  compteur }  < /  h1 > 
      < /  div > 
   ) ; 
 } [19659043]} 
  1. Ensuite, nous créerions deux fonctions: une pour incrémenter le compteur et l'autre pour décrémenter le compteur .
 incrementCounter   =   ( )   =>   {
  this .  setState  ( prevState  =>   {
    return   { 
     counter :  prevState .  counter  +   1 
   } ; 
 } ) ; 
} [19659013]; 
 decrementCounter   =   ()   =>   {
  this .  setState  ( prevState  ] =>   {
    retour   {
     counter :  prevState .  counter  -   1 
   } ; 
 } ) ; 
} [19659013]; 
  1. Ensuite, nous créerions deux boutons qui déclencheraient chaque fonction, et incrémenterions ou décrémentions notre compteur en fonction du bouton.
 < button onClick  =  { this .  incrementCounter } >  +  < /  button > 
 < button onClick  =  { this .  decrementCounter } >  -  < /  button  > 

Beaucoup de gens étaient contre cette approche consistant à créer des classes pour gérer notre état dans React. Ils étaient en faveur de quelque chose de plus classe et de plus propre. La solution que l'équipe React a trouvée pour cela? React Hooks.

Avec React Hooks, nous pouvons remplacer tous nos composants de classe dans nos applications par des composants fonctionnels, ce qui signifie: plus de composants de classe! Nous pouvons désormais utiliser des composants de fonction dans nos applications sans avoir à créer un composant de classe unique pour gérer notre état.

Le hook que nous utilisons pour gérer notre état est le hook useState . Tout d'abord, nous importons le crochet useState de React.

 import  React   { useState }   de   "react" ; 

Le hook useState prend un état initial comme argument et renvoie un tableau avec deux éléments: l'état et la fonction de mise à jour.

 const   [ ] counter  setCounter ]   =   useState  ( 0 ) ;  

Donc, maintenant, tout ce que nous avons à faire est appelez la fonction de mise à jour setCounter pour mettre à jour l'état de notre compteur . Magic!

 import  React   { useState }   from   "react" ; 
 const   App   ] =   ()   =>   {
  const   [ counter  setCounter ]   =   useState  ( 0 ) ; 
  return   (
    < div > 
      < h1 >  compteur :   { compteur }  < /  h1 > 
      < bouton onClick  = [19659013] { ()   =>   setCounter  ( counter  +   1 ) } >  +  < /  bouton > 
      < bouton onClick  =  { ()   =>   setCounter  ( compteur  -   1 ) } >  -  < /  bouton > 
    < /  div > [19659024]) ; 
} ; 

Ceci est un bref récapitulatif de React Hooks. Si vous voulez en savoir plus à leur sujet, je vous recommande vraiment de lire la documentation et de vous entraîner.

Maintenant que nous avons couvert l'arrière-plan de React Hooks, apprenons plus précisément le useCallback et crochets useRef qui ont été libérés dans le jeu d'origine 16.8.

useCallback

Le hook useCallback a une fonction principale et spécifique: éviter les relances inutiles dans votre code, rendant votre application plus rapide et plus efficace.

Le useCallback hook reçoit une fonction en tant que paramètre, ainsi qu'un tableau de dépendances. Le hook useCallback renverra une version mémorisée du rappel, et elle ne sera modifiée que si l'une des dépendances a changé.

 useCallback  ( () [19659046] =>   {
  myCallbackFunction  () 
}   [ dependencies ] ) ; [19659104] Vous pouvez également transmettre un tableau vide de dépendances. Cela n'exécutera la fonction qu'une seule fois. Si vous ne passez pas de tableau, une nouvelle valeur sera renvoyée à chaque appel. 
 useCallback  ( ()   =>   {
  myCallbackFunction  ] () 
}   [] ) ; 

Créons un exemple pour comprendre plus facilement comment ce hook fonctionne. Nous allons créer un composant appelé Notes qui sera notre composant parent. Ce composant aura un état appelé notes qui seront toutes nos notes, et une fonction appelée addNote qui ajoutera une note aléatoire chaque fois que nous cliquons sur un bouton.

 const   Notes   =   ()   =>   {
  const   [ notes  setNotes ] [19659046] =   useState  ( [] ) ; 
  const   addNote   =   ()   =>   {
    const  newNote  =   "random" ; 
    setNotes  ( n  =>   [[19659036] ...  n  newNote ] ) ; 
 } ; 
  return   (
    < div > 
    < h1 >  Bouton :  < /  h1 > 
    { notes . [19659053] carte  ( ( note  index )   =>   (
      < p key  = [19659013] { index } >  { note }  < /  p > 
   )  ) } 
    < /  div > 
 ) ; 
} ; 

Maintenant, créons notre bouton . Nous allons créer un simple bouton et passer un accessoire appelé addNote qui ajoutera une note à chaque fois que nous cliquons dessus. Nous mettons un console.log dans notre composant Button donc chaque fois que notre composant le ré-rendra, il le console.

 const   Button   =   ( { addNote } )   =>   {
 console .  log  ( "Bouton re-rendu :(" ) ; 
  return   (
    < div > 
    < button onClick  =  { addNote } >  Add  < /  button  > 
    < /  div > 
 ) ; 
} ; 

Importons notre composant Button et passons notre addNote fonctionne comme un accessoire et essaie d'ajouter une note. Nous pouvons voir que nous pouvons ajouter une note avec succès, mais aussi notre composant Button se ré-affiche à chaque fois, et il ne devrait pas. t. La seule chose qui change dans notre application est l'état notes pas le bouton .

Il s'agit d'un rendu totalement inutile dans notre application, et c'est ce que le crochet useCallback peut nous aider à éviter. Donc, dans ce cas, comment nous pourrions utiliser le useCallback hook pour éviter un nouveau rendu inutile dans notre composant?

Nous pouvons encapsuler la fonction addNote avec le hook useCallback et passer comme une dépendance le setNotes fonction de mise à jour, car la seule chose qui dépend de notre composant Button est le setNotes .

 const  addNote  = [19659116] useCallback  ( ()   =>   {
  const  newNote  =   "random" ; 
  setNotes  ( n  =>   [ ...  n  newNote ] ) ; 
 }   [ setNotes ] ) ; 

Mais si nous regardons la console, nous pouvons voir que le composant Button est

Nous savons que React re-rendra chaque composant ent par défaut, sauf si nous utilisons quelque chose qui peut empêcher cela. Dans ce cas, nous pouvons utiliser le React.memo pour empêcher le rendu de notre composant Button à moins qu'un accessoire n'ait changé - dans notre cas, le support addNote . Mais, comme nous utilisons le hook useCallback il ne changera jamais, donc notre composant Button ne sera jamais rendu à nouveau. Voici à quoi ressemblera notre Button :

 const  Button  =  React .  mémo  ( ( {  addNote } )   =>   {
 console .  log  ( "Bouton re-rendu :(" ) ; 
 return   (
    < div > 
    < button onClick  =  { addNote } >  Add  < /  button  > 
    < /  div > 
 ) ; 
} ) ; 

Nous avons maintenant un composant très performant et efficace, éviter les ré-rendus inutiles dans nos composants. Le crochet useCallback est assez simple au début, mais vous devez faire attention à où et quand utiliser ce crochet, sinon cela ne vous aidera pas du tout.

Maintenant que nous avons appris le ] useCallback hook, jetons un œil à un autre hook qui peut vous aider beaucoup dans vos projets et applications: le hook useRef .

useRef

Si vous avez utilisé des composants de classe avant le React 16.8, vous savez que c'est ainsi que nous créerions une référence à un composant ou à un élément:

 class   Button   extend   React .  Component   { 
 constructeur  ( props )   {
   super  ( props ) ; 
   this .  ] buttonRef  =  React .  createRef  () ; 
} 
 render  ()   { 
   retour   ([19659388] < button ref  =  { this .  buttonRef } > 
       { this .  accessoires .  enfants } 
     < /  bouton > 
  ) 
} 
} 

Importer le createRef de React et transmettez-la à l'élément souhaité. Assez simple.

Mais, maintenant, nous pouvons faire tout ce que nous faisions avec des composants de classe, avec des composants fonctionnels! Nous pouvons maintenant gérer notre logique d'état à l'intérieur d'un composant fonctionnel, nous pouvons avoir des «méthodes de cycle de vie» et nous pouvons créer des références et les transmettre aux éléments en utilisant le hook useRef .

Le useRef hook nous permet de renvoyer un objet ref mutable (un nœud ou un élément DOM créé dans la méthode de rendu).

 import  React   { useRef } [19659009] de   "react" ; 
 const   Button   =   ( { children } )   => [19659011] {
  const  buttonRef  =   useRef  () ; 
  return   (
    < button ref  ] =  { buttonRef } >  { enfants }  < /  button > 
 ) 
} 

Mais quelle est la différence entre createRef et d le useRef ? Eh bien, assez simple: le hook createRef crée une nouvelle référence à chaque fois qu'il est rendu, et le hook useRef renvoie la même référence à chaque fois.

Nous avons appris il y a quelques minutes qu'un nouveau rendu inutile est quelque chose que nous voulons éviter dans notre application - c'est pourquoi nous devrions utiliser le hook useRef au lieu de createRef . Migrer de l'un à l'autre ne sera pas si difficile, et le useRef améliorera beaucoup votre vie.

Le crochet useRef contient la valeur réelle dans son .currrent méthode. Avec cette méthode, nous pouvons accéder à l'élément HTML réel, dans notre cas, un bouton. En utilisant la méthode .currrent nous pouvons faire certaines choses et changer impérativement des éléments HTML en utilisant certaines instances de nœuds, comme .focus .contains .cloneNode etc.

Imaginons que nous ayons une entrée et un bouton, et que nous voulons concentrer l'entrée à chaque fois que nous cliquons sur le bouton. Cela peut être très utile dans certaines situations de formulaires que vous avez dans votre application Comment pourrions-nous faire cela?

Eh bien, nous pourrions créer une référence en utilisant le hook useRef et changer le .currrent de cette référence pour focaliser l'entrée chaque fois que nous cliquons sur le bouton, en utilisant l'instance de nœud .focus .

 import  React   { useRef }   from   "react" ; 
 const   App   =   ()   =>   {[19659051] const  inputRef  =   useRef  () ; 
  const   focusInput   =   ()   = >   {
   inputRef .  current .  focus  () ; 
 } ; 
  return   (
    < div > 
      < type d'entrée  =  "text"  ref  =  { inputRef }   / > 
      < bouton onClick  =  { ()   =>   focusInput  () } >  Focus  < /  button > 
    < /  div > 
 ) ; [19659043]} ; 

Le hook useRef est également très utile si nous voulons enregistrer une valeur à l'intérieur - par exemple, notre valeur d'état.

Imaginons que nous ayons un ] compteur et chaque fois que nous incrémentons ou décrémentons ce compteur spécifique nous pouvons stocker la valeur du compteur à l'intérieur de la réf. Nous pouvons le faire en utilisant la méthode .currrent . Voici comment procéder:

 import  React   { useRef  useState }   from   "react" ; 
 const   App   =   ()   =>   {
  const   [ counter  setCounter ]   =   useState  ( 0 ) ; 
  const  counterRef  =   useRef  ( counter ) ; 
  const   incrementCounter   =   ()   =>   {
    setCounter  (  compteur  =>  compteur  +   1 ) ; 
   counterRef .  current  =  counter ; 
 } 
  const   decrementCounter   =   ()   =>   {
    setCounter  ( counter  =>  counter  -   1 ) ; 
   counterRef .  current  =  counter ; 
 } 
  return   (
  < div > 
    < h1 >  État du compteur :   { compteur }  < /  h1 > 
    < h1 >  Réf compteur :   { compteur }  < /  h1 > 
    < button onClick  =  { ()   =>   incrementCounter  () } >  +  < /  bouton > 
    < bouton onClick  =  { ()   =>   decrementCounter  () } >  -  < /  button > 
  < /  div > [19659024]) ; 
} ; 

Vous Remarquez que chaque fois que nous modifions le compteur en incrémentant ou en décrémentant, nous utilisons la méthode .currrent pour enregistrer la valeur. De cette façon, nous pouvons l'utiliser à l'avenir si nous le voulons.

useRefs dans votre application React est incroyable, mais en même temps, ils peuvent être très compliqués. Ici vous pouvez trouver une liste de toutes les instances de nœuds HTML que nous pouvons utiliser avec les références.

Si vous voulez en savoir plus sur React Hooks, nous avons beaucoup de hooks qui pourraient être intéressants à apprendre et comprendre leurs cas d'utilisation spécifiques. Comme le crochet useContext un moyen qui nous permet de transmettre des données à travers nos composants sans avoir à passer manuellement les accessoires à travers plusieurs niveaux. Ou le hook useEffect très similaire au hook useCallback mais au lieu de renvoyer un rappel mémorisé, il renvoie une valeur mémorisée. Et nous pouvons utiliser le hook useEffect pour exécuter des méthodes de cycle de vie dans nos composants fonctionnels.

Conclusion

Dans cet article, nous en avons appris davantage sur le useRef et le useCallback hooks, deux des hooks libérés dans React 16.8. Nous avons appris à utiliser le hook useCallback pour éviter les ré-rendus inutiles dans notre code, en évitant de nombreux nouveaux rendus et en compromettant l’expérience de l’utilisateur dans notre application. Nous avons appris que le hook useRef nous permet de renvoyer un objet ref mutable, contenant une valeur dans la méthode .current ; et en utilisant cette méthode, nous pouvons faire de belles choses telles que focaliser des éléments, créer et comparer des nœuds d'éléments, etc.




Source link
Quitter la version mobile