{"id":234274,"date":"2023-02-26T18:24:00","date_gmt":"2023-02-26T15:24:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=234274"},"modified":"2023-02-26T18:25:42","modified_gmt":"2023-02-26T15:25:42","slug":"gutenberg-mise-a-jour-de-withselect-et-withdispatch-dans-react-hooks-useselect-et-usedispatch","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fr\/gutenberg-mise-a-jour-de-withselect-et-withdispatch-dans-react-hooks-useselect-et-usedispatch\/","title":{"rendered":"Gutenberg\u00a0: Mise \u00e0 jour de withSelect et withDispatch dans React Hooks (useSelect et useDispatch)"},"content":{"rendered":"\n<p>Cet article est une introduction rapide \u00e0 un moyen de maintenir votre code Gutenberg aux normes actuelles en utilisant les crochets React. Nous verrons comment cela est b\u00e9n\u00e9fique, pourquoi nous devrions le faire et comment.<\/p>\n<h2>Hein, crochets?<\/h2>\n<p>Je suppose que vous avez d\u00e9j\u00e0 une certaine exp\u00e9rience de travail avec des blocs ou des plugins Gutenberg un peu plus complexes qui interrogent les messages, ou r\u00e9cup\u00e8rent et mettent \u00e0 jour les m\u00e9ta post. Et donc travaill\u00e9 avec <code>[withSelect](https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/packages\/packages-data\/#withSelect)<\/code>et\/ou <code>[withDispatch](https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/packages\/packages-data\/#withDispatch)<\/code>. Ce sont des composants d&rsquo;ordre sup\u00e9rieur dans WordPress qui vous permettent d&rsquo;acc\u00e9der aux magasins WordPress afin de r\u00e9cup\u00e9rer ou de pousser des informations un peu en dehors du bloc &quot;normal&quot; ou de la post-\u00e9dition. Vous avez peut-\u00eatre \u00e9galement \u00e9t\u00e9 oblig\u00e9 d&rsquo;utiliser <code>compose<\/code>afin de combiner votre composant avec plusieurs composants d&rsquo;ordre sup\u00e9rieur. Si votre code utilise ces mod\u00e8les, ne vous inqui\u00e9tez pas\u00a0: ils fonctionnent parfaitement et continueront de fonctionner\u00a0! Mais \u00e0 mesure que la technologie progresse, nous pouvons faire mieux.<\/p>\n<p>D\u00e9but 2019, <a href=\"https:\/\/reactjs.org\/docs\/hooks-intro.html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">React a lanc\u00e9 des crochets<\/a> (version 16.8) &#8211; qui vous permettent d&rsquo;utiliser l&rsquo;\u00e9tat sans utiliser de classe et d&rsquo;am\u00e9liorer d&rsquo;autres fonctionnalit\u00e9s qui donnent un code plus lisible et r\u00e9utilisable. Par exemple, en supprimant la n\u00e9cessit\u00e9 d&rsquo;envelopper votre code dans des composants d&rsquo;ordre sup\u00e9rieur afin d&rsquo;acc\u00e9der aux registres. Et \u00e0 <a href=\"https:\/\/make.wordpress.org\/core\/2019\/06\/10\/introducing-usedispatch-and-useselect\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">l&rsquo;\u00e9t\u00e9 2019, WordPress a suivi<\/a>, en lan\u00e7ant des hooks personnalis\u00e9s: <code>[useDispatch](https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/packages\/packages-data\/#useDispatch)<\/code>et <code>[useSelect](https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/packages\/packages-data\/#useSelect)<\/code>.<\/p>\n<p>Les avantages des crochets sont nombreux. L&rsquo;exemple le plus courant permet d&rsquo;utiliser l&rsquo;\u00e9tat du composant sans avoir \u00e0 \u00e9crire une classe Javascript (<code>useState<\/code>). Mais \u00e0 mon avis, le plus grand avantage est la r\u00e9utilisabilit\u00e9. En supprimant la n\u00e9cessit\u00e9 d&rsquo;utiliser des mod\u00e8les tels que des accessoires de rendu et des composants d&rsquo;ordre sup\u00e9rieur, les composants peuvent \u00eatre \u00e9crits en morceaux beaucoup plus ind\u00e9pendants. Un autre avantage des crochets est qu&rsquo;ils rendent votre code plus facile \u00e0 lire et \u00e0 comprendre !<\/p>\n<p>Passons directement \u00e0 quelques exemples et voyons comment impl\u00e9menter <code>useSelect<\/code>et <code>useDispatch<\/code>crocheter notre code\u00a0!<\/p>\n<h2>Ex\u00e9cution<code>useSelect<\/code><\/h2>\n<p>Commen\u00e7ons par <code>withSelect<\/code>et son crochet correspondant <code>useSelect<\/code>. Ceux-ci sont utilis\u00e9s pour obtenir des accessoires d\u00e9riv\u00e9s de l&rsquo;\u00e9tat \u00e0 partir de s\u00e9lecteurs enregistr\u00e9s. Des exemples courants sont l&rsquo;acc\u00e8s aux s\u00e9lecteurs &lsquo; <code>core<\/code>&lsquo; ou &lsquo; <code>core\/editor<\/code>&lsquo; afin d&rsquo;effectuer des requ\u00eates pour les publications (<code>getEntityRecords<\/code>), acc\u00e9der \u00e0 la m\u00e9ta des publications (<code>getEditedPostAttribute<\/code>) ou simplement obtenir le type de publication actuel ou d&rsquo;autres informations.<\/p>\n<p>\u00c0 des fins de d\u00e9monstration, je commencerai par un exemple simple. Supposons que j&rsquo;ai un composant de bloc o\u00f9 j&rsquo;ai un s\u00e9lecteur de publication quelque part. Afin de remplir les choix de publication, j&rsquo;ai besoin d&rsquo;acc\u00e9der au registre &lsquo; <code>core<\/code>&lsquo; et d&rsquo;effectuer un <code>GetEntityRecords()<\/code>appel.<\/p>\n<h3>Utilisation \u00e0 l&rsquo;ancienne<code>withSelect<\/code><\/h3>\n<p>Si je veux interroger des publications dans un bloc, je devrais envelopper mon composant dans <code>withSelect<\/code>. Cela se fait couramment dans la <code>export<\/code>d\u00e9claration.<\/p>\n<p>Veuillez noter que cet exemple de code n&rsquo;est pas complet en tant que v\u00e9ritable bloc fonctionnel ou plug-in JS, il a \u00e9t\u00e9 supprim\u00e9 pour ne montrer que les concepts de base de <code>withSelect<\/code>. Si vous recherchez des exemples de code pratiques, j&rsquo;ai d&rsquo;autres articles qui traitent de cela: par exemple, <a href=\"https:\/\/wordpress.mediadoma.com\/fr\/creer-un-bloc-gutenberg-personnalise-partie-10-recuperation-des-publications-et-des-composants-dordre-superieur\/\" title=\"comment impl\u00e9menter des blocs avec un post select\">comment impl\u00e9menter des blocs avec un post select<\/a>, ou <a href=\"https:\/\/wordpress.mediadoma.com\/fr\/comment-ajouter-des-champs-meta-de-publication-a-la-barre-laterale-du-document-gutenberg\/\" title=\"comment ajouter post meta \u00e0 l&#039;inspector\">comment ajouter post meta \u00e0 l&rsquo;inspector<\/a>. Ceux-ci sont \u00e9crits avec <code>withSelect<\/code>et <code>withDispatch<\/code>, ceux-l\u00e0 aussi, puis revenez ici pour apprendre \u00e0 les transformer en crochets.<\/p>\n<pre><code>const { withSelect } = wp.data;\n\u00a0\nconst AWP_Example_Plugin = ({ somePosts }) =&gt; {\n    console.log(\"Posts from withSelect = \", somePosts);\n    return(\n        &lt;div&gt;\n            ...\n        &lt;\/div&gt;\n    );\n}\n\u00a0\nexport default withSelect( (select) =&gt; {      \n    return {\n        somePosts: select( 'core' ).getEntityRecords( 'postType', 'page' ),\n    };\n}) (AWP_Example_Plugin );<\/code><\/pre>\n<p>Comme vous pouvez le voir en ligne <code>#12-16<\/code>, j&rsquo;enveloppe mon composant avec <code>withSelect<\/code>. \u00c0 l&rsquo;int\u00e9rieur de la fonction withSelect, je peux acc\u00e9der au magasin que je veux et je renvoie une requ\u00eate de publication dans la prop &quot; <code>somePosts<\/code>&quot;. Cet accessoire sera alors disponible dans mon <code>AWP_Example_Plugin<\/code>composant (comme vous pouvez le voir, je d\u00e9structure <code>somePosts<\/code>les accessoires \u00e0 la ligne <code>#3<\/code>).<\/p>\n<p>Comme mentionn\u00e9 pr\u00e9c\u00e9demment, cette m\u00e9thode fonctionne tr\u00e8s bien &#8211; et continuera de le faire. Mais il y a plusieurs inconv\u00e9nients \u00e0 cela. La premi\u00e8re est que ce n&rsquo;est pas tr\u00e8s facile \u00e0 comprendre. Bien s\u00fbr, c&rsquo;\u00e9tait un exemple tr\u00e8s simple. \u00c0 premi\u00e8re vue, au composant lui-m\u00eame, vous ne savez pas d&rsquo;o\u00f9 <code>somePosts<\/code>vient l&rsquo;accessoire ni de quoi il s&rsquo;agit. Vous devez savoir rechercher la d\u00e9claration d&rsquo;exportation et voir s&rsquo;il y a des emballages. Il se sent aussi un peu d\u00e9cousu. Vous faites une bonne partie du travail important en dehors de votre composant, pour quelque chose que vous voulez r\u00e9ellement disponible \u00e0 l&rsquo;int\u00e9rieur de votre composant.<\/p>\n<p>Faisons mieux en utilisant des crochets.<\/p>\n<h3>Conversion en<code>useSelect<\/code><\/h3>\n<p>Convertir un <code>withSelect<\/code>en <code>useSelect<\/code>est aussi simple que possible. La premi\u00e8re \u00e9tape consiste \u00e0 d\u00e9finir la variable \u00e0 l&rsquo; <code>somePosts<\/code>int\u00e9rieur de notre composant, plut\u00f4t qu&rsquo;\u00e0 l&rsquo;ext\u00e9rieur par l&rsquo; <code>export<\/code>instruction. La deuxi\u00e8me \u00e9tape consiste \u00e0 d\u00e9placer toute la fonction que nous avions <code>withSelect<\/code>dans <code>useSelect<\/code>. Et c&rsquo;est tout.<\/p>\n<pre><code>const { useSelect } = wp.data;\n\u00a0\nconst AWP_Example_Plugin =() =&gt; {\n    const { somePosts } = useSelect( (select) =&gt; {        \n        return {\n            somePosts: select( 'core' ).getEntityRecords( 'postType', 'page' ),\n        };\n    } );\n    console.log(\"Posts from useSelect = \", somePosts);\n    return(\n        &lt;div&gt;\n            ...\n        &lt;\/div&gt;\n    );\n}\n\u00a0\nexport default AWP_Example_Plugin;<\/code><\/pre>\n<p>Le code ci-dessus fournit exactement le m\u00eame r\u00e9sultat que celui avec <code>withSelect<\/code>. La diff\u00e9rence est que le code est maintenant beaucoup plus compr\u00e9hensible! Nous pouvons maintenant voir tr\u00e8s facilement que la variable <code>somePosts<\/code>stocke le r\u00e9sultat d&rsquo;une requ\u00eate post, directement dans notre composant.<\/p>\n<p><strong>Note importante<\/strong>: <code>useSelect<\/code>accepte un deuxi\u00e8me param\u00e8tre\u00a0; un tableau de d\u00e9pendances. Les d\u00e9pendances sont des variables qui garantissent que nous n&rsquo;ex\u00e9cutons que <code>useSelect<\/code>lorsque l&rsquo;une des d\u00e9pendances (valeurs variables) a chang\u00e9. Ce bit est plus important <code>useDispatch<\/code>qu&rsquo;ici, donc je vais l&rsquo;expliquer plus en d\u00e9tail dans la <code>useDispatch<\/code>section ci-dessous.<\/p>\n<h2>Ex\u00e9cution<code>useDispatch<\/code><\/h2>\n<p>Regardons maintenant <code>withDispatch<\/code>et son crochet correspondant <code>useDispatch<\/code>. Ils sont utilis\u00e9s pour envoyer des props aux registres. Par exemple, dire \u00e0 Gutenberg de mettre \u00e0 jour une m\u00e9ta de publication via &lsquo; <code>core\/editor<\/code>&lsquo;.<\/p>\n<p>Encore une fois, \u00e0 des fins de d\u00e9monstration, mes exemples de code ne sont pas des morceaux de code fonctionnels complets &#8211; ils illustrent uniquement les parties concernant ces mod\u00e8les. Dans cet exemple, je suppose que j&rsquo;ai un champ de texte affichant une m\u00e9ta de publication &#8211; et je souhaite mettre \u00e0 jour la valeur de la m\u00e9ta de publication en cas de modification.<\/p>\n<h3>Utilisation \u00e0 l&rsquo;ancienne<code>withDispatch<\/code><\/h3>\n<p>Comme <code>withDispatch<\/code>il s&rsquo;agit d&rsquo;un composant d&rsquo;ordre sup\u00e9rieur, j&rsquo;aurais besoin d&rsquo;envelopper mon composant \u00e0 l&rsquo;int\u00e9rieur. Cela se fait couramment dans la <code>export<\/code>d\u00e9claration. Afin de faire fonctionner le champ de texte de notre m\u00e9ta, nous<\/p>\n<p>Par exemple:<\/p>\n<pre><code>const { withDispatch } = wp.data;\nconst { __ } = wp.i18n;\nconst { PluginDocumentSettingPanel } = wp.editPost;\nconst { TextControl, PanelRow } = wp.components;\nconst AWP_Example_Plugin = ({ setPostMeta }) =&gt; { \n    return(\n        &lt;PluginDocumentSettingPanel title={ __( 'withDispatch Example', 'txtdomain') }&gt;\n            &lt;PanelRow&gt;\n                &lt;TextControl\n                    label={ __( 'Example post meta', 'txtdomain') }\n                    value=\"\"\n                    onChange={ (value) =&gt; setPostMeta( { example_post_meta: value }) }\n                \/&gt;\n            &lt;\/PanelRow&gt;\n        &lt;\/PluginDocumentSettingPanel&gt;\n    );\n}\n\u00a0\nexport default withDispatch( (dispatch) =&gt; {\n    return {\n        setPostMeta( newMeta) {\n            dispatch( 'core\/editor' ).editPost( { meta: newMeta } );\n        }\n    };\n} )( AWP_Example_Plugin );<\/code><\/pre>\n<p>\u00c0 la ligne, <code>#20-26<\/code>nous enveloppons le composant \u00e0 l&rsquo;int\u00e9rieur <code>withDispatch<\/code>de, dans lequel nous renvoyons une fonction &quot; <code>setPostMeta<\/code>&quot; qui distribue la post m\u00e9ta (pour la mettre \u00e0 jour). \u00c0 la ligne, <code>#6<\/code>nous d\u00e9structurons le prop afin de pouvoir l&rsquo;utiliser dans l&rsquo; <code>onChange<\/code>\u00e9v\u00e9nement du champ de texte \u00e0 la ligne <code>#13<\/code>. (Veuillez noter que l&rsquo;exemple ci-dessus ne serait pas fonctionnel car nous avons d\u00e9fini la valeur du champ de texte sur une cha\u00eene vide. C&rsquo;est juste pour montrer comment nous utiliserions dispatch).<\/p>\n<p>Encore une fois, nous pouvons voir que le code n&rsquo;est pas aussi simple \u00e0 comprendre. Vous devez savoir rechercher l&#8217;emballage afin de d\u00e9terminer ce qu&rsquo;est <code>setPostMeta<\/code>ou d&rsquo;o\u00f9 vient l&rsquo;accessoire &quot; &quot;. Faisons mieux en utilisant des crochets\u00a0!<\/p>\n<h3>Conversion en<code>useDispatch<\/code><\/h3>\n<p>Changer <code>withDispatch<\/code>en <code>useDispatch<\/code>n&rsquo;est pas aussi simple que de se convertir <code>withSelect<\/code>en <code>useSelect<\/code>. C&rsquo;est quand m\u00eame assez facile. Il y a deux choses \u00e0 garder \u00e0 l&rsquo;esprit. La premi\u00e8re est que <code>useDispatch<\/code>prend un nom de magasin comme premier param\u00e8tre. Nous acc\u00e9dons alors au magasin et appelons ses fonctions disponibles lorsque nous l&rsquo;utilisons (par exemple dans l&rsquo; <code>onChange<\/code>\u00e9v\u00e9nement d&rsquo;un champ de texte). Deuxi\u00e8mement, le tableau des d\u00e9pendances du <code>useDispatch<\/code>deuxi\u00e8me param\u00e8tre de est plus important qu&rsquo;avec <code>useSelect<\/code>. Vous pouvez risquer que votre code se retrouve dans une boucle \u00e9ternelle si vous ne g\u00e9rez pas correctement les d\u00e9pendances. Ce n&rsquo;est que lorsque les variables de d\u00e9pendance sont modifi\u00e9es que le script s&rsquo;ex\u00e9cutera \u00e0 nouveau <code>useDispatch<\/code>.<\/p>\n<p>Par exemple:<\/p>\n<pre><code>const { useDispatch } = wp.data;\nconst { __ } = wp.i18n;\nconst { PluginDocumentSettingPanel } = wp.editPost;\nconst { TextControl, PanelRow } = wp.components;\nconst AWP_Example_Plugin =() =&gt; {  \n    const tmpMetaValue = \"\";\n    const { editPost } = useDispatch( 'core\/editor', [ tmpMetaValue ] );\n\u00a0\n    return(\n        &lt;PluginDocumentSettingPanel title={ __( 'useDispatch Example', 'txtdomain') }&gt;\n            &lt;PanelRow&gt;\n                &lt;TextControl\n                    label={ __( 'Example post meta', 'txtdomain') }\n                    value={ tmpMetaValue }\n                    onChange={ (value) =&gt; editPost( { meta: { example_post_meta: value } }) }\n                \/&gt;\n            &lt;\/PanelRow&gt;\n        &lt;\/PluginDocumentSettingPanel&gt;\n    );\n}\n\u00a0\nexport default AWP_Example_Plugin;<\/code><\/pre>\n<p>Chez line <code>#8<\/code>on d\u00e9structure ce dont on a besoin du magasin &lsquo; <code>core\/editor<\/code>&lsquo;. Nous ne sommes int\u00e9ress\u00e9s que par la <code>editPost<\/code>fonction que nous pouvons utiliser pour mettre \u00e0 jour la m\u00e9ta post. Comme deuxi\u00e8me param\u00e8tre, <code>useDispatch<\/code>nous fournissons des d\u00e9pendances. Comme pour un exemple de mise \u00e0 jour de post meta, utiliser la valeur de post meta (en utilisant <code>useSelect<\/code>) serait parfait comme d\u00e9pendance. Dans cet exemple, je viens de le d\u00e9finir comme une variable factice. Regardez plus bas pour un exemple plus complet et r\u00e9aliste. Et puis \u00e0 la ligne <code>#16<\/code>dans l&rsquo;\u00e9v\u00e9nement du champ de texte <code>onChange<\/code>, nous appelons <code>editPost<\/code>pour mettre \u00e0 jour la m\u00e9ta. Notez la diff\u00e9rence entre cette ligne et l&rsquo;utilisation <code>withDispatch<\/code>ci-dessus\u00a0! Puisque nous utilisons <code>editPost<\/code>directement au lieu de renvoyer une fonction pour mettre \u00e0 jour la m\u00e9ta post pour nous (<code>setPostMeta<\/code>), nous devons fournir un objet avec<code>meta<\/code>comme cl\u00e9, puis un objet avec la m\u00e9ta post que nous voulons mettre \u00e0 jour. Nous avons en quelque sorte divis\u00e9 le <code>withDispatch<\/code>code en morceaux.<\/p>\n<p>Pourtant, l&rsquo;utilisation <code>useDispatch<\/code>rend le code beaucoup plus lisible et compr\u00e9hensible. Plus de code ajout\u00e9 en dehors de notre composant que nous devons utiliser \u00e0 l&rsquo;int\u00e9rieur.<\/p>\n<h2>Un exemple plus complet et \u00e9liminant le besoin de<code>compose<\/code><\/h2>\n<p>Il y a de fortes chances que si vous utilisez <code>withDispatch<\/code>, vous aurez \u00e9galement besoin <code>withSelect<\/code>de ce composant. Dans les exemples de conversion ci- <code>useDispatch<\/code>dessus, nous mettons \u00e0 jour une m\u00e9ta-valeur post. Mais pour que le champ de texte fonctionne correctement (et affiche \u00e9galement la valeur actuelle), nous aurions \u00e9galement besoin de r\u00e9cup\u00e9rer la m\u00e9ta-valeur post.<\/p>\n<p>Si vous avez besoin d&rsquo;utiliser plusieurs composants d&rsquo;ordre sup\u00e9rieur enroul\u00e9s autour de votre composant, vous utiliserez tr\u00e8s probablement une autre fonction Gutenberg\u00a0; <code>[compose](https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/packages\/packages-compose\/)<\/code>. C&rsquo;est une fonction pratique pour combiner plusieurs composants d&rsquo;ordre sup\u00e9rieur en un seul composant d&rsquo;ordre sup\u00e9rieur autour duquel vous pouvez envelopper votre composant.<\/p>\n<p>Regardons un exemple plus complet d&rsquo;un composant qui r\u00e9cup\u00e8re une m\u00e9ta-valeur post dans un champ de texte et se met \u00e0 jour lorsque sa valeur est modifi\u00e9e. Nous commen\u00e7ons par la fa\u00e7on dont nous devrions nous y prendre en utilisant <code>withSelect<\/code>et <code>withDispatch<\/code>(et donc aussi <code>compose<\/code>).<\/p>\n<h3>En utilisant <code>withSelect<\/code>, <code>withDispatch<\/code>et<code>compose<\/code><\/h3>\n<pre><code>const { __ } = wp.i18n;\nconst { compose } = wp.compose;\nconst { withSelect, withDispatch } = wp.data;\nconst { PluginDocumentSettingPanel } = wp.editPost;\nconst { TextControl, PanelRow } = wp.components;\n\u00a0\nconst AWP_Example_Plugin = ({ postMeta, setPostMeta }) =&gt; {\n    return(\n        &lt;PluginDocumentSettingPanel title={ __( 'withSelect and withDispatch Example', 'txtdomain') }&gt;\n            &lt;PanelRow&gt;\n                &lt;TextControl\n                    label={ __( 'Example post meta', 'txtdomain') }\n                    value={ postMeta.example_post_meta }\n                    onChange={ (value) =&gt; setPostMeta( { example_post_meta: value }) }\n                \/&gt;\n            &lt;\/PanelRow&gt;\n        &lt;\/PluginDocumentSettingPanel&gt;\n    );\n}\n\u00a0\nexport default compose( [\n    withSelect( (select) =&gt; {     \n        return {\n            postMeta: select( 'core\/editor' ).getEditedPostAttribute( 'meta' ),\n        };\n    } ),\n    withDispatch( (dispatch) =&gt; {\n        return {\n            setPostMeta( newMeta) {\n                dispatch( 'core\/editor' ).editPost( { meta: newMeta } );\n            }\n        };\n    }) ] )( AWP_Example_Plugin );<\/code><\/pre>\n<p>Chez line <code>#21-34<\/code>nous les composons <code>withSelect<\/code>et <code>withDispatch<\/code>les enroulons autour de notre composant. <code>postMeta<\/code>from <code>withSelect<\/code>et <code>setPostMeta<\/code>from <code>withDispatch<\/code>sont maintenant disponibles dans notre composant en tant qu&rsquo;accessoires. Nous les d\u00e9structurons \u00e0 la ligne <code>#7<\/code>et les utilisons dans <code>#13<\/code>et <code>#14<\/code>.<\/p>\n<p>Comme vous pouvez le voir, le code n\u00e9cessaire en dehors de notre composant est plus long que le composant lui-m\u00eame. Je ne sais pas pour vous, mais pour moi, c&rsquo;est un peu d\u00e9cousu. Les d\u00e9veloppeurs peuvent commencer \u00e0 lire ce code par le haut, sans voir la partie inf\u00e9rieure, et commencer \u00e0 se demander d&rsquo;o\u00f9 <code>postMeta<\/code>et d&rsquo;o\u00f9 <code>setPostMeta<\/code>ils viennent &#8211; ils semblent \u00eatre disponibles comme par magie. Pour moi, c&rsquo;est tr\u00e8s peu intuitif.<\/p>\n<p>Regardons comment nous convertirions l&rsquo;exemple ci-dessus en crochets.<\/p>\n<h3>Utiliser <code>useSelect<\/code>et<code>useDispatch<\/code><\/h3>\n<pre><code>const { __ } = wp.i18n;\nconst { useSelect, useDispatch } = wp.data;\nconst { PluginDocumentSettingPanel } = wp.editPost;\nconst { TextControl, PanelRow } = wp.components;\n\u00a0\nconst AWP_Example_Plugin = () =&gt; {\n    const { postMeta } = useSelect( (select) =&gt; {     \n        return {\n            postMeta: select( 'core\/editor' ).getEditedPostAttribute( 'meta' ),\n        };\n    } );\n    const { editPost } = useDispatch( 'core\/editor', [ postMeta.example_post_meta ] );\n\u00a0\n    return(\n        &lt;PluginDocumentSettingPanel title={ __( 'useSelect and useDispatch Example', 'txtdomain') }&gt;\n            &lt;PanelRow&gt;\n                &lt;TextControl\n                    label={ __( 'Example post meta', 'txtdomain') }\n                    value={ postMeta.example_post_meta }\n                    onChange={ (value) =&gt; editPost( { meta: { example_post_meta: value } }) }\n                \/&gt;\n            &lt;\/PanelRow&gt;\n        &lt;\/PluginDocumentSettingPanel&gt;\n    );\n}\n\u00a0\nexport default AWP_Example_Plugin;<\/code><\/pre>\n<p>Qu&rsquo;est-ce que c&rsquo;est beau et lisible\u00a0?\u00a0! Nous pouvons voir imm\u00e9diatement dans notre composant <code>postMeta<\/code>d&rsquo;o\u00f9 est r\u00e9cup\u00e9r\u00e9 et comment nous avons acc\u00e8s \u00e0 <code>editPost<\/code>. Notre composant est \u00e9galement devenu beaucoup plus facile \u00e0 r\u00e9utiliser.<\/p>\n<p>Notez que dans la <code>useDispatch<\/code>ligne <code>#12<\/code>nous ajoutons le postmeta que nous mettons \u00e0 jour en tant que d\u00e9pendance (<code>postMeta.example_post_meta<\/code>). Si vous deviez maintenir \u00e0 jour plusieurs variables m\u00e9ta de publication dans ce composant, vous devrez ajouter chacune en tant que d\u00e9pendance pour vous assurer que l&rsquo;envoi s&rsquo;ex\u00e9cute (en fait, en sauvegardant la m\u00e9ta de publication) lorsque la valeur de l&rsquo;une d&rsquo;entre elles change.<\/p>\n<p>J&rsquo;esp\u00e8re que cela a \u00e9t\u00e9 instructif et utile pour quelqu&rsquo;un. Je connais encore un peu mal les hame\u00e7ons, mais voyant les avantages de les utiliser je ne reviens pas en arri\u00e8re !<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Source d&rsquo;enregistrement:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/awhitepixel.com\" class=\"external external_icon\">awhitepixel.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Une introduction \u00e0 l&rsquo;utilisation des crochets React useSelect et useDispatch. Nous verrons comment cela est b\u00e9n\u00e9fique, pourquoi nous devrions le faire et exactement comment.<\/p>\n","protected":false},"author":1,"featured_media":151604,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[936,936,1110,811,811,841,841,862,862],"tags":[1167],"class_list":["post-234274","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-gutenberg-3","category-n-a","category-plugins-2","category-tutoriels","category-wordpress-3","tag-affiai-fr"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/234274","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/comments?post=234274"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/234274\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media\/151604"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media?parent=234274"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/categories?post=234274"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/tags?post=234274"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}