React.propTypes
Last updated
Last updated
ОБНОВЛЕНИЕ 2018: в учебнике хорошая теория, но ему уже два года. Проверяйте версии пакетов. За выходом нового учебника можно следить в telegram канале или twitter
На канале так же проводятся бесплатные вебинары, публикуются переводы и авторские материалы, присоединяйтесь!
(скучный, но небольшой теоретический перекур)
Перед выполнением данного урока, не забывайте, что PropTypes не работает с production версией реакта. Эта фича только для разработки, так как валидация - дорогая операция.
Давайте сломаем наш код:
Обновим страницу - видим сообщение об ошибке.
В принципе, все понятно - мы пытаемся вызвать метод map у undefined. У примитива undefined, как известно никаких методов нет - ошибка, получите распишитесь. Хорошо, что кода мало и мы быстро выяснили в чем проблема. Еще лучше, что есть возможность улучшить наше положение, добавив propTypes - специальное свойство, которое будет "валидировать" наш компонент.
Внесите изменения в компонент <News />
Гораздо лучше! Исходя из текста ошибки нам сразу понятно куда копать: в render методе App, не указано свойство data, которое ожидается в News. Восстановим свойство data.
Вновь все работает, и наша консоль чиста.
Приведу выдержку из офф.документации:
Согласно этому листингу, мы можем перевести правило, указанное в компоненте <News />
:
React.PropTypes.array.isRequired
- свойство должно быть массивом и оно обязательно должно быть!
Я вижу по глазам некоторых (да-да, вижу), что все это какая-то бесполезная лабуда. Итак понятно - есть ошибка, есть возможность тыкнуть на нее в дебаггере и посмотреть. Специально для вас, следующая ситуация: удалите из массива my_news автора, например в третьем элементе:
Посмотрим результат:
Никаких ошибок. Но наше приложение не работает так как надо. Кто виноват? Реакт? Backend-программист который прислал нам такие данные?
Программист, может и виноват. Но реакт точно нет. У нас получилось, что в this.props.data.author
содержится undefined
(переменнная не определена). Поэтому react так и поступил, и показал нам "ничего" (на скриншоте это только "двоеточие").
Такую ошибку сложно отловить.
Добавьте propTypes в компонент <Article />
В таком случае вы получите сообщение об ошибке:
Разве это не прекрасно?
Исходный код на данный момент.
P.S. Не забудьте вернуть автора ;)
Обновите страницу: