Zoeken…


Syntaxis

  • Geval 1: React.createClass ({})
  • Geval 2: klasse MyComponent breidt React.Component uit {}

Opmerkingen

React.createClass is verouderd in v15.5 en zal naar verwachting worden verwijderd in v16 . Er is een drop-in vervangingspakket voor degenen die het nog steeds nodig hebben. Voorbeelden hiervan moeten worden bijgewerkt.

Maak een reactiecomponent

Laten we de syntaxverschillen onderzoeken door twee codevoorbeelden te vergelijken.

React.createClass (verouderd)

Hier hebben we een const waaraan een React-klasse is toegewezen, waarbij de render volgt om een typische basiscomponentdefinitie te voltooien.

import React from 'react';

const MyComponent = React.createClass({
  render() {
    return (
      <div></div>
    );
  }
});

export default MyComponent;

React.Component

Laten we de bovenstaande React.createClass-definitie nemen en deze omzetten in een ES6-klasse.

import React from 'react';

class MyComponent extends React.Component {
  render() {
    return (
      <div></div>
    );
  }
}

export default MyComponent;

In dit voorbeeld gebruiken we nu ES6-klassen. Voor de React-wijzigingen maken we nu een klasse met de naam MyComponent en breiden we deze uit vanuit React.Component in plaats van rechtstreeks naar React.createClass te gaan. Op deze manier gebruiken we minder React boilerplate en meer JavaScript.

PS: Meestal zou dit worden gebruikt met zoiets als Babel om de ES6 naar ES5 te compileren om in andere browsers te werken.

Declareer standaard rekwisieten en proptypen

Er zijn belangrijke wijzigingen in het gebruik en declareren van standaardprops en hun typen.

React.createClass

In deze versie is de eigenschap propTypes een object waarin we het type voor elke prop kunnen aangeven. De eigenschap getDefaultProps is een functie die een object retourneert om de eerste rekwisieten te maken.

import React from 'react';

const MyComponent = React.createClass({
  propTypes: {
    name: React.PropTypes.string,
    position: React.PropTypes.number
  },
  getDefaultProps() {
    return {
      name: 'Home',
      position: 1
    };
  },
  render() {
    return (
      <div></div>
    );
  }
});

export default MyComponent;

React.Component

Deze versie gebruikt propTypes als een eigenschap van de werkelijke klasse MyComponent in plaats van een eigenschap als onderdeel van het createClass definitieobject.

De getDefaultProps is nu gewijzigd in alleen een objecteigenschap in de klasse met de naam defaultProps, omdat het niet langer een "get" -functie is, het is gewoon een object. Het vermijdt meer Reageren boilerplate, dit is gewoon JavaScript.

import React from 'react';

class MyComponent extends React.Component {
  constructor(props) {
    super(props);
  }
  render() {
    return (
      <div></div>
    );
  }
}
MyComponent.propTypes = {
  name: React.PropTypes.string,
  position: React.PropTypes.number
};
MyComponent.defaultProps = {
  name: 'Home',
  position: 1
};

export default MyComponent;

Bovendien is er nog een syntaxis voor propTypes en defaultProps . Dit is een snelkoppeling als uw build ES7-eigenschapinitializers heeft ingeschakeld:

import React from 'react';

class MyComponent extends React.Component {
  static propTypes = {
    name: React.PropTypes.string,
    position: React.PropTypes.number
  };
  static defaultProps = {
    name: 'Home',
    position: 1
  };
  constructor(props) {
    super(props);
  }
  render() {
    return (
      <div></div>
    );
  }
}

export default MyComponent;

Stel de initiële status in

Er zijn wijzigingen in de manier waarop we de begintoestanden instellen.

React.createClass

We hebben een getInitialState functie, die eenvoudigweg een object met initiële statussen retourneert.

import React from 'react';

const MyComponent = React.createClass({
  getInitialState () {
    return {
      activePage: 1
    };
  },
  render() {
    return (
      <div></div>
    );
  }
});

export default MyComponent;

React.Component

In deze versie verklaren we alle status als een eenvoudige initialisatie-eigenschap in de constructor , in plaats van de functie getInitialState te gebruiken. Het voelt minder "React API" aan, omdat dit gewoon JavaScript is.

