We want to hear from you!Take our 2021 Community Survey!
This site is no longer updated.Go to react.dev

React Π±Π΅Π· ES6

These docs are old and won’t be updated. Go to react.dev for the new React docs.

Π—Π°Π·Π²ΠΈΡ‡Π°ΠΉ, Π²ΠΈ Π± оголосили React-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Ρƒ вигляді JavaScript-класу:

class Greeting extends React.Component {
  render() {
    return <h1>ΠŸΡ€ΠΈΠ²Ρ–Ρ‚, {this.props.name}</h1>;
  }
}

Π―ΠΊΡ‰ΠΎ Π²ΠΈ досі Π½Π΅ використовуєтС ES6, Π²ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ використати ΠΏΠ°ΠΊΠ΅Ρ‚ create-react-class:

var createReactClass = require('create-react-class');
var Greeting = createReactClass({
  render: function() {
    return <h1>ΠŸΡ€ΠΈΠ²Ρ–Ρ‚, {this.props.name}</h1>;
  }
});

API ES6-класів схоТий Π΄ΠΎ createReactClass() Π·Π° дСякими Π²ΠΈΠΊΠ»ΡŽΡ‡Π΅Π½Π½ΡΠΌΠΈ.

ОголошСння властивостСй ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°

Π—Π° допомогою Ρ„ΡƒΠ½ΠΊΡ†Ρ–ΠΉ Ρ‚Π° класів ES6 defaultProps ΠΎΠ³ΠΎΠ»ΠΎΡˆΡƒΡŽΡ‚ΡŒΡΡ як Π²Π»Π°ΡΡ‚ΠΈΠ²Ρ–ΡΡ‚ΡŒ самого ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°:

class Greeting extends React.Component {
  // ...
}

Greeting.defaultProps = {
  name: 'ΠœΠ°Ρ€Ρ–Ρ'
};

Π’ΠΈΠΊΠΎΡ€ΠΈΡΡ‚ΠΎΠ²ΡƒΡŽΡ‡ΠΈ createReactClass(), Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…Ρ–Π΄Π½ΠΎ Π²ΠΈΠ·Π½Π°Ρ‡ΠΈΡ‚ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ getDefaultProps() як Ρ„ΡƒΠ½ΠΊΡ†Ρ–ΡŽ Π² ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ΠΎΠΌΡƒ об’єкті:

var Greeting = createReactClass({
  getDefaultProps: function() {
    return {
      name: 'ΠœΠ°Ρ€Ρ–Ρ'
    };
  },

  // ...

});

ВстановлСння ΠΏΠΎΡ‡Π°Ρ‚ΠΊΠΎΠ²ΠΎΠ³ΠΎ стану ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°

Π’ΠΈΠΊΠΎΡ€ΠΈΡΡ‚ΠΎΠ²ΡƒΡŽΡ‡ΠΈ ES6-класи, Π²ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΈΠ·Π½Π°Ρ‡ΠΈΡ‚ΠΈ ΠΏΠΎΡ‡Π°Ρ‚ΠΊΠΎΠ²ΠΈΠΉ стан Ρ‡Π΅Ρ€Π΅Π· this.state Ρƒ конструкторі:

class Counter extends React.Component {
  constructor(props) {
    super(props);
    this.state = {count: props.initialCount};
  }
  // ...
}

Π— createReactClass() Π²ΠΈ ΠΌΠ°Ρ”Ρ‚Π΅ створити ΠΎΠΊΡ€Π΅ΠΌΠΈΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ getInitialState, який ΠΏΠΎΠ²Π΅Ρ€Π½Π΅ ΠΏΠΎΡ‡Π°Ρ‚ΠΊΠΎΠ²ΠΈΠΉ стан:

var Counter = createReactClass({
  getInitialState: function() {
    return {count: this.props.initialCount};
  },
  // ...
});

Автоприв’язка

Π£ React-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°Ρ… ΠΎΠ³ΠΎΠ»ΠΎΡˆΠ΅Π½ΠΈΡ… як ES6-класи, ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈ Π΄ΠΎΡ‚Ρ€ΠΈΠΌΡƒΡŽΡ‚ΡŒΡΡ Ρ‚Π°ΠΊΠΎΡ— ΠΆ сСмантики, як Ρ– Π·Π²ΠΈΡ‡Π°ΠΉΠ½Ρ– ES6-класи. Π¦Π΅ ΠΎΠ·Π½Π°Ρ‡Π°Ρ”, Ρ‰ΠΎ Π²ΠΎΠ½ΠΈ Π½Π΅ Π²ΠΈΠΊΠΎΠ½ΡƒΡŽΡ‚ΡŒ прив’язку this Π΄ΠΎ СкзСмпляру ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π½ΠΎ. Π’Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…Ρ–Π΄Π½ΠΎ Π±ΡƒΠ΄Π΅ явно використати .bind(this) Ρƒ конструкторі:

