Добавить новость
Что такое добавление новости?
Это форма, в которую мы вводим необходимые данные.
Это "лента новостей", которая отображает наши данные.
У данной задачи есть масса вариантов решения. Мы начнем с канонического варианта: в общем родителе (<App/>) будем хранить state с новостями. В компонент <Add /> будем передавать функцию (так как в props мы можем передавать что угодно), которая будет иметь доступ к state с новостями и которая в свою очередь будет добавлять новость в этот state.
Так как state у <App /> будет изменяться, все дети (в том числе и новостная лента <News />) будут перерисованы, а следовательно - мы увидим добавленную новость.
Взаимодействие из ребенка с родителем
Шаг 1: создадим состояние с новостями в <App /> (а следовательно, переделаем App из stateless в statefull):
class App extends React.Component {
state = {
news: myNews, // в начальное состояние положили значение из переменной
}
render() {
return (
<React.Fragment>
<Add />
<h3>Новости</h3>
{/* считали новости из this.state */}
<News data={this.state.news} />
</React.Fragment>
)
}
}Что примечательно, мы изменили источник данных для <News />, но компонент работает как ни в чем не бывало. Удобно!
Шаг 2: передадим функцию-обработчик в Add
Шаг 3: вызовем функцию из <Add />, не забудем про PropTypes.
Проверим:

Шаг 4: из <Add /> будем передавать объект с новостью.
Шаг 5: полученный объект будем записывать на первое место в массиве с новостями в <App />. Разумеется, массив будем обновлять через setState.
Проверим?

Окей, перед нами отличный кейс (реальный рабочий случай).
Во-первых: мы были почти прилежными учениками и сделали propTypes, для <Article />. Из ошибки сразу понятно: мы не передаем значение author (потому что, мы передаем name).
Во-вторых: мы все же накосячили, и забыли добавить в propTypes для <Article /> свойство id. Хорошо, что кода мало и ошибка сразу нашлась. Не забывайте про перечисление всех свойств в propTypes - это супер шпаргалка.
В-третьих: мы из <Add /> не передаем id и bigText.
Тем не менее, нельзя не отметить, что мы добавили динамики в наше приложение! Новость добавляется, причем счетчик новостей работает (а мы его вообще не трогали). Кто уже празднует - молодец, но кто хочет пофиксить все ошибки и сдать работу на пять - милости прошу в заключительный пункт основного курса.
Работа над ошибками
Я бы хотел, чтобы все это вы пофиксили сами. Но, чтобы не быть автором, который "оп-па, косяк, давайте-ка я отдам это вам на домашку", я все сделаю и опишу. Просто попробуйте. У вас получится. Практика решает. Обязательно всегда практикуйтесь для закрепления материала.
Задача:
добавить в форму добавления textarea для bigText;
передавать author;
передавать id (можно сделать через timestamp (отметку времени в ms):
+new Date()). Для обучающего примера будет достаточно;исправить propTypes в
<News />

Решение:
Полный код того, что находится в <body /> (с комментариями о последних изменениях)
Готово!
Исходный код на данный момент.
Last updated
Was this helpful?