Szukaj…


Składnia

  • Przypadek 1: React.createClass ({})
  • Przypadek 2: klasa MyComponent rozszerza React.Component {}

Uwagi

React.createClass została React.createClass za przestarzałą w wersji 15.5 i prawdopodobnie zostanie usunięta w wersji 16 . Istnieje pakiet zastępczy dla tych, którzy nadal go potrzebują. Przykłady korzystające z niego powinny zostać zaktualizowane.

Utwórz React Component

Zbadajmy różnice w składni, porównując dwa przykłady kodu.

React.createClass (przestarzałe)

Tutaj mamy const z przypisaną klasą React, z funkcją render aby uzupełnić typową definicję komponentu podstawowego.

import React from 'react';

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

export default MyComponent;

React.Component

Weźmy powyższą definicję React.createClass i przekonwertujmy ją, aby używała klasy ES6.

import React from 'react';

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

export default MyComponent;

W tym przykładzie używamy teraz klas ES6. Dla zmian React tworzymy teraz klasę o nazwie MyComponent i rozszerzamy z React.Component zamiast bezpośrednio uzyskiwać dostęp do React.createClass. W ten sposób używamy mniej Reactplateplate i więcej JavaScript.

PS: Zazwyczaj byłoby to używane z czymś takim jak Babel do kompilacji ES6 do ES5 do pracy w innych przeglądarkach.

Deklaruj domyślne rekwizyty i typy propów

Istnieją ważne zmiany w sposobie używania i deklarowania domyślnych rekwizytów i ich typów.

React.createClass

W tej wersji właściwość propTypes jest obiektem, w którym możemy zadeklarować typ każdego rekwizytu. Właściwość getDefaultProps to funkcja, która zwraca obiekt w celu utworzenia początkowych rekwizytów.

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

Ta wersja używa propTypes jako właściwości rzeczywistej klasy MyComponent zamiast właściwości jako części obiektu definicji createClass .

Metoda getDefaultProps zmieniła się teraz na właściwość Object w klasie o nazwie defaultProps, ponieważ nie jest to już funkcja „get”, tylko obiekt. Unika więcej React Boiler, to jest po prostu 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;

Dodatkowo istnieje inna składnia dla propTypes i defaultProps . Jest to skrót, jeśli kompilacja ma włączone inicjalizatory właściwości 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;

Ustaw stan początkowy

Istnieją zmiany w sposobie ustawiania stanów początkowych.

React.createClass

Mamy funkcję getInitialState , która po prostu zwraca obiekt stanów początkowych.

import React from 'react';

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

export default MyComponent;

React.Component

W tej wersji deklarujemy cały stan jako prostą właściwość inicjującą w konstruktorze , zamiast używania funkcji getInitialState . Wydaje się mniej sterowany „React API”, ponieważ jest to po prostu 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;

Mixiny

Możemy używać mixins tylko w sposób React.createClass.

React.createClass

W tej wersji możemy dodawać mixins do składników za pomocą właściwości mixins, która pobiera tablicę dostępnych miksów. Następnie rozszerzają klasę komponentów.

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

Miksy React nie są obsługiwane podczas korzystania ze składników React napisanych w ES6. Co więcej, nie będą mieli obsługi klas ES6 w React. Powodem jest to, że są uważane za szkodliwe .

„ten” kontekst

Użycie React.createClass automatycznie automatycznie powiąże this kontekst (wartości), ale nie jest tak w przypadku używania klas ES6.

React.createClass

Zanotuj deklarację onClick z this.handleClick metodą this.handleClick . Po wywołaniu tej metody React zastosuje odpowiedni kontekst wykonania do 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

Z klas ES6 this jest null domyślnie właściwości klasy nie wiążą się automatycznie do React klasy (Component) instancji.

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;

Istnieje kilka sposobów na powiązanie this kontekstu.

Przypadek 1: Bind 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;

Przypadek 2: Powiązanie w konstruktorze klasy

Innym podejściem jest zmiana kontekstu this.handleClick wewnątrz constructor . W ten sposób unikamy powtarzania w linii. Uważane przez wielu za lepsze podejście, które w ogóle pozwala uniknąć dotykania JSX:

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;

Przypadek 3: Użyj funkcji anonimowej ES6

Możesz także użyć funkcji anonimowej ES6 bez konieczności jawnego wiązania:

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 / Reaguj „to” słowo kluczowe za pomocą ajax, aby uzyskać dane z serwera

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
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow