Использование state

ОБНОВЛЕНИЕ 2018: в учебнике хорошая теория, но ему уже два года. Проверяйте версии пакетов. За выходом нового учебника можно следить в telegram канале или twitter

На канале так же проводятся бесплатные вебинары, публикуются переводы и авторские материалы, присоединяйтесь!

Использование state

Вернемся от теории к практике, покликаем по ссылкам-кнопочкам, поизменяем свойства компонентов...

Упс, простите. Как вы помните, свойства (this.props) следует использовать только для чтения, а для динамических свойств нужно использовать так называемое "состояние" (state).

Итак, встречайте - this.state ;)

Так как мне нужно в этом разделе сохранить минимум теории и больше практики, сразу перейдем к делу. Предлагаю вместе решить следующую задачу: у новости есть ссылка "подробнее", по клику на которую - бинго, текст новости целиком.

Начнем с изменения данных:

var my_news = [
  {
    author: 'Саша Печкин',
    text: 'В четчерг, четвертого числа...',
    bigText: 'в четыре с четвертью часа четыре чёрненьких чумазеньких чертёнка чертили чёрными чернилами чертёж.'
  },
  {
    author: 'Просто Вася',
    text: 'Считаю, что $ должен стоить 35 рублей!',
    bigText: 'А евро 42!'
  },
  {
    author: 'Гость',
    text: 'Бесплатно. Скачать. Лучший сайт - http://localhost:3000',
    bigText: 'На самом деле платно, просто нужно прочитать очень длинное лицензионное соглашение'
  }
];

Затем, научимся отображать полный текст новости сразу после вводного текста:

Опять же, больше ничего изменять не нужно. Данные корректно отобразятся.

Проверим...

big text screenshot

Отлично, можно продолжать работу: добавим ссылку - "подробнее". Приведу фрагмент кода:

Проверьте и если все ок - мы готовы к работе с состоянием компонента.

getInitialState

Если вы определяете какое-то изменяемое свойство в компоненте, необходимо указать начальное состояние (в терминологии react.js - initial state). Для этого, у компонента указывается метод getInitialState:

Посмотрим в консоли на вкладке React:

big text state screen

В состоянии (в state) появилось свойство. Будем использовать его в момент render'а.

Можно проверить в браузере, я лишь заострю внимание, что мы вновь использовали выражение в качестве значения css-класса у элемента (не забывайте пробел), а так же использовали одну и ту же переменную состояния в двух местах: теперь, когда мы научимся изменять состояние по клику (чуть ниже), если показывается большой текст - ссылка подробнее, наоборот, прячется.

Обработка кликов - onClick

Чтобы обработать клик, нам необходимо указать атрибут onClick у элемента.

В качестве обработчика у нас будет функция, которая изменяет состояние. Для изменения состояния, нужно обязательно использовать метод setState, а не просто перезаписывать значение переменной.

Проверьте в браузере, кликните на ссылку "подробнее".

--

Итого:

Для сохранения динамических свойств, используется состояние (state) компонента.

Для обработки клика, используется свойство onClick + функция-обработчик. Существуют и другие стандартные события, которые работают по такому же принципу. Полный список здесь, а мы будем знакомиться с ними по мере необходимости.

Для изменения состояния, используется метод setState, который принимает объект с аргументами, которые нужно изменить. Например, у нас есть состояние:

Чтобы изменить рейтинг, нужно написать следующий setState:

Чтобы изменить все три свойства:

Так же у setState есть возможность указать callback функцию, которая будет вызвана после того, как новое состояние "установится".

Напоследок, немного о стиле кода.

У ссылки "подробнее" получилась длинная строка, кому-то может понравится такой вариант:

Я не люблю длинные строки, поэтому оставлю второй вариант.

Исходный код на данный момент.

Last updated

Was this helpful?