import React from 'react';

class MyComponent extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      activePage: 1
    };
  }
  render() {
    return (
      <div></div>
    );
  }
}

export default MyComponent;

mixins

We kunnen mixins alleen gebruiken op de React.createClass-manier.

React.createClass

In deze versie kunnen we mixins toevoegen aan componenten met behulp van de eigenschap mixins die een array van beschikbare mixins gebruikt. Deze breiden vervolgens de componentklasse uit.

import React from 'react';

var MyMixin = {
  doSomething() {

  }
};
const MyComponent = React.createClass({
  mixins: [MyMixin],
  handleClick() {
    this.doSomething(); // invoke mixin's method
  },
  render() {
    return (
      <button onClick={this.handleClick}>Do Something</button>
    );
  }
});

export default MyComponent;

React.Component

React-mixins worden niet ondersteund bij gebruik van React-componenten geschreven in ES6. Bovendien hebben ze geen ondersteuning voor ES6-klassen in React. De reden is dat ze als schadelijk worden beschouwd .

"deze" context

Het gebruik van React.createClass zal this context (waarden) automatisch correct binden, maar dat is niet het geval bij het gebruik van ES6-klassen.

React.createClass

Let op de aangifte onClick met de methode this.handleClick gebonden. Wanneer deze methode wordt genoemd, past React de juiste uitvoeringscontext toe op de handleClick .

import React from 'react';

const MyComponent = React.createClass({
  handleClick() {
    console.log(this); // the React Component instance
  },
  render() {
    return (
      <div onClick={this.handleClick}></div>
    );
  }
});

export default MyComponent;

React.Component

Bij ES6-klassen is this standaard null , eigenschappen van de klasse binden niet automatisch aan de instantie React class (component).

import React from 'react';

class MyComponent extends React.Component {
  constructor(props) {
    super(props);
  }
  handleClick() {
    console.log(this); // null
  }
  render() {
    return (
      <div onClick={this.handleClick}></div>
    );
  }
}

export default MyComponent;

Er zijn een paar manieren waarop we this context kunnen binden.

Geval 1: binden inline:

import React from 'react';

class MyComponent extends React.Component {
  constructor(props) {
    super(props);
  }
  handleClick() {
    console.log(this); // the React Component instance
  }
  render() {
    return (
      <div onClick={this.handleClick.bind(this)}></div>
    );
  }
}

export default MyComponent;

Geval 2: binden in de klassenbouwer

Een andere benadering is het wijzigen van de context van this.handleClick in de constructor . Op deze manier voorkomen we inline herhaling. Door velen beschouwd als een betere aanpak die het aanraken van JSX helemaal vermijdt:

import React from 'react';

class MyComponent extends React.Component {
  constructor(props) {
    super(props);
    this.handleClick = this.handleClick.bind(this);
  }
  handleClick() {
    console.log(this); // the React Component instance
  }
  render() {
    return (
      <div onClick={this.handleClick}></div>
    );
  }
}

export default MyComponent;

Geval 3: gebruik de anonieme functie ES6

U kunt ook de anonieme functie van ES6 gebruiken zonder expliciet te binden:

import React from 'react';

class MyComponent extends React.Component {
  constructor(props) {
    super(props);
  }
  handleClick = () => {
    console.log(this); // the React Component instance
  }
  render() {
    return (
      <div onClick={this.handleClick}></div>
    );
  }
}

export default MyComponent;

ES6 / Reageer "dit" trefwoord met ajax om gegevens van de server te krijgen

import React from 'react';

class SearchEs6 extends React.Component{
    constructor(props) {
        super(props);
        this.state = {
            searchResults: []
        };
    }

    showResults(response){
        this.setState({
            searchResults: response.results
        })
    }

    search(url){
        $.ajax({
            type: "GET",
            dataType: 'jsonp',
            url: url,
            success: (data) => {
                this.showResults(data);
            },
            error: (xhr, status, err) => {
                console.error(url, status, err.toString());
            }
        });
    }

    render() {
        return (
            <div>
                <SearchBox search={this.search.bind(this)} />
                <Results searchResults={this.state.searchResults} />
            </div>
        );
    }
}


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow