Edellisessä artikkelissani puhuin Reactin vanhempien versioiden korjaamisesta toimimaan nykyaikaisessa ympäristössä. Tässä artikkelissa menen pidemmälle ja annan vaiheittaisen oppaan klassisen React-komponentin päivittämiseen nykyaikaiseksi vaihtamalla React.createClass
asioiden tekeminen nykyaikaiseen ja suositumpaan React.Component
menetelmään.
Tarvitsemamme tiedostot ovat mukana tulevan GitHub-ratkaisun komponenttihakemiston ‘Original’ ja ‘Final’ kansioissa.
Hanki opetusohjelmatiedostot GitHubista
Taas työskennellään [react-checkbox-list](https://github.com/sonyan/react-checkbox-list)
Sony Anin komponentin kanssa (saatavana react-checkbox-list
npm ). React.createClass
Tämä opas näyttää vaihe vaiheelta, kuinka klassisen komponentin rakenne ja menetelmät korvataan modernilla React.Component
.
Alkaen ratkaisussa olevasta .jsx
tiedostosta react-checkbox-list
, poistamme ensin .js
tiedoston ja nimeämme sen uudelleen muotoon, .js
koska .jsx
tiedostoja ei enää tarvitse nimetä eri tavalla.
Tämä antaa meille seuraavan aloituskoodin:
Komponentin muuntaminen
Kun yrität ladata tätä koodia, ensimmäinen virhe, jonka saamme, onUncaught Error: Module build failed: SyntaxError: The @jsx React.DOM pragma has been deprecated as of React 0.12
Tavoittamaton virhe: Moduulin rakennus epäonnistui: SyntaxError: @jsx React.DOM- käytäntö on vanhentunut React 0.12 :sta lähtien
Tämä on tarpeeksi yksinkertainen korjata. Poista vain viiva /** @jsx React.DOM */
asiakirjan yläosasta.
Saamme nyt saman virheenUncaught TypeError: Cannot read property 'array' of undefined
kuin korjausohjeessa. Tämä johtuu siitä, että React.propTypes on vanhentunut Reactin versiossa 15.50, joten jatka tämän opetusohjelman mukaisesti ja asenna PropTypes-paketti komennolla npm:n kautta. Tuomme tämän pakettiin myöhemmin.[React.createClass](https://wholesomecode.ltd/blog/broken-react-createclass-component-lets-fix-it/)
npm install --save prop-types
Nyt seuraa koodikannan täydellinen uudistus, joten emme voi päivittää ja korjata virhettä, kuten olemme saaneet tehdä aiemmin, joten emme tiedä, onko se toiminut aivan loppuun asti. Kiinni!
Aloitetaan korvaamalla React.createClass
funktio ilmoittamalla uusi React.Component
. Muuta koodiamme niin, että se näyttää tältä:
'use strict';
import React from 'react';
class CheckBoxList extends React.Component {
...
}
Huomaa, että olemme tehneet muutamia asioita täällä:
- Poistettu avaava JSX-kommentti
- Ilmoitustyyppi muutettu
var React =...
tähänimport React from 'react';
on moderni tapa tehdä ilmoituksia Reactissa. - Ilmoitamme nyt uuden luokan
CheckBoxList
funktion viemisen sijaan. - Suluissa olevan objektin syntaksin vuoksi
{...}
meidän on hylättävä sulkemis);
Tästä uudesta luokasta puuttuu kuitenkin nyt tapa viedä sitä, jotta muut komponentit voivat käyttää sitä, joten lisätään vienti-ilmoitus koodin alaosaan.
'use strict';
import React from 'react';
class CheckBoxList extends React.Component {
...
}
export default CheckBoxList;
Alkuperäisessä koodissamme funktion ensimmäinen koodirivi oli, displayName: 'CheckBoxList',
että vientimme käsittelee nyt tämän, joten voimme poistaa koodin kokonaan.
Seuraava rivi alas ilmoittaa, että propTypes
nämä istuvat nyt luokan ulkopuolella ja tarvitsevat PropTypes
riippuvuuden, jonka lisäsimme npm:n kautta. Lisätään se tuontiin ja kirjoitetaan PropTypes näin:
'use strict';
import React from 'react';
import PropTypes from 'prop-types';
class CheckBoxList extends React.Component {
...
}
CheckBoxList.propTypes = {
defaultData: PropTypes.array,
onChange: PropTypes.func,
};
export default CheckBoxList;
Seuraavaksi tila ilmoitetaan menetelmällä getInitialState
, jossa React.Component
asetamme alkutilan konstruktorilla. Lisää seuraava koodi rakentamiseen:
...
class CheckBoxList extends React.Component {
constructor( props) {
super( props );
this.state = {
data: [],
}
}
...
}
...
Siinä mennään, se määrittää komponentin tilan, mutta odota, emme ole kertoneet sille, mistä sen tila saa. Siellä se componentWillMount
on hyödyllistä.
...
class CheckBoxList extends React.Component {
constructor( props) {
super( props );
this.state = {
data: [],
}
}
componentWillMount() {
this.setState({
data: this.props.defaultData,
});
}
...
}
...
Tärkeintä on huomata, että sisäiset menetelmät React.Component
eivät pääty pilkkuihin (,
), joten varmista, että komponenttiin lisäämäsi menetelmät eivät pääty pilkkuun!
Lisätään seuraavaksi renderöintitoiminto takaisin. Tämä on luultavasti helpoin osa, se on melkein sama, sillä keskeinen ero, että muutamme render: function() {
vain render() {
.
Jotta tämä opetusohjelma pysyy asian ytimessä, en muunna kahta menetelmää reset
ja menetelmäomenan checkAll
portissa käytettyjä käsitteitä handleItemChange
molemmiksi, joten voit vapaasti kokeilla niitä itse.
Menetelmän siirtämiseksi handleItemChange
meidän on ensin poistettava sulkeva pilkku (,
) ja muutettava funktion ilmoitustyyppi -asennosta handleItemChange: function(e) {
varmistaaksemme handleItemChange( e) {
, että käytämme edelleen e
tapahtumaparametria.
Lisätään se renderointimenetelmämme yläpuolelle.
...
class CheckBoxList extends React.Component {
...
handleItemChange( e) {
var selectedValues = [],
newData = [];
this.state.data.forEach(function(item) {
if(item.value == e.target.value) {
item.checked = e.target.checked;
}
if(item.checked) {
selectedValues.push(item.value);
}
newData.push(item);
});
this.setState( {data: newData} );
if(this.props.onChange) {
this.props.onChange(selectedValues);
}
}
...
}
...
Komponenttimme hahmonnetaan nyt, mutta se ei toimi. Kun yrität napsauttaa valintaruutua, saat virheilmoituksen Uncaught TypeError: Cannot read property 'state' of undefined
.
Uncaught TypeError: Määrittämättömän ominaisuuden ‘state’ lukeminen epäonnistui
Tämä johtuu siitä, että handleItemChange
menetelmässämme, jossa yritämme päästä tilaan, this
on määrittelemätön. Korjataksemme tämän meidän täytyy sitoa funktiomme this
lisäämällä seuraava rivi konstruktoriimme: this.handleItemChange = this.handleItemChange.bind( this );
.
...
class CheckBoxList extends React.Component {
constructor( props) {
super( props );
this.state = {
data: [],
}
this.handleItemChange = this.handleItemChange.bind( this );
}
...
}
...
Ja siellä se on, juuri muunnettu React-komponenttimme toiminnassa.
React.createClass to React.Component
Opetusohjelman lähdekoodi
Voit ladata komponentin alkuperäisen ja lopullisen version lähdekoodin GitHubista. Laajennus sisältää WordPress Gutenberg -lohkon, jonka avulla voit leikkiä koodilla kolmella tiedostolla, jotka voit poistaa tarpeen mukaan:
GitHub-opetustiedostot React.createClass to React.Component -muunnokselle