React без ES6¶
Обычно компонент React определяется как простой JavaScript-класс:
1 2 3 4 5 |
|
Если вы ещё не работаете с ES6, то можете использовать модуль create-react-class
:
1 2 3 4 5 6 |
|
API ES6-классов похож на createReactClass()
за некоторыми исключениями.
Объявление пропсов по умолчанию¶
С помощью функций и классов ES6 defaultProps
определяется как свойство самого компонента:
1 2 3 4 5 6 7 |
|
При использовании createReactClass()
вам нужно определить метод getDefaultProps()
в переданном объекте:
1 2 3 4 5 6 7 8 9 |
|
Установка начального состояния¶
В ES6-классах вы можете определять начальное состояние через this.state
в конструкторе:
1 2 3 4 5 6 7 |
|
При использовании createReactClass()
вам придётся отдельно реализовать метод getInitialState
, который возвращает начальное состояние:
1 2 3 4 5 6 |
|
Автоматическая привязка¶
В компонентах React, объявленных как классы ES6, методы следуют той же семантике, что и обычные классы ES6. Это означает, что они сами по себе не связывают this
с экземпляром. Вам придётся явно использовать .bind(this)
в конструкторе:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
Если вы используете createReactClass()
, то это необязательно, так как все методы будут связаны:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
Это означает, что ES6-классы пишутся с чуть большим количеством однообразного кода для обработчиков событий, зато производительность громоздких приложений немного возрастает.
Если универсальный код для вас слишком неприглядный, вы можете включить экспериментальный синтаксис свойств класса с помощью Babel:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
Обратите внимание, что приведённый выше синтаксис является экспериментальным и может измениться. Возможно, предложенный синтаксис не войдёт в стандарт.
Существует несколько безопасных вариантов:
- привязывайте методы в конструкторе.
- используйте стрелочные функции, например,
onClick={(e) => this.handleClick(e)}
. - продолжайте использовать
createReactClass
;
Примеси¶
Примечание:
ES6 запущен без поддержки примесей. Поэтому React не поддерживает примеси с классами ES6.
Кроме того, мы нашли множество проблем в кодовых базах, используя примеси, и не рекомендуем использовать их в коде.
Этот раздел существует только для справки.
Иногда очень разные компоненты могут иметь общую функциональность. Иногда это называют сквозной функциональностью. createReactClass
позволяет использовать для этого устаревшую систему mixins
.
Одним из распространённых вариантов использования — когда вы собираетесь обновлять компонент через какой-то промежуток времени. Можно просто использовать setInterval()
, но важно отменить процесс, когда он больше не нужен, чтобы сэкономить память. React предоставляет методы жизненного цикла, которые позволяют узнать, когда компонент будет создан или уничтожен. Давайте применим эти методы и создадим небольшую примесь, которая предоставляет функцию setInterval()
и автоматически очищает мусор, когда компонент уничтожается.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
|
Если компонент использует несколько примесей и они определяют один и тот же метод жизненного цикла (т.е. хотят выполнить некоторую очистку при уничтожении компонента), все методы жизненного цикла гарантированно будут вызваны. Методы, определённые на примесях, запускаются в том порядке, в котором они перечислены, а затем вызывается метод самого компонента.