{"id":228535,"date":"2022-10-12T11:26:00","date_gmt":"2022-10-12T08:26:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=228535"},"modified":"2022-11-09T02:54:24","modified_gmt":"2022-11-08T23:54:24","slug":"composant-react-createclass-casse-reparons-le","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fr\/composant-react-createclass-casse-reparons-le\/","title":{"rendered":"Composant React.createClass cass\u00e9\u00a0? R\u00e9parons-le\u00a0!"},"content":{"rendered":"\n<p>Si vous construisez des blocs WordPress Gutenberg (ou m\u00eame si vous ne le faites pas), vous essayez peut-\u00eatre de <a href=\"https:\/\/wholesomecode.ltd\/blog\/add-select2-as-an-inspectorcontrol-in-wordpress-gutenberg\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">faire fonctionner un composant React tiers dans votre build<\/a>. Mais s&rsquo;il s&rsquo;agit d&rsquo;un \u00e9l\u00e9ment plus ancien, en particulier un \u00e9l\u00e9ment qui utilise la <code>React.createClass<\/code>m\u00e9thode obsol\u00e8te, vous risquez de rester bloqu\u00e9.<\/p>\n<p>Les fichiers qui accompagnent ce didacticiel se trouvent dans les dossiers d&rsquo;origine et corrig\u00e9s dans le dossier des composants de la solution GitHub.<\/p>\n<p><a href=\"https:\/\/github.com\/mattwatsoncodes\/Tutorial-Convert-React-createClass-to-React-Component\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Obtenir des fichiers de didacticiel \u00e0 partir de GitHub<\/a><\/p>\n<p>Je cherchais une liste de cases \u00e0 cocher qui me permettait de passer un tableau d&rsquo;options (similaire \u00e0 la fa\u00e7on dont vous pourriez passer plusieurs options <code>&lt;SelectControl\/&gt;<\/code>dans WordPress Gutenberg). L&rsquo;option int\u00e9gr\u00e9e <code>&lt;CheckboxControl\/&gt;<\/code>n&rsquo;avait pas d&rsquo;option, mais apr\u00e8s quelques recherches sur le Web, j&rsquo;ai trouv\u00e9 <code>[react-checkbox-list](https:\/\/github.com\/sonyan\/react-checkbox-list)<\/code> <a href=\"https:\/\/github.com\/sonyan\/react-checkbox-list\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">par Sony An<\/a> (disponible <a href=\"https:\/\/www.npmjs.com\/package\/react-checkbox-list\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\"><code>react-checkbox-list<\/code>sur npm<\/a> ).<\/p>\n<p>Cela a fait tout ce que je voulais qu&rsquo;il fasse, mais apr\u00e8s l&rsquo;avoir install\u00e9 via npm( <code>npm install react-checkbox-list --save<\/code>), cela n&rsquo;a pas fonctionn\u00e9. Je savais que je devrais bifurquer et patcher le plugin.<\/p>\n<p>Notez que ce didacticiel couvre la correction des m\u00e9thodes <code>React.createClass<\/code>et existantes. <a href=\"https:\/\/mattwatson.codes\/converting-react-createclass-to-react-component\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Si vous souhaitez savoir comment les patcher avec la m\u00e9thode d&rsquo;utilisation pr\u00e9f\u00e9r\u00e9e,<\/a> <a href=\"https:\/\/mattwatson.codes\/converting-react-createclass-to-react-component\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">veuillez consulter l&rsquo;article sur ce sujet<\/a>.<code>React.propTypes<\/code><a href=\"https:\/\/mattwatson.codes\/converting-react-createclass-to-react-component\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external\"><\/a> <code>[React.Component](https:\/\/mattwatson.codes\/converting-react-createclass-to-react-component\/)<\/code><a href=\"https:\/\/mattwatson.codes\/converting-react-createclass-to-react-component\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external\"><\/a><\/p>\n<h2>Patcher le composant React<\/h2>\n<p>Le premier probl\u00e8me que vous rencontrerez est que le composant ne se chargera m\u00eame pas et une <code>Uncaught TypeError: Cannot read property 'array' of undefined<\/code>erreur plut\u00f4t d\u00e9sagr\u00e9able vous sera pr\u00e9sent\u00e9e.<\/p>\n<p>Erreur de type non d\u00e9tect\u00e9e, impossible de lire la propri\u00e9t\u00e9 &lsquo;tableau&rsquo; de non d\u00e9fini<\/p>\n<p>C&rsquo;est parce que le composant contient la ligne suivante <code>defaultData: React.PropTypes.array,<\/code>et c&rsquo;est parce <code>React.PropTypes<\/code>qu&rsquo;elle n&rsquo;est pas d\u00e9finie.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-169379-61e80e28d135c.png\" alt=\"Composant React.createClass cass\u00e9\u00a0? R\u00e9parons-le\u00a0!\" \/>React.PropTypes n&rsquo;est pas d\u00e9fini<\/p>\n<p>Une petite enqu\u00eate sur la <a href=\"https:\/\/reactjs.org\/docs\/typechecking-with-proptypes.html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">documentation de React montre qu&rsquo;elle<\/a> <code>[React.PropTypes](https:\/\/reactjs.org\/docs\/typechecking-with-proptypes.html)<\/code> <a href=\"https:\/\/reactjs.org\/docs\/typechecking-with-proptypes.html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">a \u00e9t\u00e9 d\u00e9plac\u00e9e dans un package diff\u00e9rent dans React version 15.5<\/a>. Il nous conseille d&rsquo;utiliser la biblioth\u00e8que prop-types \u00e0 la place.<\/p>\n<p>Il vous donne m\u00eame un lien vers le <a href=\"https:\/\/www.npmjs.com\/package\/prop-types\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">r\u00e9f\u00e9rentiel npm pour la biblioth\u00e8que prop-types<\/a>. Alors allons-y et installons la biblioth\u00e8que prop-types.<\/p>\n<pre><code>npm install --save prop-types\n<\/code><\/pre>\n<p>En haut de notre document, importons la <code>prop-types<\/code>biblioth\u00e8que. <a href=\"https:\/\/mattwatson.codes\/converting-react-createclass-to-react-component\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">La mani\u00e8re moderne de proc\u00e9der nous obligerait \u00e0 utiliser la<\/a> <code>[import](https:\/\/mattwatson.codes\/converting-react-createclass-to-react-component\/)<\/code> <a href=\"https:\/\/mattwatson.codes\/converting-react-createclass-to-react-component\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">syntaxe<\/a>, mais pour l&rsquo;instant, gardons la m\u00eame syntaxe ajout\u00e9e <code>var PropTypes = require('prop-types');<\/code>au document ci-dessous o\u00f9 nous d\u00e9clarons <code>React<\/code>. La d\u00e9claration d&rsquo;ouverture devrait maintenant ressembler \u00e0 ceci\u00a0:<\/p>\n<pre><code>'use strict';\nvar React     = require('react');\nvar PropTypes = require('prop-types');\n\nmodule.exports = React.createClass({\n    displayName: 'CheckBoxList',\n\n    propTypes: {\n        defaultData: React.PropTypes.array,\n        onChange: React.PropTypes.func\n    },\n...\n<\/code><\/pre>\n<p>Super truc! Cependant, nous recevons toujours le <code>'array' of undefined<\/code>message d&rsquo;erreur. Eh bien, c&rsquo;est parce que la syntaxe utilis\u00e9e est <code>React.PropTypes.array<\/code>et nous venons de d\u00e9clarer nos PropTypes pour utiliser la variable <code>PropTypes<\/code>. La solution simple consiste donc \u00e0 rechercher et \u00e0 remplacer toutes les instances de <code>React.PropTypes<\/code>par <code>PropTypes<\/code>.<\/p>\n<p>Notre bloc de code d&rsquo;ouverture devrait maintenant ressembler \u00e0 ceci\u00a0:<\/p>\n<pre><code>'use strict';\nvar React     = require('react');\nvar PropTypes = require('prop-types');\n\nmodule.exports = React.createClass({\n    displayName: 'CheckBoxList',\n\n    propTypes: {\n        defaultData: PropTypes.array,\n        onChange: PropTypes.func\n    },\n...\n<\/code><\/pre>\n<p>Et voil\u00e0, notre probl\u00e8me PropTypes est maintenant r\u00e9solu! Rafra\u00eechissons notre composant et voyons si cela fonctionne.<\/p>\n<p>Non, nous obtenons maintenant l&rsquo;erreur<code>Uncaught TypeError: React.createClass is not a function.<\/code><\/p>\n<p><img decoding=\"async\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-169379-61e80e28d135c.png\" alt=\"Composant React.createClass cass\u00e9\u00a0? R\u00e9parons-le\u00a0!\" \/><img decoding=\"async\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-169379-61e80e29cc727.png\" alt=\"Composant React.createClass cass\u00e9\u00a0? R\u00e9parons-le\u00a0!\" \/>Erreur de type non intercept\u00e9e\u00a0: React.createClass n&rsquo;est pas une fonction.\ufeff<\/p>\n<p>Encore une fois, une petite recherche autour de la <a href=\"https:\/\/reactjs.org\/blog\/2017\/04\/07\/react-v15.5.0.html#new-deprecation-warnings\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">documentation React et des notes de version pour la v15.5.0<\/a> nous montre qu&rsquo;elle <code>React.createClass<\/code>a \u00e9t\u00e9 d\u00e9pr\u00e9ci\u00e9e dans la version 15.5.0.<\/p>\n<p>Avec <code>React.PropTypes<\/code>, <code>React.createClass<\/code>a \u00e9t\u00e9 refactoris\u00e9 dans son propre package, car <a href=\"https:\/\/mattwatson.codes\/converting-react-createclass-to-react-component\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">la m\u00e9thode pr\u00e9f\u00e9r\u00e9e de cr\u00e9ation de composants React utilise<\/a> <code>[React.Component](https:\/\/mattwatson.codes\/converting-react-createclass-to-react-component\/)<\/code>.<\/p>\n<p>Le rempla\u00e7ant de React.createClass est maintenant dans son propre <a href=\"https:\/\/www.npmjs.com\/package\/create-react-class\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">r\u00e9f\u00e9rentiel npm en tant que create-react-class<\/a>. Alors allons-y et installons ceci dans notre build.<\/p>\n<pre><code>npm install --save create-react-class\n<\/code><\/pre>\n<p>Nous devons importer le package dans notre build, en conservant \u00e0 nouveau la syntaxe au format classique et en ajoutant la ligne <code>var CreateReactClass = require('create-react-class');<\/code>en haut du document, comme suit\u00a0:<\/p>\n<pre><code>'use strict';\nvar React            = require('react');\nvar PropTypes        = require('prop-types');\nvar CreateReactClass = require('create-react-class');\n\nmodule.exports = React.createClass({\n    displayName: 'CheckBoxList',\n\n    propTypes: {\n        defaultData: PropTypes.array,\n        onChange: PropTypes.func\n    },\n...\n<\/code><\/pre>\n<p>Encore une fois, notre erreur ne dispara\u00eetra pas, car nous devons remplacer toutes les instances de <code>React.createClass<\/code>par notre nouvel objet import\u00e9 <code>CreateReactClass<\/code>. Cela devrait ressembler un peu \u00e0 ceci :<\/p>\n<pre><code>'use strict';\nvar React            = require('react');\nvar PropTypes        = require('prop-types');\nvar CreateReactClass = require('create-react-class');\n\nmodule.exports = CreateReactClass({\n    displayName: 'CheckBoxList',\n\n    propTypes: {\n        defaultData: PropTypes.array,\n        onChange: PropTypes.func\n    },\n...\n<\/code><\/pre>\n<p>Et c&rsquo;est tout! Le composant ne produit plus d&rsquo;erreurs et notre console JavaScript est agr\u00e9able et propre.<\/p>\n<p>La solution finie ressemble un peu \u00e0 ceci :<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-169379-61e80e2b09ef2.gif\" alt=\"Composant React.createClass cass\u00e9\u00a0? R\u00e9parons-le\u00a0!\" \/>Le composant Patched React Multiple Checklist dans WordPress Gutenberg<\/p>\n<h2>Code source du didacticiel<\/h2>\n<p>Vous pouvez <a href=\"https:\/\/github.com\/wholesomecode\/Tutorial-Convert-React-createClass-to-React-Component\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">t\u00e9l\u00e9charger le code source de la version originale et corrig\u00e9e du composant sur GitHub<\/a>. Le plugin contient un bloc WordPress Gutenberg que vous pouvez utiliser pour jouer avec le code, avec trois fichiers que vous pouvez supprimer selon le cas :<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-169379-61e80e2cbb1fa.png\" alt=\"Composant React.createClass cass\u00e9\u00a0? R\u00e9parons-le\u00a0!\" \/>Les fichiers du didacticiel GitHub pour le correctif React.createClass<\/p>\n<h2>Soumettre une demande d&rsquo;extraction au r\u00e9f\u00e9rentiel d&rsquo;origine<\/h2>\n<p>La grande chose \u00e0 propos de la communaut\u00e9 open source est que nous sommes libres de contribuer et d&rsquo;am\u00e9liorer le code. Voici la <a href=\"https:\/\/github.com\/sonyan\/react-checkbox-list\/pull\/7\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Pull Request avec le patch que je viens de cr\u00e9er<\/a> que j&rsquo;ai soumis \u00e0 Sony An.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Source d&rsquo;enregistrement:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/wholesomecode.ltd\" class=\"external external_icon\">wholesomecode.ltd<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Si vous construisez des blocs WordPress Gutenberg (ou m\u00eame si vous ne le faites pas), vous essayez peut-\u00eatre de faire fonctionner un composant React tiers dans votre build. Mais s&rsquo;il s&rsquo;agit d&rsquo;un \u00e9l\u00e9ment plus ancien, &#8230;<\/p>\n","protected":false},"author":1,"featured_media":224207,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[915,893,717,841],"tags":[1167],"class_list":["post-228535","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-autre","category-code-2","category-developpeur","category-tutoriels","tag-affiai-fr"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/228535","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=228535"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/228535\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media\/224207"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media?parent=228535"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/categories?post=228535"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/tags?post=228535"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}