Ricerca…


Sintassi

  • Caso 1: React.createClass ({})
  • Caso 2: classe MyComponent estende React.Component {}

Osservazioni

React.createClass stato deprecato in v15.5 e dovrebbe essere rimosso in v16 . C'è un pacchetto di sostituzione drop-in per quelli che lo richiedono ancora. Gli esempi che lo utilizzano dovrebbero essere aggiornati.

Crea componente di reazione

Esploriamo le differenze di sintassi confrontando due esempi di codice.

React.createClass (deprecato)

Qui abbiamo un const con una classe React assegnata, con la funzione render successiva per completare una tipica definizione di componente base.

import React from 'react';

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

export default MyComponent;

React.Component

Prendiamo la precedente definizione React.createClass e convertiamola per utilizzare una classe ES6.

import React from 'react';

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

export default MyComponent;

In questo esempio stiamo ora utilizzando le classi ES6. Per le modifiche di React, ora creiamo una classe chiamata MyComponent ed estendiamo da React.Component anziché accedere direttamente a React.createClass. In questo modo, utilizziamo meno il boiler React e più JavaScript.

PS: Tipicamente questo sarebbe usato con qualcosa come Babel per compilare ES6 in ES5 per funzionare in altri browser.

Dichiarare puntelli predefiniti e PropTypes

Ci sono cambiamenti importanti nel modo in cui usiamo e dichiariamo oggetti di scena di default e i loro tipi.

React.createClass

In questa versione, la proprietà propTypes è un oggetto in cui è possibile dichiarare il tipo per ciascun oggetto. La proprietà getDefaultProps è una funzione che restituisce un oggetto per creare gli oggetti di scena iniziali.

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

Questa versione utilizza propTypes come proprietà sull'effettiva classe MyComponent anziché su una proprietà come parte createClass definizione createClass .

Il getDefaultProps ora è stato modificato in una proprietà Object nella classe denominata defaultProps, in quanto non è più una funzione "get", è solo un oggetto. Evita più React boilerplate, questo è semplicemente 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;

Inoltre, esiste un'altra sintassi per propTypes e defaultProps . Questa è una scorciatoia se la tua build ha attivato gli inizializzatori delle proprietà di ES7:

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;

Imposta stato iniziale

Ci sono dei cambiamenti nel modo in cui impostiamo gli stati iniziali.

React.createClass

Abbiamo una funzione getInitialState , che restituisce semplicemente un oggetto di stati iniziali.

import React from 'react';

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

export default MyComponent;

React.Component

In questa versione dichiariamo tutto lo stato come una semplice proprietà di inizializzazione nel costruttore , invece di usare la funzione getInitialState . Sembra meno "React API" guidato poiché questo è semplicemente JavaScript.

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

Possiamo usare mixins solo con il modo in cui React.createClass.

React.createClass

In questa versione possiamo aggiungere mixins ai componenti usando la proprietà mixins che prende una matrice di mixin disponibili. Questi estendono quindi la classe del componente.

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

I mixaggi di reazione non sono supportati quando si usano componenti React scritti in ES6. Inoltre, non avranno supporto per le classi ES6 in React. Il motivo è che sono considerati dannosi .

"questo" Contesto

L'utilizzo di React.createClass associa automaticamente this contesto (valori) correttamente, ma non è il caso quando si utilizzano le classi ES6.

React.createClass

Nota la dichiarazione onClick con il metodo this.handleClick associato. Quando viene chiamato questo metodo, React applicherà il contesto di esecuzione corretto a 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

Con le classi ES6 this è null per impostazione predefinita, le proprietà della classe non si associano automaticamente all'istanza della classe React (componente).

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;

Ci sono alcuni modi in cui possiamo legare il diritto a this contesto.

Caso 1: legatura in linea:

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;

Caso 2: rilegatura nel costruttore della classe

Un altro approccio sta cambiando il contesto di this.handleClick all'interno del constructor . In questo modo evitiamo la ripetizione in linea. Considerato da molti come un approccio migliore che evita di toccare JSX affatto:

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;

Caso 3: utilizzare la funzione anonima ES6

Puoi anche utilizzare la funzione anonima ES6 senza doverli associare esplicitamente:

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 / Reagire con "questa" parola chiave con ajax per ottenere dati dal server

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
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow