Использование state
Вернемся от теории к практике: давайте покликаем по ссылкам-кнопочкам, поизменяем свойства компонентов...
Упс, не выйдет! Как вы помните, свойства (this.props) следует использовать только для чтения, а для динамических свойств нужно использовать так называемое "состояние" (state).
Итак, встречайте - this.state ;)
Так как мне нужно в этом разделе сохранить минимум теории и больше практики, сразу перейдем к делу. Предлагаю вместе решить следующую задачу: у новости есть ссылка "подробнее", по клику на которую - бинго, текст новости целиком.
Начнем с изменения данных:
Затем, научимся отображать полный текст новости сразу после вводного текста:
Опять же, больше ничего изменять не нужно. Данные корректно отобразятся.
Проверим...
Отлично, можно продолжать работу: добавим ссылку - "подробнее". Приведу фрагмент кода:
Проверьте и если все ок - мы готовы к работе с состоянием компонента.
Начальное состояние
С состоянием (state) можно работать только в statefull компонентах (class)
Если вы определяете какое-то изменяемое свойство в компоненте, необходимо указать начальное состояние (в терминологии react.js - initial state). Для этого, у компонента нужно просто определить свойство state:
Посмотрим в консоли на вкладке React:
В состоянии (в state) появилось свойство. Будем использовать его в момент render'а.
Формализуем задачу:
если значение this.state.visible === false -> рисуй "подробнее", не рисуй "большой текст";
если же this.state.visible === true -> не рисуй "подробнее", рисуй большой текст;
Будем использовать логическое выражение внутри JSX, значит - фигурные скобки, и внутри js-выражение.
Мы использовали одну и ту же переменную состояния в двух местах когда описывали обычное javascript выражение. Если вы не знакомы с И / ИЛИ, то рекомендую почитать у Кантора (Логические операторы).
Обратите внимание, для написания комментариев не понадобились дополнительные фигурные скобки, так как мы уже находились внутри "выражения" внутри JSX.
Можете проверить в браузере, и покликать на чекбокс внутри state зоны. Шаблон уже будет реагировать. А мы продолжим делать все это по-человечески, чтобы можно было кликать на "подробнее".
Обработка кликов - onClick
Чтобы обработать клик, нам необходимо указать атрибут onClick у элемента.
В качестве обработчика у нас будет функция, которая изменяет состояние. Для изменения состояния, нужно обязательно использовать метод setState, а не перезаписывать значение переменной в this.state напрямую.
Проверьте в браузере, кликните на ссылку "подробнее".
Каждый компонент <Article />
имеет свое состояние! Поэтому, при клике на подробнее в одном из компонентов, только его состояние изменяется, и только у этой новости отображается полный текст.
Итого:
Для сохранения динамических свойств, используется состояние (state) компонента.
Для обработки клика, используется свойство onClick + функция-обработчик. Существуют и другие стандартные события, которые работают по такому же принципу. Полный список здесь. Мы будем знакомиться с ними по мере необходимости.
Для изменения состояния, используется метод setState, который принимает объект с аргументами, которые нужно изменить. Например, у нас есть состояние:
Чтобы изменить рейтинг, нужно написать следующий setState:
Чтобы изменить все три свойства:
Так же у setState есть возможность указать callback функцию, которая будет вызвана после того, как новое состояние "установится".
Еще setState есть возможность... (на самом деле есть, но с нас пока хватит).
Посмотреть полный список возможностей setState можно в документации.
Исходный код на данный момент.
Last updated