Добавить новость

Что такое добавление новости?

  1. Это форма, в которую мы вводим необходимые данные.

  2. Это "лента новостей", которая отображает наши данные.

У данной задачи есть масса вариантов решения. Мы начнем с канонического варианта: в общем родителе (<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.

Проверим:

add news log inside app

Шаг 4: из <Add /> будем передавать объект с новостью.

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

Проверим?

add news error

Окей, перед нами отличный кейс (реальный рабочий случай).

Во-первых: мы были почти прилежными учениками и сделали propTypes, для <Article />. Из ошибки сразу понятно: мы не передаем значение author (потому что, мы передаем name).

Во-вторых: мы все же накосячили, и забыли добавить в propTypes для <Article /> свойство id. Хорошо, что кода мало и ошибка сразу нашлась. Не забывайте про перечисление всех свойств в propTypes - это супер шпаргалка.

В-третьих: мы из <Add /> не передаем id и bigText.

Тем не менее, нельзя не отметить, что мы добавили динамики в наше приложение! Новость добавляется, причем счетчик новостей работает (а мы его вообще не трогали). Кто уже празднует - молодец, но кто хочет пофиксить все ошибки и сдать работу на пять - милости прошу в заключительный пункт основного курса.

Работа над ошибками

Я бы хотел, чтобы все это вы пофиксили сами. Но, чтобы не быть автором, который "оп-па, косяк, давайте-ка я отдам это вам на домашку", я все сделаю и опишу. Просто попробуйте. У вас получится. Практика решает. Обязательно всегда практикуйтесь для закрепления материала.

Задача:

  • добавить в форму добавления textarea для bigText;

  • передавать author;

  • передавать id (можно сделать через timestamp (отметку времени в ms): +new Date()). Для обучающего примера будет достаточно;

  • исправить propTypes в <News />

news added

Решение:

Полный код того, что находится в <body /> (с комментариями о последних изменениях)

Готово!

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

Last updated

Was this helpful?