class SayHello extends React.Component {
  constructor(props) {
    super(props);
    this.state = {message: 'ΠŸΡ€ΠΈΠ²Ρ–Ρ‚!'};
    // Π¦Π΅ΠΉ рядок -- Π΄ΡƒΠΆΠ΅ Π²Π°ΠΆΠ»ΠΈΠ²ΠΈΠΉ!
    this.handleClick = this.handleClick.bind(this);
  }

  handleClick() {
    alert(this.state.message);
  }

  render() {
    // ΠžΡΠΊΡ–Π»ΡŒΠΊΠΈ `this.handleClick` Ρ” ΠΏΡ€ΠΈΠ²'язаним Ρƒ конструкторі СкзСмпляра, Ρ‚ΠΎ ΠΌΠΈ ΠΌΠΎΠΆΠ΅ΠΌΠΎ ΠΉΠΎΠ³ΠΎ використати як ΠΎΠ±Ρ€ΠΎΠ±Π½ΠΈΠΊ ΠΏΠΎΠ΄Ρ–Ρ—.
    return (
      <button onClick={this.handleClick}>
        Π‘ΠΊΠ°ΠΆΠΈ "ΠΏΡ€ΠΈΠ²Ρ–Ρ‚"
      </button>
    );
  }
}

Π— використанням createReactClass() Ρ†Π΅ нСобов’язково, ΠΎΡΠΊΡ–Π»ΡŒΠΊΠΈ Ρ†Π΅ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ прив’язує всі ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈ Π΄ΠΎ СкзСмпляра ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°:

var SayHello = createReactClass({
  getInitialState: function() {
    return {message: 'ΠŸΡ€ΠΈΠ²Ρ–Ρ‚!'};
  },

  handleClick: function() {
    alert(this.state.message);
  },

  render: function() {
    return (
      <button onClick={this.handleClick}>
        Π‘ΠΊΠ°ΠΆΠΈ "ΠΏΡ€ΠΈΠ²Ρ–Ρ‚"
      </button>
    );
  }
});

Π¦Π΅ ΠΎΠ·Π½Π°Ρ‡Π°Ρ”, Ρ‰ΠΎ ES6-класи ΠΏΠΈΡˆΡƒΡ‚ΡŒΡΡ Ρ–Π· Ρ‚Ρ€ΠΎΡ…ΠΈ Π±Ρ–Π»ΡŒΡˆ ΡƒΠ½Ρ–Π²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΈΠΌ ΠΊΠΎΠ΄ΠΎΠΌ для ΠΎΠ±Ρ€ΠΎΠ±Π½ΠΈΠΊΡ–Π² ΠΏΠΎΠ΄Ρ–ΠΉ, Π°Π»Π΅ ΠΏΡ€ΠΈ Ρ†ΡŒΠΎΠΌΡƒ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΈΠ²Π½Ρ–ΡΡ‚ΡŒ Π²Π΅Π»ΠΈΡ‡Π΅Π·Π½ΠΈΡ… Π΄ΠΎΠ΄Π°Ρ‚ΠΊΡ–Π² Ρ” Ρ‚Ρ€ΠΎΡ…ΠΈ Π²ΠΈΡ‰ΠΎΡŽ.

Π―ΠΊΡ‰ΠΎ ΡƒΠ½Ρ–Π²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΈΠΉ ΠΊΠΎΠ΄ для вас Π½Π΅ Π·Π°Π½Π°Π΄Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π°Π±Π»ΠΈΠ²ΠΈΠΉ, Π²ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠ²Ρ–ΠΌΠΊΠ½ΡƒΡ‚ΠΈ Π΅ΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρƒ ΠΏΡ€ΠΎΠΏΠΎΠ·ΠΈΡ†Ρ–ΡŽ синтаксису Class Properties Π· Babel:

class SayHello extends React.Component {
  constructor(props) {
    super(props);
    this.state = {message: 'ΠŸΡ€ΠΈΠ²Ρ–Ρ‚!'};
  }
  // Π’ΡƒΡ‚ стрілкова функція Π²ΠΈΠΊΠΎΠ½ΡƒΡ” ΠΏΡ€ΠΈΠ²'язку:
  handleClick = () => {
    alert(this.state.message);
  };

  render() {
    return (
      <button onClick={this.handleClick}>
        Π‘ΠΊΠ°ΠΆΠΈ "ΠΏΡ€ΠΈΠ²Ρ–Ρ‚"
      </button>
    );
  }
}

