{"id":228031,"date":"2022-10-12T11:38:00","date_gmt":"2022-10-12T08:38:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=228031"},"modified":"2022-11-09T00:20:29","modified_gmt":"2022-11-08T21:20:29","slug":"trasig-react-createclass-komponent-laat-oss-fixa-det","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/sv\/trasig-react-createclass-komponent-laat-oss-fixa-det\/","title":{"rendered":"Trasig React.createClass-komponent? L\u00e5t oss fixa det!"},"content":{"rendered":"\n<p>Om du bygger WordPress Gutenberg-block (eller \u00e4ven om du inte g\u00f6r det) kanske du f\u00f6rs\u00f6ker <a href=\"https:\/\/wholesomecode.ltd\/blog\/add-select2-as-an-inspectorcontrol-in-wordpress-gutenberg\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">f\u00e5 en tredje parts React Component att fungera i din build<\/a>. Men om det \u00e4r ett \u00e4ldre element, specifikt ett som anv\u00e4nder den f\u00f6r\u00e5ldrade <code>React.createClass<\/code>metoden, kan du fastna.<\/p>\n<p>Filerna som f\u00f6ljer med den h\u00e4r handledningen finns i originalmapparna och de korrigerade mapparna i komponentmappen i GitHub-l\u00f6sningen.<\/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\">F\u00e5 handledningsfiler fr\u00e5n GitHub<\/a><\/p>\n<p>Jag letade efter en kryssrutelista som till\u00e4t mig att skicka en rad alternativ (liknande hur du kan skicka flera alternativ till <code>&lt;SelectControl\/&gt;<\/code>i WordPress Gutenberg). Den inbyggda <code>&lt;CheckboxControl\/&gt;<\/code>hade inget alternativ, men efter lite s\u00f6kning p\u00e5 webben hittade jag <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\">av Sony An<\/a> (tillg\u00e4nglig som <a href=\"https:\/\/www.npmjs.com\/package\/react-checkbox-list\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\"><code>react-checkbox-list<\/code>p\u00e5 npm<\/a> ).<\/p>\n<p>Detta gjorde allt jag ville att det skulle g\u00f6ra, men efter att ha installerat det via npm (<code>npm install react-checkbox-list --save<\/code>) fungerade det inte. Jag visste att jag skulle beh\u00f6va punga och lappa insticksprogrammet.<\/p>\n<p>Observera att den h\u00e4r handledningen t\u00e4cker korrigering av befintliga <code>React.createClass<\/code>och <code>React.propTypes<\/code>metoder. <a href=\"https:\/\/mattwatson.codes\/converting-react-createclass-to-react-component\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Om du \u00e4r intresserad av att l\u00e4ra dig hur du lappar dem med den f\u00f6redragna metoden att anv\u00e4nda<\/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 external_icon\">, se inl\u00e4gget om det \u00e4mnet<\/a>.<\/p>\n<h2>Patcha React-komponenten<\/h2>\n<p>Det f\u00f6rsta problemet du kommer att st\u00f6ta p\u00e5 \u00e4r att komponenten inte ens kommer att laddas, och du kommer att presenteras med ett ganska ot\u00e4ckt <code>Uncaught TypeError: Cannot read property 'array' of undefined<\/code>fel.<\/p>\n<p>Uncaught TypeError, kan inte l\u00e4sa egenskapen &#8217;array&#8217; f\u00f6r undefined<\/p>\n<p>Detta beror p\u00e5 att komponenten inneh\u00e5ller f\u00f6ljande rad <code>defaultData: React.PropTypes.array,<\/code>och det \u00e4r f\u00f6r <code>React.PropTypes<\/code>att den \u00e4r odefinierad.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-169379-61e80e28d135c.png\" alt=\"Trasig React.createClass-komponent? L\u00e5t oss fixa det!\" \/>React.PropTypes \u00e4r odefinierat<\/p>\n<p>Lite granskning av <a href=\"https:\/\/reactjs.org\/docs\/typechecking-with-proptypes.html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">React-dokumentationen visar att den<\/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\">flyttade till ett annat paket i React version 15.5<\/a>. Det r\u00e5der oss att anv\u00e4nda biblioteket med prop-typer ist\u00e4llet.<\/p>\n<p>Det ger dig till och med en l\u00e4nk till <a href=\"https:\/\/www.npmjs.com\/package\/prop-types\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">npm-f\u00f6rvaret f\u00f6r biblioteket f\u00f6r prop-typer<\/a>. S\u00e5 l\u00e5t oss g\u00e5 vidare och installera prop-types-biblioteket.<\/p>\n<pre><code>npm install --save prop-types\n<\/code><\/pre>\n<p>\u00d6verst i v\u00e5rt dokument, l\u00e5t oss importera <code>prop-types<\/code>biblioteket. <a href=\"https:\/\/mattwatson.codes\/converting-react-createclass-to-react-component\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Det moderna s\u00e4ttet f\u00f6r detta skulle f\u00e5 oss att anv\u00e4nda<\/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\">syntaxen<\/a>, men l\u00e5t oss f\u00f6r n\u00e4rvarande forts\u00e4tta att l\u00e4gga <code>var PropTypes = require('prop-types');<\/code>till samma syntax i dokumentet nedan d\u00e4r vi deklarerar <code>React<\/code>. Inledningsdeklarationen b\u00f6r nu se ut ungef\u00e4r s\u00e5 h\u00e4r:<\/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>Bra saker! Men vi f\u00e5r fortfarande <code>'array' of undefined<\/code>felmeddelandet. Jo det beror p\u00e5 att syntaxen som anv\u00e4nds \u00e4r <code>React.PropTypes.array<\/code>och vi har precis deklarerat att v\u00e5ra PropTypes anv\u00e4nder variabeln <code>PropTypes<\/code>. S\u00e5 den enkla fixen \u00e4r att hitta och ers\u00e4tta alla instanser av <code>React.PropTypes<\/code>med <code>PropTypes<\/code>.<\/p>\n<p>V\u00e5rt \u00f6ppningsblock med kod b\u00f6r nu se ut s\u00e5 h\u00e4r:<\/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>D\u00e4r g\u00e5r vi, v\u00e5rt PropTypes-problem \u00e4r nu l\u00f6st! L\u00e5t oss uppdatera v\u00e5r komponent och se om den fungerar.<\/p>\n<p>Nej, nu f\u00e5r vi felet<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=\"Trasig React.createClass-komponent? L\u00e5t oss fixa det!\" \/><img decoding=\"async\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-169379-61e80e29cc727.png\" alt=\"Trasig React.createClass-komponent? L\u00e5t oss fixa det!\" \/>Uncaught TypeError: React.createClass \u00e4r inte en funktion.\ufeff<\/p>\n<p>\u00c5terigen, en liten s\u00f6kning runt <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\">React-dokumentationen och release notes f\u00f6r v15.5.0<\/a> visar oss att <code>React.createClass<\/code>det avskrivs i version 15.5.0.<\/p>\n<p>Tillsammans med <code>React.PropTypes<\/code>, <code>React.createClass<\/code>omstrukturerades till ett eget paket, eftersom <a href=\"https:\/\/mattwatson.codes\/converting-react-createclass-to-react-component\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">den f\u00f6redragna metoden f\u00f6r att skapa React Components anv\u00e4nder<\/a> <code>[React.Component](https:\/\/mattwatson.codes\/converting-react-createclass-to-react-component\/)<\/code>.<\/p>\n<p>Ers\u00e4ttningen f\u00f6r React.createClass finns nu i sitt eget <a href=\"https:\/\/www.npmjs.com\/package\/create-react-class\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">npm-f\u00f6rr\u00e5d som create-react-class<\/a>. S\u00e5 l\u00e5t oss g\u00e5 vidare och installera detta i v\u00e5r build.<\/p>\n<pre><code>npm install --save create-react-class\n<\/code><\/pre>\n<p>Vi m\u00e5ste importera paketet till v\u00e5r build, \u00e5terigen beh\u00e5lla syntaxen i det klassiska formatet och l\u00e4gg till raden <code>var CreateReactClass = require('create-react-class');<\/code>h\u00f6gst upp i dokumentet, s\u00e5 h\u00e4r:<\/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>\u00c5terigen, v\u00e5rt fel kommer inte att f\u00f6rsvinna, eftersom vi m\u00e5ste ers\u00e4tta alla instanser av <code>React.createClass<\/code>med v\u00e5rt nya importerade objekt <code>CreateReactClass<\/code>. Det borde se ut lite s\u00e5 h\u00e4r:<\/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>Och det \u00e4r allt! Komponenten har inte l\u00e4ngre fel, och v\u00e5r JavaScript-konsol \u00e4r snygg och ren.<\/p>\n<p>Den f\u00e4rdiga l\u00f6sningen ser ut ungef\u00e4r s\u00e5 h\u00e4r:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-169379-61e80e2b09ef2.gif\" alt=\"Trasig React.createClass-komponent? L\u00e5t oss fixa det!\" \/>Komponenten f\u00f6r patchad React Multiple Checklist i WordPress Gutenberg<\/p>\n<h2>Handlednings k\u00e4llkod<\/h2>\n<p>Du kan <a href=\"https:\/\/github.com\/wholesomecode\/Tutorial-Convert-React-createClass-to-React-Component\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ladda ner k\u00e4llkoden f\u00f6r den ursprungliga och korrigerade versionen av komponenten p\u00e5 GitHub<\/a>. Pluginet inneh\u00e5ller ett WordPress Gutenberg-block som du kan anv\u00e4nda f\u00f6r att leka med koden, med tre filer som du kan ta bort i f\u00f6rekommande fall:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-169379-61e80e2cbb1fa.png\" alt=\"Trasig React.createClass-komponent? L\u00e5t oss fixa det!\" \/>GitHub Tutorial-filer f\u00f6r React.createClass-patchen<\/p>\n<h2>Skicka en Pull-f\u00f6rfr\u00e5gan till originalf\u00f6rr\u00e5det<\/h2>\n<p>Det fina med \u00f6ppen k\u00e4llkodsgemenskapen \u00e4r att vi \u00e4r fria att bidra och f\u00f6rb\u00e4ttra kod. H\u00e4r \u00e4r <a href=\"https:\/\/github.com\/sonyan\/react-checkbox-list\/pull\/7\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Pull Request med patchen som jag just har skapat<\/a> som jag har skickat till Sony An.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Inspelningsk\u00e4lla:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/wholesomecode.ltd\" class=\"external external_icon\">wholesomecode.ltd<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Om du bygger WordPress Gutenberg-block (eller \u00e4ven om du inte g\u00f6r det) kanske du f\u00f6rs\u00f6ker f\u00e5 en tredjeparts React Component att fungera i din konstruktion. Men om det \u00e4r ett \u00e4ldre element&#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":[848,901,922,724],"tags":[1173],"class_list":["post-228031","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-handledningar","category-koda","category-oevrig","category-utvecklaren","tag-affiai-sv"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/228031","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/comments?post=228031"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/228031\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media\/224207"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media?parent=228031"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/categories?post=228031"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/tags?post=228031"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}