{"id":228187,"date":"2022-10-12T18:40:00","date_gmt":"2022-10-12T15:40:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=228187"},"modified":"2022-11-09T01:11:50","modified_gmt":"2022-11-08T22:11:50","slug":"react-createclassi-teisendamine-react-componentiks","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/et\/react-createclassi-teisendamine-react-componentiks\/","title":{"rendered":"React.createClassi teisendamine React.Componentiks"},"content":{"rendered":"\n<p>Oma <a href=\"https:\/\/wholesomecode.ltd\/blog\/broken-react-createclass-component-lets-fix-it\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">viimases artiklis r\u00e4\u00e4kisin Reacti vanemate versioonide paikamisest, et need t\u00f6\u00f6taksid kaasaegses keskkonnas<\/a>. Selles artiklis l\u00e4hen edasi ja annan samm-sammult juhise klassikalise Reacti komponendi uuendamiseks kaasaegseks, l\u00fclitades <code>React.createClass<\/code>asjade tegemise moodsale ja eelistatud <code>React.Component<\/code>meetodile.<\/p>\n<p>Vajalikud failid asuvad kaasasoleva GitHubi lahenduse komponentide kataloogi kaustades &quot;Original&quot; ja &quot;Final&quot;.<\/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\">Hankige \u00f5petusfailid GitHubist<\/a><\/p>\n<p>Taas t\u00f6\u00f6tan <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 Ani<\/a> komponendiga (saadaval <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-na<\/a> ). See juhend n\u00e4itab samm-sammult, kuidas asendada klassikalise <code>React.createClass<\/code>komponendi struktuur ja meetodid kaasaegsega <code>React.Component<\/code>.<\/p>\n<p>Alustades lahenduses olevast <code>.jsx<\/code>failist, <code>react-checkbox-list<\/code>kustutame esmalt <code>.js<\/code>faili ja nimetame selle \u00fcmber, <code>.js<\/code>kuna <code>.jsx<\/code>faile ei pea enam teisiti nimetama.<\/p>\n<p>See annab meile j\u00e4rgmise alguskoodi:<\/p>\n<pre><code>\n'use strict';\nvar React = require('react');\n\nmodule.exports = React.createClass({\n    displayName: 'CheckBoxList',\n\n    propTypes: {\n        defaultData: React.PropTypes.array,\n        onChange: React.PropTypes.func\n    },\n\n    getInitialState: function() {\n        return {\n            data: this.props.defaultData || []\n        };\n    },\n\n    handleItemChange: function(e) {\n        var selectedValues = [],\n            newData = [];\n\n        this.state.data.forEach(function(item) {\n            if(item.value === e.target.value) {\n                item.checked = e.target.checked;\n            }\n            if(item.checked) {\n                selectedValues.push(item.value);\n            }\n            newData.push(item);\n        });\n\n        this.setState({data: newData});\n\n        if(this.props.onChange) {\n            this.props.onChange(selectedValues);\n        }\n    },\n\n    reset: function() {\n        var newData = [];\n        this.state.data.forEach(function(item) {\n            item.checked = false;\n            newData.push(item);\n        });\n\n        this.setState({data: newData});\n    },\n\n    checkAll: function() {\n        var newData = [];\n        this.state.data.forEach(function(item) {\n            item.checked = true;\n            newData.push(item);\n        });\n\n        this.setState({data: newData});\n    },\n\n    render: function() {\n        var options;\n\n        options = this.state.data.map(function(item, index) {\n            return (&lt;div key={'chk-' + index} className=\"checkbox\"&gt;\n                    &lt;label&gt;\n                        &lt;input\n                            type=\"checkbox\"\n                            value={item.value}\n                            onChange={this.handleItemChange}\n                            checked={item.checked? true: false} \/&gt; {item.label}\n                    &lt;\/label&gt;\n                &lt;\/div&gt;\n            );\n        }.bind(this));\n\n        return (&lt;div&gt;\n                {options}\n            &lt;\/div&gt;\n        );\n    }\n});\n<\/code><\/pre>\n<h2>Komponendi teisendamine<\/h2>\n<p>Selle koodi laadimisel ilmneb esimene viga<code>Uncaught Error: Module build failed: SyntaxError: The @jsx React.DOM pragma has been deprecated as of React 0.12<\/code><\/p>\n<p>Tabamata viga: mooduli koostamine eba\u00f5nnestus: s\u00fcntaksiviga: <a href=\"https:\/\/hashnode.com\/@jsx\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">@jsx<\/a> React.DOM pragma on alates Reacti versioonist 0.12 aegunud<\/p>\n<p>Selle parandamiseks on piisavalt lihtne. Eemaldage lihtsalt joon <code>\/** @jsx React.DOM *\/<\/code>dokumendi \u00fclaosast.<\/p>\n<p>N\u00fc\u00fcd saame vea <code>Uncaught TypeError: Cannot read property 'array' of undefined<\/code>samamoodi nagu <a href=\"https:\/\/wholesomecode.ltd\/blog\/broken-react-createclass-component-lets-fix-it\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">lappimise<\/a> <code>[React.createClass](https:\/\/wholesomecode.ltd\/blog\/broken-react-createclass-component-lets-fix-it\/)<\/code><a href=\"https:\/\/wholesomecode.ltd\/blog\/broken-react-createclass-component-lets-fix-it\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">\u00f5petuses<\/a>. Selle p\u00f5hjuseks on asjaolu, et React.propTypes oli Reacti versioonis 15.50 aegunud, nii et selle \u00f5petuse j\u00e4rgi installige pakett PropTypes k\u00e4suga npm kaudu. Impordime selle hiljem oma paketti.<\/p>\n<pre><code>npm install --save prop-types\n<\/code><\/pre>\n<p>N\u00fc\u00fcd j\u00e4rgneb koodibaasi t\u00e4ielik uuendamine, nii et me ei saa v\u00e4rskendada ega viga parandada, nagu oleme varem teinud, nii et me ei tea, kas see on t\u00f6\u00f6tanud kuni p\u00e4ris l\u00f5puni. Pane kinni!<\/p>\n<p>Alustame funktsiooni asendamisest <code>React.createClass<\/code>uue deklareerimisega <code>React.Component<\/code>. Muutke meie koodi nii, et see n\u00e4eks v\u00e4lja j\u00e4rgmine:<\/p>\n<pre><code>'use strict';\nimport React from 'react';\n\nclass CheckBoxList extends React.Component {\n...\n}\n<\/code><\/pre>\n<p>Pange t\u00e4hele, et oleme siin teinud m\u00f5ned asjad:<\/p>\n<ul>\n<li>Eemaldatud JSX-i avakommentaar<\/li>\n<li>Muudetud deklaratsiooni t\u00fc\u00fcp selliseks <code>var React =...<\/code>on <code>import React from 'react';<\/code>kaasaegne viis deklaratsioonide tegemiseks Reactis.<\/li>\n<li><code>CheckBoxList<\/code>Funktsiooni eksportimise asemel deklareerime n\u00fc\u00fcd uue klassi .<\/li>\n<li>Sulgudes oleva objekti s\u00fcntaksi t\u00f5ttu <code>{...}<\/code>peame sulgemise \u00e4ra j\u00e4tma<code>);<\/code><\/li>\n<\/ul>\n<p>Kuid sellel uuel klassil puudub n\u00fc\u00fcd v\u00f5imalus selle eksportimiseks, et teised komponendid saaksid seda kasutada, seega lisame selle koodi l\u00f5ppu ekspordideklaratsiooni.<\/p>\n<pre><code>'use strict';\nimport React from 'react';\n\nclass CheckBoxList extends React.Component {\n...\n}\n\nexport default CheckBoxList;\n<\/code><\/pre>\n<p>Meie algses koodis k\u00e4sitleb seda funktsiooni esimene koodirida <code>displayName: 'CheckBoxList',<\/code>meie eksport, nii et saame selle koodi t\u00e4ielikult eemaldada.<\/p>\n<p>J\u00e4rgmine rida allapoole deklareerib, et <code>propTypes<\/code>need istuvad n\u00fc\u00fcd v\u00e4ljaspool klassi ja vajavad <code>PropTypes<\/code>s\u00f5ltuvust, mille lisasime npm-i kaudu. Lisame selle oma importidesse ja kirjutame PropTypes j\u00e4rgmiselt:<\/p>\n<pre><code>'use strict';\nimport React from 'react';\nimport PropTypes from 'prop-types';\n\nclass CheckBoxList extends React.Component {\n...\n}\n\nCheckBoxList.propTypes = {\n    defaultData: PropTypes.array,\n    onChange: PropTypes.func,\n};\n\nexport default CheckBoxList;\n<\/code><\/pre>\n<p>J\u00e4rgmisena deklareeritakse olek meetodi abil <code>getInitialState<\/code>, mille <code>React.Component<\/code>l\u00e4hteoleku m\u00e4\u00e4rame konstruktoriga. Lisage meie ehitusse j\u00e4rgmine kood:<\/p>\n<pre><code>...\nclass CheckBoxList extends React.Component {\n    constructor( props) {\n        super( props );\n        this.state = {\n            data: [],\n        }\n    }\n...\n}\n...\n<\/code><\/pre>\n<p>See m\u00e4\u00e4rab komponendi oleku, kuid oodake, me pole talle tegelikult \u00f6elnud, kust selle olekut saada. Seal <code>componentWillMount<\/code>tuleb kasuks.<\/p>\n<pre><code>...\nclass CheckBoxList extends React.Component {\n    constructor( props) {\n        super( props );\n        this.state = {\n            data: [],\n        }\n    }\n\n    componentWillMount() {\n        this.setState({\n            data: this.props.defaultData,\n        });\n    }\n...\n}\n...\n<\/code><\/pre>\n<p>Oluline on m\u00e4rkida, et sisemised meetodid <code>React.Component<\/code>ei l\u00f5pe komadega (<code>,<\/code>), seega veenduge, et komponendile lisatud meetodid ei l\u00f5peks komaga!<\/p>\n<p>J\u00e4rgmisena lisame renderdusfunktsiooni tagasi. See on ilmselt k\u00f5ige lihtsam osa, peaaegu sama, selle peamise erinevusega, et muudame <code>render: function() {<\/code>lihtsalt <code>render() {<\/code>.<\/p>\n<pre><code>...\nclass CheckBoxList extends React.Component {\n...\n    render() {\n        var options;\n\n        options = this.state.data.map(function(item, index) {\n            return (&lt;div key={'chk-' + index} className=\"checkbox\"&gt;\n                    &lt;label&gt;\n                        &lt;input\n                            type=\"checkbox\"\n                            value={item.value}\n                            onChange={this.handleItemChange}\n                            checked={item.checked? true: false} \/&gt; {item.label}\n                    &lt;\/label&gt;\n                &lt;\/div&gt;\n            );\n        }.bind(this));\n\n        return (&lt;div&gt;\n                {options}\n            &lt;\/div&gt;\n        );\n    }\n...\n}\n...\n<\/code><\/pre>\n<p>Et see \u00f5petus oleks asjakohane, ei teisenda ma kahte meetodit <code>reset<\/code>ja meetodi apple&#8217;i <code>checkAll<\/code>porti jaoks kasutatud m\u00f5isteid m\u00f5lemaks, nii et proovige neid ise.<code>handleItemChange<\/code><\/p>\n<p>Meetodi \u00fcleviimiseks <code>handleItemChange<\/code>peame esmalt eemaldama sulgemiskoma (<code>,<\/code>) ja muutma funktsiooni deklaratsiooni t\u00fc\u00fcpi t\u00fc\u00fcbist, <code>handleItemChange: function(e) {<\/code>et <code>handleItemChange( e) {<\/code>veenduda, et me edastame endiselt <code>e<\/code>s\u00fcndmuse parameetrina.<\/p>\n<p>Lisame selle meie renderdusmeetodi kohale.<\/p>\n<pre><code>...\nclass CheckBoxList extends React.Component {\n...\n    handleItemChange( e) {\n        var selectedValues = [],\n            newData = [];\n\n        this.state.data.forEach(function(item) {\n            if(item.value == e.target.value) {\n                item.checked = e.target.checked;\n            }\n            if(item.checked) {\n                selectedValues.push(item.value);\n            }\n            newData.push(item);\n        });\n\n        this.setState( {data: newData} );\n\n        if(this.props.onChange) {\n            this.props.onChange(selectedValues);\n        }\n    }\n...\n}\n...\n<\/code><\/pre>\n<p>Meie komponent renderdatakse n\u00fc\u00fcd, kuid see ei t\u00f6\u00f6ta. Kui proovite kl\u00f5psata m\u00e4rkeruudul, n\u00e4ete veateadet <code>Uncaught TypeError: Cannot read property 'state' of undefined<\/code>.<\/p>\n<p>Tabamata t\u00fc\u00fcbiviga: m\u00e4\u00e4ramata atribuuti &#8216;state&#8217; ei saa lugeda<\/p>\n<p>Selle p\u00f5hjuseks on asjaolu, et meie <code>handleItemChange<\/code>meetod, kus me proovime olekule juurde p\u00e4\u00e4seda, <code>this<\/code>on m\u00e4\u00e4ratlemata. Selle parandamiseks peame oma funktsiooni siduma <code>this<\/code>, lisades oma konstruktorisse j\u00e4rgmise rea: <code>this.handleItemChange = this.handleItemChange.bind( this );<\/code>.<\/p>\n<pre><code>...\nclass CheckBoxList extends React.Component {\n    constructor( props) {\n        super( props );\n        this.state = {\n            data: [],\n        }\n        this.handleItemChange = this.handleItemChange.bind( this );\n    }\n...\n}\n...\n<\/code><\/pre>\n<p>Ja siin see on, meie \u00e4sja teisendatud Reacti komponent t\u00f6\u00f6s.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-169430-61e80f22b2772.gif\" alt=\"React.createClassi teisendamine React.Componentiks\" \/>React.createClass kuni React.Component<\/p>\n<h2>\u00d5petuse l\u00e4htekood<\/h2>\n<p><a href=\"https:\/\/github.com\/wholesomecode\/Tutorial-Convert-React-createClass-to-React-Component\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Komponendi algse ja l\u00f5pliku versiooni l\u00e4htekoodi<\/a> saate alla laadida GitHubist. Pistikprogramm sisaldab WordPressi Gutenbergi plokki, mida saate koodiga m\u00e4ngimiseks kasutada kolme failiga, mille saate vajaduse korral kustutada:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-169430-61e80f247b7d4.png\" alt=\"React.createClassi teisendamine React.Componentiks\" \/>GitHubi \u00f5ppefailid teisenduseks React.createClass to React.Component<\/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>Oma viimases artiklis r\u00e4\u00e4kisin Reacti vanemate versioonide paikamisest, et need t\u00f6\u00f6taksid kaasaegses keskkonnas. Selles artiklis l\u00e4hen edasi ja annan samm-sammulise juhendi mooduli uuendamiseks&#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":[718,894,916,842],"tags":[1165],"class_list":["post-228187","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-arendaja","category-kood","category-muud","category-opetused","tag-affiai-et"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/posts\/228187","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/comments?post=228187"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/posts\/228187\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/media\/224207"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/media?parent=228187"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/categories?post=228187"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/tags?post=228187"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}