Π—Π²Π΅Ρ€Π½Ρ–Ρ‚ΡŒ ΡƒΠ²Π°Π³Ρƒ, Ρ‰ΠΎ синтаксис, описаний Π²ΠΈΡ‰Π΅, Ρ” Π΅ΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½ΠΈΠΌ Ρ– Π²Ρ–Π½ ΠΌΠΎΠΆΠ΅ змінитися, Π°Π±ΠΎ пропозиція Π½Π΅ Π±ΡƒΠ΄Π΅ внСсСна Π² стандарт ΠΌΠΎΠ²ΠΈ.

Π―ΠΊΡ‰ΠΎ Π²ΠΈ Π·Π° Π±Π΅Π·ΠΏΠ΅Ρ‡Π½ΠΈΠΉ Π²Π°Ρ€Ρ–Π°Π½Ρ‚, Ρ‚ΠΎ ось Ρ‰Π΅ Π²Π°Ρ€Ρ–Π°Π½Ρ‚ΠΈ:

  • ΠŸΡ€ΠΈΠ²β€™ΡΠ·ΡƒΠΉΡ‚Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈ Π² конструкторі.
  • ВикористовуйтС стрілкові Ρ„ΡƒΠ½ΠΊΡ†Ρ–Ρ—, Π½Π°ΠΏΡ€ΠΈΠΊΠ»Π°Π΄, onClick={(e) => this.handleClick(e)}.
  • ВикористовуйтС createReactClass Ρ– Π΄Π°Π»Ρ–.

ΠœΡ–ΠΊΡΠΈΠ½ΠΈ

ΠŸΡ€ΠΈΠΌΡ–Ρ‚ΠΊΠ°:

ES6 Π±ΡƒΠ² Π²ΠΈΠΏΡƒΡ‰Π΅Π½ΠΈΠΉ Π±Π΅Π· ΠΏΡ–Π΄Ρ‚Ρ€ΠΈΠΌΠΊΠΈ міксинів. Π’ΠΎΠΌΡƒ Π½Π΅ΠΌΠ°Ρ” ніякої ΠΏΡ–Π΄Ρ‚Ρ€ΠΈΠΌΠΊΠΈ міксинів, ΠΊΠΎΠ»ΠΈ Π²ΠΈ використовуєтС React Π· ES6-класами.

Ми Ρ‚Π°ΠΊΠΎΠΆ знайшли Π±Π΅Π·Π»Ρ–Ρ‡ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Ρƒ ΠΊΠΎΠ΄ΠΎΠ²ΠΈΡ… Π±Π°Π·Π°Ρ…, Ρ‰ΠΎ Π²ΠΈΠΊΠΎΡ€ΠΈΡΡ‚ΠΎΠ²ΡƒΡŽΡ‚ΡŒ міксини, Ρ– Π½Π΅ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΡ”ΠΌΠΎ використовувати Ρ—Ρ… Ρƒ Ρ€ΠΎΠ·Ρ€ΠΎΠ±Ρ†Ρ–.

Π¦Π΅ΠΉ Ρ€ΠΎΠ·Π΄Ρ–Π» існує Ρ‚Ρ–Π»ΡŒΠΊΠΈ для Π΄ΠΎΠ²Ρ–Π΄ΠΊΠΈ.

Π†Π½ΠΊΠΎΠ»ΠΈ Π΄ΡƒΠΆΠ΅ Ρ€Ρ–Π·Π½Ρ– ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΈ ΠΌΠΎΠΆΡƒΡ‚ΡŒ ΠΌΠ°Ρ‚ΠΈ ΡΠΏΡ–Π»ΡŒΠ½Ρƒ Ρ„ΡƒΠ½ΠΊΡ†Ρ–ΠΎΠ½Π°Π»ΡŒΠ½Ρ–ΡΡ‚ΡŒ. Π’ΠΎΠ½ΠΈ Ρ–Π½ΠΊΠΎΠ»ΠΈ Π½Π°Π·ΠΈΠ²Π°ΡŽΡ‚ΡŒΡΡ наскрізна Π²Ρ–Π΄ΠΏΠΎΠ²Ρ–Π΄Π°Π»ΡŒΠ½Ρ–ΡΡ‚ΡŒ. createReactClass дозволяє Π²Π°ΠΌ використовувати застарілу систСму mixins.

