{"id":228653,"date":"2022-10-12T11:13:00","date_gmt":"2022-10-12T08:13:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=228653"},"modified":"2022-11-09T03:35:05","modified_gmt":"2022-11-09T00:35:05","slug":"onko-react-createclass-komponentti-rikki-korjataan-se","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fi\/onko-react-createclass-komponentti-rikki-korjataan-se\/","title":{"rendered":"Onko React.createClass-komponentti rikki? Korjataan se!"},"content":{"rendered":"\n<p>Jos rakennat WordPress Gutenberg -lohkoja (tai vaikka et olekaan), saatat yritt\u00e4\u00e4 <a href=\"https:\/\/wholesomecode.ltd\/blog\/add-select2-as-an-inspectorcontrol-in-wordpress-gutenberg\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">saada kolmannen osapuolen React-komponentin toimimaan rakennuksessasi<\/a>. Mutta jos se on vanhempi elementti, erityisesti sellainen, joka k\u00e4ytt\u00e4\u00e4 vanhentunutta <code>React.createClass<\/code>menetelm\u00e4\u00e4, saatat juuttua.<\/p>\n<p>T\u00e4m\u00e4n opetusohjelman mukana tulevat tiedostot ovat alkuper\u00e4isiss\u00e4 ja korjatuissa kansioissa GitHub-ratkaisun komponenttikansiossa.<\/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\">Hanki opetusohjelmatiedostot GitHubista<\/a><\/p>\n<p>Etsin valintaruutuluetteloa, jonka avulla pystyin v\u00e4litt\u00e4m\u00e4\u00e4n joukon vaihtoehtoja (samalla tavalla kuin voit siirt\u00e4\u00e4 useita vaihtoehtoja <code>&lt;SelectControl\/&gt;<\/code>WordPressin Gutenbergille). Sis\u00e4\u00e4nrakennetulla <code>&lt;CheckboxControl\/&gt;<\/code>ei ollut vaihtoehtoa, mutta netist\u00e4 etsimisen j\u00e4lkeen l\u00f6ysin <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\">Sony Anin<\/a> (saatavilla nimell\u00e4 <a href=\"https:\/\/www.npmjs.com\/package\/react-checkbox-list\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\"><code>react-checkbox-list<\/code>npm<\/a> ).<\/p>\n<p>T\u00e4m\u00e4 teki kaiken, mit\u00e4 halusin sen tekev\u00e4n, mutta npm:n (<code>npm install react-checkbox-list --save<\/code>) kautta asennuksen j\u00e4lkeen se ei toiminut. Tiesin, ett\u00e4 minun pit\u00e4isi haarukata ja korjata laajennus.<\/p>\n<p>Huomaa, ett\u00e4 t\u00e4m\u00e4 opetusohjelma kattaa olemassa olevien <code>React.createClass<\/code>ja <code>React.propTypes<\/code>menetelmien korjaamisen. <a href=\"https:\/\/mattwatson.codes\/converting-react-createclass-to-react-component\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Jos olet kiinnostunut oppimaan korjaamaan ne haluamallasi k\u00e4ytt\u00f6tavalla,<\/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\">katso viesti\u00e4 kyseisest\u00e4 aiheesta<\/a>.<\/p>\n<h2>React-komponentin paikkaus<\/h2>\n<p>Ensimm\u00e4inen kohtaamasi ongelma on, ett\u00e4 komponentti ei edes lataudu, ja sinulle esitet\u00e4\u00e4n melko ilke\u00e4 <code>Uncaught TypeError: Cannot read property 'array' of undefined<\/code>virhe.<\/p>\n<p>Uncaught TypeError, ei voida lukea m\u00e4\u00e4ritt\u00e4m\u00e4tt\u00f6m\u00e4n ominaisuutta &quot;array&quot;.<\/p>\n<p>T\u00e4m\u00e4 johtuu siit\u00e4, ett\u00e4 komponentti sis\u00e4lt\u00e4\u00e4 seuraavan rivin, <code>defaultData: React.PropTypes.array,<\/code>ja se johtuu siit\u00e4 <code>React.PropTypes<\/code>, ett\u00e4 se on m\u00e4\u00e4rittelem\u00e4t\u00f6n.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-169379-61e80e28d135c.png\" alt=\"Onko React.createClass-komponentti rikki? Korjataan se!\" \/>React.PropTypes on m\u00e4\u00e4rittelem\u00e4t\u00f6n<\/p>\n<p>Hieman <a href=\"https:\/\/reactjs.org\/docs\/typechecking-with-proptypes.html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">React-dokumentaation tutkiminen osoittaa, ett\u00e4<\/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\">Reactin versio 15.5 siirtyi toiseen pakettiin<\/a>. Se neuvoo meit\u00e4 k\u00e4ytt\u00e4m\u00e4\u00e4n sen sijaan prop-types -kirjastoa.<\/p>\n<p>Se jopa antaa sinulle linkin <a href=\"https:\/\/www.npmjs.com\/package\/prop-types\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">prop-type-kirjaston npm-varastoon<\/a>. Joten menn\u00e4\u00e4n eteenp\u00e4in ja asennetaan prop-types -kirjasto.<\/p>\n<pre><code>npm install --save prop-types\n<\/code><\/pre>\n<p>Tuodaan asiakirjamme yl\u00e4osassa oleva <code>prop-types<\/code>kirjasto. <a href=\"https:\/\/mattwatson.codes\/converting-react-createclass-to-react-component\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Nykyaikainen tapa saada meid\u00e4t k\u00e4ytt\u00e4m\u00e4\u00e4n<\/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\">syntaksia<\/a>, mutta toistaiseksi pysyt\u00e4\u00e4n samassa syntaksissa, joka lis\u00e4t\u00e4\u00e4n <code>var PropTypes = require('prop-types');<\/code>alla olevaan dokumenttiin, jossa ilmoitamme <code>React<\/code>. Aloitusilmoituksen pit\u00e4isi nyt n\u00e4ytt\u00e4\u00e4 v\u00e4h\u00e4n t\u00e4lt\u00e4:<\/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>Hieno juttu! Saamme kuitenkin edelleen <code>'array' of undefined<\/code>virheilmoituksen. No se johtuu siit\u00e4, ett\u00e4 k\u00e4ytetty syntaksi on <code>React.PropTypes.array<\/code>ja julistimme juuri PropTypesimme k\u00e4ytt\u00e4m\u00e4\u00e4n muuttujaa <code>PropTypes<\/code>. Joten yksinkertainen korjaus on etsi\u00e4 ja korvata kaikki <code>React.PropTypes<\/code>esiintym\u00e4t <code>PropTypes<\/code>.<\/p>\n<p>Alkukoodilohkomme pit\u00e4isi nyt n\u00e4ytt\u00e4\u00e4 t\u00e4lt\u00e4:<\/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>PropTypes-ongelmamme on nyt ratkaistu! P\u00e4ivitet\u00e4\u00e4n komponenttimme ja katsotaan, toimiiko se.<\/p>\n<p>Ei, nyt saamme virheen<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=\"Onko React.createClass-komponentti rikki? Korjataan se!\" \/><img decoding=\"async\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-169379-61e80e29cc727.png\" alt=\"Onko React.createClass-komponentti rikki? Korjataan se!\" \/>Uncaught TypeError: React.createClass ei ole funktio.\ufeff<\/p>\n<p>J\u00e4lleen pieni haku <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\">Reactin dokumentaatiosta ja version 15.5.0 julkaisutiedoista<\/a> osoittaa meille, ett\u00e4 <code>React.createClass<\/code>versiossa 15.5.0 alennettiin.<\/p>\n<p>Yhdess\u00e4 <code>React.PropTypes<\/code>, <code>React.createClass<\/code>muunnettiin omaksi paketiksi, koska <a href=\"https:\/\/mattwatson.codes\/converting-react-createclass-to-react-component\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">suosituin menetelm\u00e4 React Components -komponenttien luomiseen k\u00e4ytt\u00e4\u00e4<\/a> <code>[React.Component](https:\/\/mattwatson.codes\/converting-react-createclass-to-react-component\/)<\/code>.<\/p>\n<p>Korvaava React.createClass on nyt omassa <a href=\"https:\/\/www.npmjs.com\/package\/create-react-class\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">npm-varastossaan luo-react-luokkana<\/a>. Joten menn\u00e4\u00e4n eteenp\u00e4in ja asennataan t\u00e4m\u00e4 rakennukseemme.<\/p>\n<pre><code>npm install --save create-react-class\n<\/code><\/pre>\n<p>Meid\u00e4n on tuotava paketti koontiversioomme pit\u00e4en taas syntaksi klassisessa muodossa lis\u00e4\u00e4m\u00e4ll\u00e4 rivi <code>var CreateReactClass = require('create-react-class');<\/code>asiakirjan yl\u00e4osaan, kuten:<\/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>J\u00e4lleen kerran, virheemme ei poistu, koska meid\u00e4n on korvattava kaikki esiintym\u00e4t <code>React.createClass<\/code>uudella tuodulla objektillamme <code>CreateReactClass<\/code>. Sen pit\u00e4isi n\u00e4ytt\u00e4\u00e4 v\u00e4h\u00e4n t\u00e4lt\u00e4:<\/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>Ja siin\u00e4 se! Komponentti ei en\u00e4\u00e4 virheit\u00e4, ja JavaScript-konsolimme on mukava ja puhdas.<\/p>\n<p>Valmis ratkaisu n\u00e4ytt\u00e4\u00e4 v\u00e4h\u00e4n t\u00e4lt\u00e4:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-169379-61e80e2b09ef2.gif\" alt=\"Onko React.createClass-komponentti rikki? Korjataan se!\" \/>Patched React -monitarkistuslistakomponentti WordPress Gutenbergiss\u00e4<\/p>\n<h2>Opetusohjelman l\u00e4hdekoodi<\/h2>\n<p>Voit <a href=\"https:\/\/github.com\/wholesomecode\/Tutorial-Convert-React-createClass-to-React-Component\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ladata komponentin alkuper\u00e4isen ja korjatun version l\u00e4hdekoodin GitHubista<\/a>. Laajennus sis\u00e4lt\u00e4\u00e4 WordPress Gutenberg -lohkon, jonka avulla voit leikki\u00e4 koodilla kolmella tiedostolla, jotka voit poistaa tarpeen mukaan:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-169379-61e80e2cbb1fa.png\" alt=\"Onko React.createClass-komponentti rikki? Korjataan se!\" \/>React.createClass-korjauksen GitHub-opetustiedostot<\/p>\n<h2>Noutopyynn\u00f6n l\u00e4hett\u00e4minen alkuper\u00e4iseen arkistoon<\/h2>\n<p>Hienoa avoimen l\u00e4hdekoodin yhteis\u00f6ss\u00e4 on, ett\u00e4 voimme vapaasti osallistua ja parantaa koodia. T\u00e4ss\u00e4 on <a href=\"https:\/\/github.com\/sonyan\/react-checkbox-list\/pull\/7\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">vetopyynt\u00f6 ja juuri luomani korjaustiedosto,<\/a> jonka olen l\u00e4hett\u00e4nyt Sony Anille.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/wholesomecode.ltd\" class=\"external external_icon\">wholesomecode.ltd<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Jos rakennat WordPress Gutenberg Blocks -lohkoja (tai vaikka et olekaan), saatat yritt\u00e4\u00e4 saada kolmannen osapuolen React-komponentin toimimaan rakennuksessasi. Mutta jos se on vanhempi elementti, &#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":[719,895,917,843],"tags":[1166],"class_list":["post-228653","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-kehittaejae","category-koodi","category-muut","category-opetusohjelmia","tag-affiai-fi"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/228653","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/comments?post=228653"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/228653\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media\/224207"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media?parent=228653"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/categories?post=228653"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/tags?post=228653"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}