Вебинары

Разбор тестового задания 1 (второй заход, js решения)

В данной заметке отражены плюсы и минусы работ начинающих react-разработчиков. Вы можете подсмотреть как с одной и той же задачей можно справиться используя различные подходы.

Разбор данной задачи в решениях на TypeScript будет позже, следите за новостями в telegram канале

Общие пожелания:

  • Создавать компоненты без state с помощью функций (а не классов)
  • Логику проверки имени и пароля пользователя нужно выносить из компонента login или подобного
  • Кнопка для логина, должна быть заблокирована, пока форма не заполнена
  • Форма логина должна быть сверстана с помощью тэга form + обработка onSubmit, чтобы Enter работал
  • Выкладывайте demo
  • Пишите подробное README

Robert Zagidulin

Commit

Минусы

Логику проверки имени пользователя/пароля нужно вынести из компонента (в action creator).

index в качестве ключа — опасно. Так как у нас учебный пример, можно было добавить новости id и использовать его.

Жестко вбитые данные на странице профиля.

В редьюсерах нет информации о том, загружаются ли данные в данный момент. Как и нет action creators в целом. Нужно было сэмулировать работу через цикл: случился экшен, приехали даные, отрисовался компонент.

Нейтрально:

Использован подход с рендером через функцию, можно сделать PrivateRoute компонент, в итоге может оказаться удобнее и меньше символов.

Плюсы:

Для шаблона использован подход с отрисовкой children

Есть UI компоненты.

Любопытно:

Отрисовка полей формы через универсальную функцию


Бомбин Сергей

Commit

Минусы:

Мертвый код

Нет разделения на контейнеры и компоненты.

Плюсы:

Использованы хуки, например в LoginPage

Описаны propTypes

Использован сервис «тестовых новостей» — jsonplaceholder


Konstantin Filipenkov (Kos)

Минусы:

Повторюсь, про незаблокированную кнопку для Login формы, если данных нет (т.е. форма не валидная)

Есть pages/News (считай контейнер), но connect почему-то происходит в компоненте

Слишком нагло Автор, скорее всего хотел не запрашивать новости, если они уже запрошены, но к очередному заходу на новости — данные для этой страницы уже могли поменяться (если у нас реальный бэкэнд). Так же, можно почитать данный кусочек документации — What can I do if my effect dependencies change too often?

Нейтрально

Использован Fragment, можно просто <>

Универсальная отрисовка роутов (скорее плюс, чем нейтрально).

Плюсы:

Автофикс линтером вынесен в отдельный скрипт

Используется precommit

Использование html5 тэгов, например, main

Логика получения информации об авторизации вынесена из компонента. Используются cookies. Логика проверки имени пользователя/пароля так же вынесена.

В редьюсере присутствуют нужные поля (можно четко определить статус загрузки, ошибку, данные)

Axios настроен в API


Кирилл Прага

Commit

Минусы:

warning в консоли

Sign in кнопка на форме не работает

Не хватает информации в редьюсере/экшенах для асинхронной загрузки новостей.

Логику запроса новостей следует вынести из компонента

Если свойство обязательно, не забываем проставлять isRequired


Константин Сидоров

Yarn!

Commit

Нейтрально

Раз уж решились взяться за JSDoc формат комментариев, то хотелось бы видеть в них больше информации.

Используются styled-components (скорее плюс)

Используется formik

Чтобы избавиться от длинных ./../../../ в импортах, можно использовать alias.

Минусы

Зачем delete/get/set cookie разнесены в 3 директории?

Придираюсь, так как автор заморочился — в withLogin значения для регулярок, можно было бы вынести в константы, например VALID_USERNAME и VALID_PASSWORD, чтобы это выглядело более читаемо для других разработчиков.

В случае с проблемой загрузки новостей, вбрасывается ошибка (это плюс!), но она нигде не обрабатывается? Это же касается компонента новостей, если произошла ошибка, можно было бы показать кнопку: «запросить снова». Компонент новостей (и редьюсер) не готовы, чтобы отобразить ошибку.

Хорошая работа, почему без propTypes? Про тесты не спрашиваю

Плюсы

.eslintrc пожирнее

Использован reach-router

Реализация PrivateRoute

Для структуры проекта используется Atomic Design

Используется стороннее API для запроса новостей


Работа заслуживает внимания.


Баходир Кадыров

Минусы

Все файлы в одной куче, нет деления на умные/тупые компоненты.

Нет возможности асинхронной загрузки новостей

Нейтрально

Почему hashRouter?

Использование material-ui

Пожелания

Организовать структуру файлов/директорий. Добавить propTypes, добавить загрузку новостей в асихнронном варианте.


Roman (iromjkeecorporation)