Одним Ρ–Π· ΠΏΠΎΡˆΠΈΡ€Π΅Π½ΠΈΡ… Π²Π°Ρ€Ρ–Π°Π½Ρ‚Ρ–Π² використання Ρ” ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚, який Π±Π°ΠΆΠ°Ρ” ΠΎΠ½ΠΎΠ²ΠΈΡ‚ΠΈ сСбС Ρ‡Π΅Ρ€Π΅Π· дСякий ΠΏΡ€ΠΎΠΌΡ–ΠΆΠΎΠΊ часу. МоТна просто використовувати setInterval(), Π°Π»Π΅ Π²Π°ΠΆΠ»ΠΈΠ²ΠΎ скасувати Π΄Π°Π½ΠΈΠΉ процСс, ΠΊΠΎΠ»ΠΈ Π²Π°ΠΌ Π²Ρ–Π½ Π½Π΅ ΠΏΠΎΡ‚Ρ€Ρ–Π±Π΅Π½ Ρ‚Π° для Π΅ΠΊΠΎΠ½ΠΎΠΌΡ–Ρ— пам’яті. React Π½Π°Π΄Π°Ρ” ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈ ΠΆΠΈΡ‚Ρ‚Ρ”Π²ΠΎΠ³ΠΎ Ρ†ΠΈΠΊΠ»Ρƒ, які Π΄ΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ΡŒ дізнатися, ΠΊΠΎΠ»ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Π±ΡƒΠ΄Π΅ створСний Π°Π±ΠΎ Π·Π½ΠΈΡ‰Π΅Π½ΠΈΠΉ. Π”Π°Π²Π°ΠΉΡ‚Π΅ створимо простий міксин, який використовує Π΄Π°Π½Ρ– ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈ для простої Ρ„ΡƒΠ½ΠΊΡ†Ρ–Ρ— setInterval(), яка Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π½ΠΎ β€œΠΏΡ€ΠΈΠ±Π΅Ρ€Π΅ Π·Π° ΡΠΎΠ±ΠΎΡŽβ€, ΠΊΠΎΠ»ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Π±ΡƒΠ΄Π΅ Π·Π½ΠΈΡ‰Π΅Π½ΠΈΠΉ.

var SetIntervalMixin = {
  componentWillMount: function() {
    this.intervals = [];
  },
  setInterval: function() {
    this.intervals.push(setInterval.apply(null, arguments));
  },
  componentWillUnmount: function() {
    this.intervals.forEach(clearInterval);
  }
};

var createReactClass = require('create-react-class');

var TickTock = createReactClass({
  mixins: [SetIntervalMixin], // Використовуємо міксин
  getInitialState: function() {
    return {seconds: 0};
  },
  componentDidMount: function() {
    this.setInterval(this.tick, 1000); // Π’ΠΈΠΊΠ»ΠΈΠΊΠ°Ρ”ΠΌΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π½Π° міксині
  },
  tick: function() {
    this.setState({seconds: this.state.seconds + 1});
  },
  render: function() {
    return (
      <p>
        React ΠΏΡ€Π°Ρ†ΡŽΠ²Π°Π² {this.state.seconds} сСкунд.
      </p>
    );
  }
});

const root = ReactDOM.createRoot(document.getElementById('example'));
root.render(<TickTock />);

Π―ΠΊΡ‰ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ використовує Π΄Π΅ΠΊΡ–Π»ΡŒΠΊΠ° міксинів Ρ– Π²ΠΎΠ½ΠΈ Π²ΠΈΠ·Π½Π°Ρ‡Π°ΡŽΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ– ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈ ΠΆΠΈΡ‚Ρ‚Ρ”Π²ΠΎΠ³ΠΎ Ρ†ΠΈΠΊΠ»Ρƒ (Π½Π°ΠΏΡ€ΠΈΠΊΠ»Π°Π΄, Π΄Π΅ΠΊΡ–Π»ΡŒΠΊΠ° міксинів Ρ…ΠΎΡ‡ΡƒΡ‚ΡŒ Π²ΠΈΠΊΠΎΠ½Π°Ρ‚ΠΈ очистку ΠΊΠΎΠ»ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Π±ΡƒΠ΄Π΅ Π·Π½ΠΈΡ‰Π΅Π½ΠΈΠΌ), всі ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈ ΠΆΠΈΡ‚Ρ‚Ρ”Π²ΠΎΠ³ΠΎ Ρ†ΠΈΠΊΠ»Ρƒ Π±ΡƒΠ΄ΡƒΡ‚ΡŒ Π³Π°Ρ€Π°Π½Ρ‚ΠΎΠ²Π°Π½ΠΎ Π²ΠΈΠΊΠ»ΠΈΠΊΠ°Π½Ρ–. ΠœΠ΅Ρ‚ΠΎΠ΄ΠΈ, Π²ΠΈΠ·Π½Π°Ρ‡Π΅Π½Ρ– Π½Π° міксинах, Π·Π°ΠΏΡƒΡΠΊΠ°ΡŽΡ‚ΡŒΡΡ Π² порядку пСрСрахування міксинів після Π²ΠΈΠΊΠ»ΠΈΠΊΡƒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ Π½Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ–.