{"@attributes":{"version":"2.0"},"channel":{"title":"DEV Community: Martial Anouman","description":"The latest articles on DEV Community by Martial Anouman (@oanouman).","link":"https:\/\/dev.to\/oanouman","image":{"url":"https:\/\/media2.dev.to\/dynamic\/image\/width=90,height=90,fit=cover,gravity=auto,format=auto\/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F278695%2F970fb681-f9da-4102-9bb3-7d665b2b8c78.jpeg","title":"DEV Community: Martial Anouman","link":"https:\/\/dev.to\/oanouman"},"language":"en","item":{"title":"Les hooks React expliqu\u00e9s!: useState (1\/8)","pubDate":"Sun, 23 May 2021 11:38:23 +0000","link":"https:\/\/dev.to\/oanouman\/les-hooks-react-expliques-usestate-1-8-14fe","guid":"https:\/\/dev.to\/oanouman\/les-hooks-react-expliques-usestate-1-8-14fe","description":"<p>Les articles de la s\u00e9rie:<\/p>\n\n<ol>\n<li>\ud83d\udc49\ud83c\udffe <a href=\"https:\/\/bit.ly\/343SiMS\">useState<\/a>\n<\/li>\n<li>useEffect<\/li>\n<li>useReducer<\/li>\n<li>useContext<\/li>\n<li>useCallback<\/li>\n<li>useRef<\/li>\n<li>useMemo<\/li>\n<li>useLayoutEffect<\/li>\n<\/ol>\n\n<p>Salut \u00e0 tous!<br>\nCet article est le premier d'une s\u00e9rie de 8 consacr\u00e9s aux <strong>hooks<\/strong> en React. Il s'agira de pr\u00e9senter chacun des hooks (ou presque), leur utilit\u00e9 ainsi qu'un ou deux cas d'utilisation.<br>\nL'objectif est essentiellement de faciliter leur prise en main. Par cons\u00e9quent, ces articles s'adresse en premier lieu \u00e0 toutes personne ayant une connaissance basique de React.<\/p>\n\n<p>Sur ce, en avant la musique...\ud83c\udfb6 \ud83d\ude0e<\/p>\n<h1>\n  \n  \n  C'est quoi les hooks?\n<\/h1>\n\n<p>Les hooks sont simplement un ensemble de fonctions permettant de reproduire les fonctionnalit\u00e9s offertes par les composants bas\u00e9s sur les classes (<strong>class-based components<\/strong>) dans les composants bas\u00e9s sur les fonctions (<strong>fonctional components<\/strong>). Elles sont disponibles depuis la version 16.8 de React.<\/p>\n\n<p>Par convention, leur noms sont sous la forme <em>useXXX<\/em>. Elles sont donc facilement reconnaissables \ud83d\ude42. <br>\nLes hooks les plus populaires sont <strong>useState<\/strong>, <strong>useEffect<\/strong>, <strong>useCallback<\/strong>, pour ne citer que ceux l\u00e0.<\/p>\n\n<p>Dans la suite de ce premier article, nous explorerons plus en d\u00e9tails le hook <strong>useState<\/strong>.<\/p>\n<h1>\n  \n  \n  Pourquoi utiliser les hooks?\n<\/h1>\n\n<p>Les hooks permettent d'exploiter pleinement les composants bas\u00e9s sur des fonctions. Alors la bonne question serait plut\u00f4t: <strong>Pourquoi utiliser les composants bas\u00e9s sur des fonctions?<\/strong><\/p>\n\n<p>Pour faire simple, ils nous permettent d'\u00e9crire des composants moins verbeux, plus simple \u00e0 lire, comprendre et \u00e0 maintenir. <\/p>\n\n<p>Cependant, le but de cette article n'\u00e9tant pas de vous pr\u00e9senter l'utilit\u00e9 des composants bas\u00e9s sur des fonctions, j'invite les plus curieux \u00e1 en savoir plus en allant par <strong><a href=\"https:\/\/fr.reactjs.org\/docs\/hooks-intro.html#motivation\">ici<\/a><\/strong>.<\/p>\n<h1>\n  \n  \n  A quoi sert useState?\n<\/h1>\n\n<p>Pour ceux qui utilisent React depuis les versions &lt;16.8, <strong>useState<\/strong> est l'\u00e9quivalent de <em>this.state<\/em> et <em>this.setState<\/em>. C'est le \"hook d'\u00e9tat\" qui permet de g\u00e9rer un \u00e9tat dans un composant bas\u00e9 sur une fonction.<\/p>\n<h1>\n  \n  \n  Comment utiliser useState?\n<\/h1>\n\n<p>Assez parl\u00e9, un exemple s'impose \ud83d\ude0c.<\/p>\n<h4>\n  \n  \n  Avec un composant bas\u00e9 sur une classe\n<\/h4>\n\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight jsx\"><code><span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">Component<\/span> <span class=\"p\">}<\/span>  <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">react<\/span><span class=\"dl\">'<\/span>\n\n<span class=\"kd\">class<\/span> <span class=\"nx\">MyComponent<\/span> <span class=\"kd\">extends<\/span> <span class=\"nx\">Component<\/span> <span class=\"p\">{<\/span>\n  <span class=\"kd\">constructor<\/span><span class=\"p\">(<\/span><span class=\"nx\">props<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n      <span class=\"k\">super<\/span><span class=\"p\">(<\/span><span class=\"nx\">props<\/span><span class=\"p\">)<\/span>\n      <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">state<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\n          <span class=\"na\">count<\/span><span class=\"p\">:<\/span> <span class=\"mi\">0<\/span>\n      <span class=\"p\">}<\/span>\n  <span class=\"p\">}<\/span>\n\n  <span class=\"nx\">handleClick<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">setState<\/span><span class=\"p\">({<\/span><span class=\"na\">count<\/span><span class=\"p\">:<\/span> <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">state<\/span><span class=\"p\">.<\/span><span class=\"nx\">count<\/span> <span class=\"o\">+<\/span> <span class=\"mi\">1<\/span><span class=\"p\">})<\/span>\n  <span class=\"p\">}<\/span>\n\n  <span class=\"nx\">render<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">return<\/span> <span class=\"p\">(<\/span>\n      <span class=\"p\">&lt;<\/span><span class=\"nt\">div<\/span><span class=\"p\">&gt;<\/span>\n        <span class=\"p\">&lt;<\/span><span class=\"nt\">p<\/span><span class=\"p\">&gt;<\/span>Vous avez cliqu\u00e9 <span class=\"si\">{<\/span><span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">state<\/span><span class=\"p\">.<\/span><span class=\"nx\">count<\/span><span class=\"si\">}<\/span> fois<span class=\"p\">&lt;\/<\/span><span class=\"nt\">p<\/span><span class=\"p\">&gt;<\/span>\n        <span class=\"p\">&lt;<\/span><span class=\"nt\">button<\/span> <span class=\"na\">onClick<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">handleClick<\/span><span class=\"si\">}<\/span><span class=\"p\">&gt;<\/span>\n          Cliquez ici\n        <span class=\"p\">&lt;\/<\/span><span class=\"nt\">button<\/span><span class=\"p\">&gt;<\/span>\n      <span class=\"p\">&lt;\/<\/span><span class=\"nt\">div<\/span><span class=\"p\">&gt;<\/span>\n    <span class=\"p\">)<\/span>\n  <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n<h4>\n  \n  \n  Equivalent avec un composant bas\u00e9 sur une fonction\n<\/h4>\n\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight jsx\"><code><span class=\"k\">import<\/span> <span class=\"p\">{<\/span><span class=\"nx\">useState<\/span><span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">react<\/span><span class=\"dl\">'<\/span>\n\n<span class=\"kd\">const<\/span> <span class=\"nx\">MyComponent<\/span> <span class=\"o\">=<\/span> <span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n  <span class=\"kd\">const<\/span> <span class=\"p\">[<\/span><span class=\"nx\">count<\/span><span class=\"p\">,<\/span> <span class=\"nx\">setCount<\/span><span class=\"p\">]<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">useState<\/span><span class=\"p\">(<\/span><span class=\"mi\">0<\/span><span class=\"p\">)<\/span>\n\n  <span class=\"kd\">const<\/span> <span class=\"nx\">handleClick<\/span> <span class=\"o\">=<\/span> <span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n    <span class=\"nx\">setCount<\/span><span class=\"p\">(<\/span><span class=\"nx\">count<\/span> <span class=\"o\">+<\/span> <span class=\"mi\">1<\/span><span class=\"p\">)<\/span>\n  <span class=\"p\">}<\/span>\n\n  <span class=\"k\">return<\/span> <span class=\"p\">(<\/span>\n    <span class=\"p\">&lt;<\/span><span class=\"nt\">div<\/span><span class=\"p\">&gt;<\/span>\n      <span class=\"p\">&lt;<\/span><span class=\"nt\">p<\/span><span class=\"p\">&gt;<\/span>Vous avez cliqu\u00e9 <span class=\"si\">{<\/span><span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">state<\/span><span class=\"p\">.<\/span><span class=\"nx\">count<\/span><span class=\"si\">}<\/span> fois<span class=\"p\">&lt;\/<\/span><span class=\"nt\">p<\/span><span class=\"p\">&gt;<\/span>\n      <span class=\"p\">&lt;<\/span><span class=\"nt\">button<\/span> <span class=\"na\">onClick<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">handleClick<\/span><span class=\"si\">}<\/span><span class=\"p\">&gt;<\/span>\n        Cliquez ici\n      <span class=\"p\">&lt;\/<\/span><span class=\"nt\">button<\/span><span class=\"p\">&gt;<\/span>\n    <span class=\"p\">&lt;\/<\/span><span class=\"nt\">div<\/span><span class=\"p\">&gt;<\/span>\n  <span class=\"p\">)<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n<p>Avouez qu'avec le hook c'est beaucoup moins verbeux \ud83d\ude01.<\/p>\n\n<p>D\u00e9cortiquons tout \u00e7a!<\/p>\n<h4>\n  \n  \n  Cr\u00e9ation d'une variable d'\u00e9tat\n<\/h4>\n\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight javascript\"><code><span class=\"kd\">const<\/span> <span class=\"p\">[<\/span><span class=\"nx\">count<\/span><span class=\"p\">,<\/span> <span class=\"nx\">setCount<\/span><span class=\"p\">]<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">useState<\/span><span class=\"p\">(<\/span><span class=\"mi\">0<\/span><span class=\"p\">)<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n<p>La fonction <strong>useState<\/strong> prend en param\u00e8tre l'\u00e9tat initial (la valeur par d\u00e9faut) et retourne un tuple contenant l'\u00e9tat actuel et une fonction permettant de le modifier. <strong>Attention l'ordre est important<\/strong>.<br>\nCi-dessous, la signature de la fonction <strong>useState<\/strong>:<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight javascript\"><code><span class=\"p\">(<\/span><span class=\"nx\">initialState<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">[<\/span><span class=\"nx\">state<\/span><span class=\"p\">,<\/span> <span class=\"nx\">setState<\/span><span class=\"p\">]<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<p>Par convention, le nom de la fonction permettant de modifier l'\u00e9tat est sous la forme <code>set&lt;StateName&gt;<\/code> afin de facilement savoir \u00e0 quoi elle sert et quel \u00e9tat elle modifie.<\/p>\n\n<h4>\n  \n  \n  Modification d'un \u00e9tat\n<\/h4>\n\n\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight javascript\"><code><span class=\"nx\">setCount<\/span><span class=\"p\">(<\/span><span class=\"nx\">count<\/span> <span class=\"o\">+<\/span> <span class=\"mi\">1<\/span><span class=\"p\">)<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<p>Pour modifier l'\u00e9tat, on appelle la fonction renvoy\u00e9e par <strong>useState<\/strong>, dans notre cas <em>setCount<\/em>, en lui passant en param\u00e8tre la nouvelle valeur \u00e0 attribuer \u00e0 l'\u00e9tat.<br>\nCi-dessous, la signature de la fonction renvoy\u00e9e par <strong>useState<\/strong>:<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight javascript\"><code><span class=\"p\">(<\/span><span class=\"nx\">newState<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"k\">void<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<h5>\n  \n  \n  \u26a0\ufe0f Attention !!! Il ne faut surtout pas modifier l'\u00e9tat comme ceci:\n<\/h5>\n\n\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight javascript\"><code><span class=\"nx\">count<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">count<\/span> <span class=\"o\">+<\/span> <span class=\"mi\">1<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<p>\u26d4\ufe0f\u26d4\ufe0f\u26d4\ufe0f\u26d4\ufe0f Mauvais Mauvais Mauvais et... Mauvais \ud83d\ude45\ud83c\udffe\u200d\u2642\ufe0f<\/p>\n\n<p>En mettant \u00e0 jour l'\u00e9tat de cette mani\u00e8re, React ne saura pas que votre \u00e9tat a chang\u00e9. <strong>Il n'actualisera donc pas le rendu du composant!<\/strong>.<\/p>\n\n<p>Vous pouvez utiliser autant de variable d'\u00e9tat que vous le souhaitez dans un composant.<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight jsx\"><code><span class=\"k\">import<\/span> <span class=\"p\">{<\/span><span class=\"nx\">useState<\/span><span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">react<\/span><span class=\"dl\">'<\/span>\n\n<span class=\"kd\">const<\/span> <span class=\"nx\">MyComponent<\/span> <span class=\"o\">=<\/span> <span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n  <span class=\"kd\">const<\/span> <span class=\"p\">[<\/span><span class=\"nx\">count<\/span><span class=\"p\">,<\/span> <span class=\"nx\">setCount<\/span><span class=\"p\">]<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">useState<\/span><span class=\"p\">(<\/span><span class=\"mi\">0<\/span><span class=\"p\">)<\/span>\n  <span class=\"kd\">const<\/span> <span class=\"p\">[<\/span><span class=\"nx\">age<\/span><span class=\"p\">,<\/span> <span class=\"nx\">setAge<\/span><span class=\"p\">]<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">useState<\/span><span class=\"p\">(<\/span><span class=\"mi\">30<\/span><span class=\"p\">)<\/span>\n  <span class=\"kd\">const<\/span> <span class=\"p\">[<\/span><span class=\"nx\">city<\/span><span class=\"p\">,<\/span> <span class=\"nx\">setCity<\/span><span class=\"p\">]<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">useState<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">Abidjan<\/span><span class=\"dl\">'<\/span><span class=\"p\">)<\/span>\n  <span class=\"kd\">const<\/span> <span class=\"p\">[<\/span><span class=\"nx\">lunch<\/span><span class=\"p\">,<\/span> <span class=\"nx\">setLunch<\/span><span class=\"p\">]<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">useState<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">\ud83c\udf54<\/span><span class=\"dl\">'<\/span><span class=\"p\">)<\/span>\n\n  <span class=\"p\">...<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<h4>\n  \n  \n  \ud83d\udca1 Petite astuce de pro\n<\/h4>\n\n<p>La fonction renvoy\u00e9e par <strong>useState<\/strong> a une deuxi\u00e8me signature:<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight javascript\"><code><span class=\"p\">((<\/span><span class=\"nx\">prevState<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"nx\">newState<\/span> <span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"k\">void<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<p>Cela signifie qu'au lieu de lui passer directement le nouvel \u00e9tat, vous pouvez lui donner en param\u00e8tre une fonction qui prend elle-m\u00eame en param\u00e8tre l'\u00e9tat actuel et renvoie le nouvel \u00e9tat.<\/p>\n\n<p>Hum... pas clair \ud83d\ude43? Un petit exemple s'impose donc.<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight javascript\"><code><span class=\"nx\">setCount<\/span><span class=\"p\">((<\/span><span class=\"nx\">previousState<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"nx\">previousState<\/span> <span class=\"o\">+<\/span> <span class=\"mi\">1<\/span><span class=\"p\">)<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<p>Ici, notre fonction <em>setCount<\/em> re\u00e7oit en param\u00e8tre la fonction <em>(previousState) =&gt; previousState + 1<\/em>. La variable <em>previousState<\/em> repr\u00e9sente dans cette fonction l'\u00e9tat courant. Autrement dit <em>previousState === count<\/em>. Puis, elle renvoie \u00e0 <em>setCount<\/em> l'\u00e9tat courant incr\u00e9ment\u00e9 <em>previousState + 1<\/em>. \ud83d\ude0a<\/p>\n\n<p>Cette m\u00e9thode est tr\u00e8s utile lorsque vous avez des \u00e9tats plus complexes comme des objets et que vous souhaitez seulement mettre \u00e0 jour une partie de l'\u00e9tat.<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight javascript\"><code><span class=\"c1\">\/\/ D\u00e9claration de l'\u00e9tat<\/span>\n<span class=\"kd\">const<\/span> <span class=\"p\">[<\/span><span class=\"nx\">person<\/span><span class=\"p\">,<\/span> <span class=\"nx\">setPerson<\/span><span class=\"p\">]<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">useState<\/span><span class=\"p\">({<\/span><span class=\"na\">firstName<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">Martial<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"na\">lastName<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">Anouman<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"na\">age<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">\ud83e\udd10<\/span><span class=\"dl\">'<\/span><span class=\"p\">})<\/span>\n\n<span class=\"p\">...<\/span>\n<span class=\"c1\">\/\/ Mise \u00e1 jour en r\u00e9action \u00e0 un \u00e9v\u00e8nement<\/span>\n<span class=\"nx\">setPerson<\/span><span class=\"p\">((<\/span><span class=\"nx\">previousState<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{...<\/span><span class=\"nx\">previousState<\/span><span class=\"p\">,<\/span> <span class=\"na\">firstName<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">Martial G.<\/span><span class=\"dl\">'<\/span><span class=\"p\">})<\/span>\n<span class=\"p\">...<\/span>\n\n<span class=\"nx\">console<\/span><span class=\"p\">.<\/span><span class=\"nx\">log<\/span><span class=\"p\">(<\/span><span class=\"nx\">person<\/span><span class=\"p\">)<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n\n\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code><span class=\"o\">{<\/span>age: <span class=\"s1\">'\ud83e\udd10'<\/span>, firstName: <span class=\"s1\">'Martial G.'<\/span>, lastName: <span class=\"s1\">'Anouman'<\/span><span class=\"o\">}<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<p>Voila, c'est tout pour le hook <strong>useState<\/strong> \ud83d\ude0a.<\/p>\n\n<p>J'esp\u00e8re que cet article vous a plu et aid\u00e9 dans votre prise en main de ce hook. <br>\nRendez-vous au prochain article de la s\u00e9rie sur le hook <strong>useEffect<\/strong>(en cours).<\/p>\n\n<p>Happy coding! \ud83e\udd13 <\/p>\n\n","category":["react","hooks","javascript","french"]}}}