{"id":228088,"date":"2022-10-12T11:25:00","date_gmt":"2022-10-12T08:25:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=228088"},"modified":"2022-11-09T00:39:13","modified_gmt":"2022-11-08T21:39:13","slug":"uszkodzony-komponent-react-createclass-naprawmy-to","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pl\/uszkodzony-komponent-react-createclass-naprawmy-to\/","title":{"rendered":"Uszkodzony komponent React.createClass? Naprawmy to!"},"content":{"rendered":"\n<p>Je\u015bli budujesz bloki WordPress Gutenberg (lub nawet je\u015bli nie jeste\u015b), by\u0107 mo\u017ce pr\u00f3bujesz <a href=\"https:\/\/wholesomecode.ltd\/blog\/add-select2-as-an-inspectorcontrol-in-wordpress-gutenberg\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">uruchomi\u0107 komponent React innej firmy w swojej kompilacji<\/a>. Ale je\u015bli jest to starszy element, a konkretnie taki, kt\u00f3ry u\u017cywa przestarza\u0142ej <code>React.createClass<\/code>metody, mo\u017cesz utkn\u0105\u0107.<\/p>\n<p>Pliki towarzysz\u0105ce temu samouczkowi znajduj\u0105 si\u0119 w oryginalnych i poprawionych folderach w folderze components rozwi\u0105zania 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\">Pobierz pliki samouczka z GitHub<\/a><\/p>\n<p>Szuka\u0142em listy wyboru, kt\u00f3ra pozwoli\u0142a mi przekaza\u0107 szereg opcji (podobnie jak mo\u017cna przekaza\u0107 wiele opcji do <code>&lt;SelectControl\/&gt;<\/code>WordPress Gutenberg). Wbudowany <code>&lt;CheckboxControl\/&gt;<\/code>nie mia\u0142 opcji, ale po pewnym przeszukiwaniu sieci znalaz\u0142em <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 An<\/a> (dost\u0119pny jak <a href=\"https:\/\/www.npmjs.com\/package\/react-checkbox-list\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\"><code>react-checkbox-list<\/code>na npm<\/a> ).<\/p>\n<p>To zrobi\u0142o wszystko, co chcia\u0142em, ale po zainstalowaniu go przez npm (<code>npm install react-checkbox-list --save<\/code>) nie dzia\u0142a\u0142o. Wiedzia\u0142em, \u017ce b\u0119d\u0119 musia\u0142 rozwidle\u0107 i za\u0142ata\u0107 wtyczk\u0119.<\/p>\n<p>Zauwa\u017c, \u017ce ten samouczek obejmuje \u0142atanie istniej\u0105cych <code>React.createClass<\/code>i <code>React.propTypes<\/code>metod. <a href=\"https:\/\/mattwatson.codes\/converting-react-createclass-to-react-component\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Je\u015bli chcesz dowiedzie\u0107 si\u0119, jak je za\u0142ata\u0107 za pomoc\u0105 preferowanej metody u\u017cycia<\/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\">, zapoznaj si\u0119 z postem na ten temat<\/a>.<\/p>\n<h2>\u0141atanie komponentu React<\/h2>\n<p>Pierwszym problemem, na kt\u00f3ry natkniesz si\u0119, jest to, \u017ce komponent si\u0119 nawet nie za\u0142aduje, i pojawi si\u0119 raczej paskudny <code>Uncaught TypeError: Cannot read property 'array' of undefined<\/code>b\u0142\u0105d.<\/p>\n<p>Nieprzechwycony b\u0142\u0105d typu, nie mo\u017cna odczyta\u0107 w\u0142a\u015bciwo\u015bci \u201etablicy&quot; niezdefiniowanej<\/p>\n<p>Dzieje si\u0119 tak, poniewa\u017c Komponent zawiera nast\u0119puj\u0105cy wiersz <code>defaultData: React.PropTypes.array,<\/code>i to dlatego <code>React.PropTypes<\/code>, \u017ce jest niezdefiniowany.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-169379-61e80e28d135c.png\" alt=\"Uszkodzony komponent React.createClass? Naprawmy to!\" \/>React.PropTypes jest niezdefiniowany<\/p>\n<p>Troch\u0119 zbadania <a href=\"https:\/\/reactjs.org\/docs\/typechecking-with-proptypes.html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">dokumentacji Reacta pokazuje, \u017ce<\/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\">przeniesiono j\u0105 do innego pakietu w wersji 15.5 Reacta<\/a>. Radzi nam zamiast tego u\u017cy\u0107 biblioteki prop-types.<\/p>\n<p>Daje nawet link do <a href=\"https:\/\/www.npmjs.com\/package\/prop-types\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">repozytorium npm dla biblioteki prop-types<\/a>. Wi\u0119c \u015bmia\u0142o zainstalujmy bibliotek\u0119 prop-types.<\/p>\n<pre><code>npm install --save prop-types\n<\/code><\/pre>\n<p>U g\u00f3ry naszego dokumentu zaimportujmy <code>prop-types<\/code>bibliotek\u0119. <a href=\"https:\/\/mattwatson.codes\/converting-react-createclass-to-react-component\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Nowoczesny spos\u00f3b wymaga\u0142by u\u017cycia<\/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\">sk\u0142adni<\/a>, ale na razie trzymajmy si\u0119 tej samej sk\u0142adni dodaj <code>var PropTypes = require('prop-types');<\/code>do poni\u017cszego dokumentu, w kt\u00f3rym deklarujemy <code>React<\/code>. Deklaracja otwarcia powinna teraz wygl\u0105da\u0107 mniej wi\u0119cej tak:<\/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>\u015awietne rzeczy! Jednak nadal otrzymujemy komunikat o <code>'array' of undefined<\/code>b\u0142\u0119dzie. To dlatego, \u017ce u\u017cywana sk\u0142adnia jest taka <code>React.PropTypes.array<\/code>, a my w\u0142a\u015bnie zadeklarowali\u015bmy nasze PropTypes do u\u017cywania zmiennej <code>PropTypes<\/code>. Tak wi\u0119c prost\u0105 poprawk\u0105 jest znalezienie i zast\u0105pienie wszystkich wyst\u0105pie\u0144 <code>React.PropTypes<\/code>z <code>PropTypes<\/code>.<\/p>\n<p>Nasz otwieraj\u0105cy blok kodu powinien teraz wygl\u0105da\u0107 tak:<\/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>No to zaczynamy, nasz problem z PropTypes zosta\u0142 rozwi\u0105zany! Od\u015bwie\u017cmy nasz komponent i zobaczmy, czy dzia\u0142a.<\/p>\n<p>Nie, teraz pojawia si\u0119 b\u0142\u0105d<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=\"Uszkodzony komponent React.createClass? Naprawmy to!\" \/><img decoding=\"async\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-169379-61e80e29cc727.png\" alt=\"Uszkodzony komponent React.createClass? Naprawmy to!\" \/>Uncaught TypeError: React.createClass nie jest funkcj\u0105.\ufeff<\/p>\n<p>Ponownie, kr\u00f3tkie przeszukanie <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\">dokumentacji Reacta i informacji o wydaniu wersji 15.5.0<\/a> pokazuje, \u017ce <code>React.createClass<\/code>zosta\u0142a ona przestarza\u0142a w wersji 15.5.0.<\/p>\n<p>Wraz z <code>React.PropTypes<\/code>, <code>React.createClass<\/code>zosta\u0142 zrefaktoryzowany do w\u0142asnego pakietu, jako <a href=\"https:\/\/mattwatson.codes\/converting-react-createclass-to-react-component\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">preferowana metoda tworzenia React Components wykorzystuje<\/a> <code>[React.Component](https:\/\/mattwatson.codes\/converting-react-createclass-to-react-component\/)<\/code>.<\/p>\n<p>Zamiennik dla React.createClass znajduje si\u0119 teraz we w\u0142asnym <a href=\"https:\/\/www.npmjs.com\/package\/create-react-class\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">repozytorium npm jako create-react-class<\/a>. Wi\u0119c \u015bmia\u0142o zainstalujmy to w naszej kompilacji.<\/p>\n<pre><code>npm install --save create-react-class\n<\/code><\/pre>\n<p>Musimy zaimportowa\u0107 pakiet do naszej kompilacji, ponownie zachowuj\u0105c sk\u0142adni\u0119 w klasycznym formacie, dodaj\u0105c lini\u0119 <code>var CreateReactClass = require('create-react-class');<\/code>na g\u00f3rze dokumentu, na przyk\u0142ad:<\/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>Ponownie, nasz b\u0142\u0105d nie zniknie, poniewa\u017c musimy zast\u0105pi\u0107 wszystkie instancje <code>React.createClass<\/code>naszym nowym zaimportowanym obiektem <code>CreateReactClass<\/code>. To powinno wygl\u0105da\u0107 troch\u0119 tak:<\/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>I to wszystko! Komponent nie ma ju\u017c b\u0142\u0119d\u00f3w, a nasza konsola JavaScript jest \u0142adna i czysta.<\/p>\n<p>Gotowe rozwi\u0105zanie wygl\u0105da troch\u0119 tak:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-169379-61e80e2b09ef2.gif\" alt=\"Uszkodzony komponent React.createClass? Naprawmy to!\" \/>Poprawiony sk\u0142adnik listy kontrolnej wielokrotnego reagowania w WordPress Gutenberg<\/p>\n<h2>Kod \u017ar\u00f3d\u0142owy samouczka<\/h2>\n<p>Mo\u017cesz <a href=\"https:\/\/github.com\/wholesomecode\/Tutorial-Convert-React-createClass-to-React-Component\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">pobra\u0107 kod \u017ar\u00f3d\u0142owy oryginalnej i poprawionej wersji komponentu z serwisu GitHub<\/a>. Wtyczka zawiera blok WordPress Gutenberg, kt\u00f3rego mo\u017cesz u\u017cy\u0107 do zabawy z kodem, z trzema plikami, kt\u00f3re mo\u017cesz usun\u0105\u0107, je\u015bli dotyczy:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-169379-61e80e2cbb1fa.png\" alt=\"Uszkodzony komponent React.createClass? Naprawmy to!\" \/>Pliki samouczka GitHub dla poprawki React.createClass<\/p>\n<h2>Przesy\u0142anie pull request do oryginalnego repozytorium<\/h2>\n<p>Wspania\u0142\u0105 rzecz\u0105 w spo\u0142eczno\u015bci open source jest to, \u017ce mo\u017cemy wnosi\u0107 sw\u00f3j wk\u0142ad i ulepsza\u0107 kod. Oto <a href=\"https:\/\/github.com\/sonyan\/react-checkbox-list\/pull\/7\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">pull request z poprawk\u0105, kt\u00f3r\u0105 w\u0142a\u015bnie stworzy\u0142em<\/a>, i kt\u00f3ry przes\u0142a\u0142em do Sony An.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">\u0179r\u00f3d\u0142o nagrywania:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/wholesomecode.ltd\" class=\"external external_icon\">wholesomecode.ltd<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Je\u015bli budujesz bloki WordPress Gutenberg (lub nawet je\u015bli nie jeste\u015b), by\u0107 mo\u017ce pr\u00f3bujesz uruchomi\u0107 komponent React innej firmy w swojej kompilacji. Ale je\u015bli to starszy 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":[721,919,897,845],"tags":[1169],"class_list":["post-228088","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-deweloper","category-inny","category-kod","category-samouczki","tag-affiai-pl"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/228088","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/comments?post=228088"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/228088\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media\/224207"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media?parent=228088"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/categories?post=228088"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/tags?post=228088"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}