Видеоуроки, интерактивный редактор и сохранение прогресса — бесплатно, сразу после входа.
ВойтиСоздать аккаунт — бесплатноЗакончили урок?
Войдите, чтобы отмечать прогресс
Мы выделяем каждый логический кусок интерфейса в отдельный компонент.
Компонент CreatePost отвечает за поле ввода нового поста.
e.target.value — это текущее значение поля ввода. Когда пользователь печатает, onChange получает это значение через e.target.value и передаёт его в App.
PostHeader отображает автора.
Здесь author.avatar и author.name приходят через пропсы — они разные для каждого поста. А «2 часа назад» написано прямо в JSX, потому что это статичный текст, одинаковый для всех постов.
PostActions — кнопки лайка и комментариев.
Comments — блок с комментариями и полем ввода.
.trim() убирает пробелы в начале и конце строки. Без него пустой ввод с пробелами (" ") считается валидным — кнопка будет активна, а комментарий пустой. С .trim() проверяем реальное содержание.
Post — главный компонент, собирает всё вместе.
У Post — 6 пропсов. Это допустимо, потому что он сложный и собирает подкомпоненты.
Лучше не делать больше 7–8 пропсов в одном компоненте. Если их слишком много — значит, можно выделить ещё один уровень (например, отдельный PostContent).
Но 5–6 — нормально для "контейнерного" компонента.
В App — вся логика и состояние. Просто заменяем JSX на компоненты.
При рендере posts.map обязателен key={post.id} — React использует его для отслеживания изменений. Без ключа будет предупреждение и возможны ошибки при обновлении.