На удивление многие используют jsonplaceholder

Минусы

У страницы новостей нет прелоадера

Не вынесен отдельный компонент NewsItem (для отрисовки одной новости).

Мертвый код

Плюсы

Проверка логина/пароля (checkCredentials) вынесена


Fyodor P

Master branch

Используется semantic-ui

Минусы

Варнинги в консоли.

Дизайн жестковат.

Подписка в компоненте новостей на весь state целиком

Название переменной, а где initialState2?

Не самые удачные названия экшенов, например TAKE_DATA ? Мы хотим получить данные, ок, но какие? Куда?

Мертвый код? Ниже нигде не используется this.textInput

Используется доступ к переменным через this.state, хотя выше они вынесены в const (невнимательность!)


noombasa

Commit

Используется redux-saga

Минусы

Текст сообщения в коммите

Нейтрально

Единорог

Плюсы

Но используются функциональные компоненты (плюс)

Присутствуют хэлперы (проверка имени пользователя, работа с LocalStorage)


Alexander (SonikDropout)

Commit

Используется react-bootstrap

Так как у многих этого сделано не было, хочу отметить здесь классический редьюсер с состоянием загрузки/ошибки/пришедших данных. Сюда же — классический асинхронный запрос за данными в action creator’e

Используется setState hook (плюс), но здесь стоит думать о том, что данные про юзера (правильный/неправильный логин пароль) придут к нам с сервера. Поэтому такая проверка здесь не прокатит.

Используется useEffect хук для запроса новостей.


Temir Adzhiahetov

Commit

Минусы

Новости предполагалось прокинуть через redux, но тут речь про мертвую переменную в state (isLoading)

При первой загрузке приложения, в шапке сразу же кнопка «Выйти» (хотя никто еще не заходил) и следовательно — страница профиля доступна без ввода данных.

Плохое именование переменных в LocalStorage

Const и Var в перемешку.

Для 3х и более if используем switch case!

Забытые console.log


Severin Aimo

Commit

Минусы

По сути, вся работа выполнена в одном коммите. Лучше, чтобы было несколько последовательных коммитов, так работодатель может проверить ваш навык работы с гитом.

Где «прогон через eslint» / разбивка на строки?

Нет загрузки новостей.

По названиям экшенов не очень понятно, что будет происходить.

Логику лучше отделять от компонентов, в нашем случае не только проверка пользователя, но и установка LS (лучше делать в едином месте, например в экшене)

Плюсы

PropTypes на месте, используется styled-components.


Толошный Д.А.

Пхп разработчик, перидоически пытаюсь ворватся в реакт-фронтенд, но что-то тяжко.

Commit

Минусы

Не указаны все зависимости (в частности, react-router-dom)

Предупреждения в консоли

В App.js больше 1го компонента, которые можно вынести.

Длинные строки (eslint?)

PropTypes доделать!

Лишний код

Забытые console.log

Пожелания

Внимательность, по redux — перечитать учебник и документацию.


Necelentano

Демо на codesandbox

Commit

Минусы

Классический пример контейнера новостей в котором не хватает прелоадера (минус), при том, что информация в редьюсере есть!

Нет необходимости в pages и containers. По сути, pages может быть контейнером.

Аккуратная работа, все нормально, но где, черт подери, propTypes?

Плюсы

Нет вопросов к реализации стора (редьюсеры ОК, экшены ОК). В константах все в порядке, но можно бы добавить namespace через слэш, например вместо LOGIN_REQUEST, login/REQUEST (это вкусовщина).

Проверка пользователя и логаут вынесены отдельно

Макс

Recent Posts

Elm #2: Загрузка и отображение json

Сегодня будем использовать parcel и IntelliJ IDEA Community Edition. Все инструменты бесплатные. Инициализация elm проекта…

5 лет ago

Elm для React/Redux разработчиков (Elm #1: Знакомимся с Elm)

На данном вебинаре мы знакомились с языком Elm проводя параллели между Elm и Redux, поэтому…

5 лет ago

Масштабируем Elm-приложение (конспект)

Richard Feldman рассказывает как масштабировать Elm приложение без боли. Показаны техники: extended records, подход narrow…

5 лет ago

Elm видео, за ноябрь 2019

В данной заметке вы найдете конспект видео по Elm, которые я посмотрел в ноябре 2019.…

5 лет ago

Итоги 2019. Что учить фронтендеру в 2020?

Итоги года 2019 // Max Frontend Покажи мне свой гитхаб, и я скажу работал ли…

5 лет ago

Почему мне стоит изучать Elm?

Почему стоит изучать Elm? Потому что это интересный вызов, редкие (но вкусные) вакансии и хороший…

5 лет ago