{"id":228891,"date":"2022-10-12T11:10:00","date_gmt":"2022-10-12T08:10:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=228891"},"modified":"2022-11-09T04:40:48","modified_gmt":"2022-11-09T01:40:48","slug":"componente-react-createclass-rotto-risolviamolo","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/it\/componente-react-createclass-rotto-risolviamolo\/","title":{"rendered":"Componente React.createClass rotto? Risolviamolo!"},"content":{"rendered":"\n<p>Se stai costruendo blocchi Gutenberg di WordPress (o anche se non lo sei) potresti provare a <a href=\"https:\/\/wholesomecode.ltd\/blog\/add-select2-as-an-inspectorcontrol-in-wordpress-gutenberg\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">far funzionare un componente React di terze parti nella tua build<\/a>. Ma se si tratta di un elemento pi\u00f9 vecchio, in particolare uno che utilizza il <code>React.createClass<\/code>metodo deprecato, potresti rimanere bloccato.<\/p>\n<p>I file che accompagnano questo tutorial si trovano nelle cartelle originali e corrette nella cartella dei componenti della soluzione 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\">Ottieni file tutorial da GitHub<\/a><\/p>\n<p>Stavo cercando un elenco di caselle di controllo che mi permettesse di passare una serie di opzioni (simile a come potresti passare pi\u00f9 opzioni a <code>&lt;SelectControl\/&gt;<\/code>Gutenberg in WordPress). Il built-in <code>&lt;CheckboxControl\/&gt;<\/code>non aveva un&#8217;opzione, ma dopo alcune ricerche sul web ho trovato <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\">da Sony An<\/a> (disponibile come <a href=\"https:\/\/www.npmjs.com\/package\/react-checkbox-list\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\"><code>react-checkbox-list<\/code>su npm<\/a> ).<\/p>\n<p>Questo ha fatto tutto ci\u00f2 che volevo che facesse, ma dopo averlo installato tramite npm (<code>npm install react-checkbox-list --save<\/code>) non ha funzionato. Sapevo che avrei dovuto eseguire il fork e patchare il plugin.<\/p>\n<p>Nota che questo tutorial copre l&#8217;applicazione di patch ai metodi esistenti <code>React.createClass<\/code>e. <a href=\"https:\/\/mattwatson.codes\/converting-react-createclass-to-react-component\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Se sei interessato a imparare come correggerli con il metodo di utilizzo preferito<\/a> <a href=\"https:\/\/mattwatson.codes\/converting-react-createclass-to-react-component\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">, guarda il post su quell&#8217;argomento<\/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>Patch del componente React<\/h2>\n<p>Il primo problema che incontrerai \u00e8 che il componente non verr\u00e0 nemmeno caricato e ti verr\u00e0 presentato un <code>Uncaught TypeError: Cannot read property 'array' of undefined<\/code>errore piuttosto brutto.<\/p>\n<p>TypeError non rilevato, impossibile leggere la propriet\u00e0 &#8216;array&#8217; di undefined<\/p>\n<p>Ci\u00f2 \u00e8 dovuto al fatto che il componente contiene la riga seguente <code>defaultData: React.PropTypes.array,<\/code>ed \u00e8 perch\u00e9 <code>React.PropTypes<\/code>non \u00e8 definito.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-169379-61e80e28d135c.png\" alt=\"Componente React.createClass rotto? Risolviamolo!\" \/>React.PropTypes non \u00e8 definito<\/p>\n<p>Un po&#8217; di indagine sulla <a href=\"https:\/\/reactjs.org\/docs\/typechecking-with-proptypes.html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">documentazione di React mostra che<\/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\">\u00e8 stato spostato in un pacchetto diverso in React versione 15.5<\/a>. Ci consiglia invece di usare la libreria prop-types.<\/p>\n<p>Ti d\u00e0 anche un collegamento al <a href=\"https:\/\/www.npmjs.com\/package\/prop-types\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">repository npm per la libreria prop-types<\/a>. Quindi andiamo avanti e installiamo la libreria prop-types.<\/p>\n<pre><code>npm install --save prop-types\n<\/code><\/pre>\n<p>Nella parte superiore del nostro documento, importiamo la <code>prop-types<\/code>libreria. <a href=\"https:\/\/mattwatson.codes\/converting-react-createclass-to-react-component\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Il modo moderno di questo ci vorrebbe usare 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\">sintassi<\/a>, ma per ora, manteniamo la stessa sintassi aggiunta <code>var PropTypes = require('prop-types');<\/code>al documento seguente in cui dichiariamo <code>React<\/code>. La dichiarazione di apertura ora dovrebbe assomigliare a qualcosa del genere:<\/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>Roba fantastica! Tuttavia riceviamo ancora il <code>'array' of undefined<\/code>messaggio di errore. Bene, questo perch\u00e9 la sintassi utilizzata \u00e8 <code>React.PropTypes.array<\/code>e abbiamo appena dichiarato che i nostri PropTypes utilizzano la variabile <code>PropTypes<\/code>. Quindi la soluzione semplice \u00e8 trovare e sostituire tutte le istanze di <code>React.PropTypes<\/code>con <code>PropTypes<\/code>.<\/p>\n<p>Il nostro blocco di codice di apertura dovrebbe ora assomigliare a questo:<\/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>Ecco fatto, il nostro problema con PropTypes \u00e8 stato risolto! Aggiorna il nostro componente e vediamo se funziona.<\/p>\n<p>No, ora otteniamo l&#8217;errore<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=\"Componente React.createClass rotto? Risolviamolo!\" \/><img decoding=\"async\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-169379-61e80e29cc727.png\" alt=\"Componente React.createClass rotto? Risolviamolo!\" \/>Errore di tipo non rilevato: React.createClass non \u00e8 una funzione.\ufeff<\/p>\n<p>Ancora una volta, una piccola ricerca nella <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\">documentazione di React e nelle note di rilascio per v15.5.0<\/a> ci mostra che <code>React.createClass<\/code>\u00e8 stato deprezzato nella versione 15.5.0.<\/p>\n<p>Insieme a <code>React.PropTypes<\/code>, <code>React.createClass<\/code>\u00e8 stato rifattorizzato nel proprio pacchetto, poich\u00e9 <a href=\"https:\/\/mattwatson.codes\/converting-react-createclass-to-react-component\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">il metodo preferito per la creazione di componenti React utilizza<\/a> <code>[React.Component](https:\/\/mattwatson.codes\/converting-react-createclass-to-react-component\/)<\/code>.<\/p>\n<p>La sostituzione di React.createClass \u00e8 ora nel proprio <a href=\"https:\/\/www.npmjs.com\/package\/create-react-class\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">repository npm come create-react-class<\/a>. Quindi andiamo avanti e installiamo questo nella nostra build.<\/p>\n<pre><code>npm install --save create-react-class\n<\/code><\/pre>\n<p>Dobbiamo importare il pacchetto nella nostra build, sempre mantenendo la sintassi nel formato classico aggiungere la riga <code>var CreateReactClass = require('create-react-class');<\/code>all&#8217;inizio del documento, in questo modo:<\/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>Ancora una volta, il nostro errore non andr\u00e0 via, perch\u00e9 dobbiamo sostituire tutte le istanze di <code>React.createClass<\/code>con il nostro nuovo oggetto importato <code>CreateReactClass<\/code>. Dovrebbe assomigliare un po&#8217; a questo:<\/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>E questo \u00e8 tutto! Il componente non ha pi\u00f9 errori e la nostra console JavaScript \u00e8 bella e pulita.<\/p>\n<p>La soluzione finita assomiglia un po&#8217; a questa:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-169379-61e80e2b09ef2.gif\" alt=\"Componente React.createClass rotto? Risolviamolo!\" \/>Il componente Patched React Multiple Checklist in WordPress Gutenberg<\/p>\n<h2>Codice sorgente dell&#8217;esercitazione<\/h2>\n<p>Puoi <a href=\"https:\/\/github.com\/wholesomecode\/Tutorial-Convert-React-createClass-to-React-Component\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">scaricare il codice sorgente per la versione originale e con patch del componente su GitHub<\/a>. Il plug-in contiene un blocco Gutenberg di WordPress che puoi utilizzare per giocare con il codice, con tre file che puoi eliminare a seconda dei casi:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-169379-61e80e2cbb1fa.png\" alt=\"Componente React.createClass rotto? Risolviamolo!\" \/>I file del tutorial di GitHub per la patch React.createClass<\/p>\n<h2>Invio di una richiesta pull al repository originale<\/h2>\n<p>Il bello della comunit\u00e0 open source \u00e8 che siamo liberi di contribuire e migliorare il codice. Ecco la <a href=\"https:\/\/github.com\/sonyan\/react-checkbox-list\/pull\/7\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Pull Request con la patch che ho appena creato<\/a> e che ho inviato a Sony An.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte di registrazione:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/wholesomecode.ltd\" class=\"external external_icon\">wholesomecode.ltd<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Se stai costruendo blocchi Gutenberg di WordPress (o anche se non lo sei) potresti provare a far funzionare un componente React di terze parti nella tua build. Ma se \u00e8 un elemento pi\u00f9 vecchio, &#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":[918,896,720,844],"tags":[1168],"class_list":["post-228891","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-altro","category-codice","category-sviluppatore","category-tutorial","tag-affiai-it"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/228891","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/comments?post=228891"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/228891\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media\/224207"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media?parent=228891"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/categories?post=228891"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/tags?post=228891"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}