Что это такое?
Это код-ревью решений второго тестового задания. На видео отмечены удачные решения и указаны ошибки, а так же советы по их исправлению. В данной заметке отмечены общие проблемы и даны ссылки с "отметкой времени".
Общие проблемы
- Плохое Readme;
- Остаются eslint предупреждения, лишние
console.log
(redux-логгер не в счет); - Иконка Web не вынесен вперед (невнимательное чтение задачи);
- Иконка Web выносится вперед в компоненте (а лучше бы в редьюсере, или экшене);
- Пароль не очищается, если запрос вернулся с ошибкой;
- Submit кнопка в форме логина доступна, если поля пустые (или одно из полей);
- Submit кнопка в форме логина не поддерживает нажатие Enter;
- Нет деления на компоненты/контейнеры (не относится к тем, кто делил по другим подходам);
- URL-адрес для запросов на сервер полностью передается (нет оформления повторяющейся части строки в константу);
- Ошибка/уведомление "неправильное имя пользователя/пароль" — не очищается;
- Ошибка "неправильное имя пользователя/пароль" — выводится константой с сервера;
- Текст ошибки "захардкожен" в коде. Нет обращения в словарик по константе с сервера;
- Не удален "старый код", то есть такой код, который нигде не используется;
- Нет блока catch у промисов, нет обработки ошибок, если сервер отвечает не
ok
; - Компоненты размещены в node_modules;
- Отсутствуют или недостаточно подробно описаны Prop Types.
- Экшены и редьюсеры в куче в одном файле (или в одном все экшены, в другом все редьюсеры). Нет деления на "модули", то есть каждой сущности — свои экшены и свои редьюсеры;
Все решения с отметками по времени
Здесь указаны только ошибки, и не отмечены хорошие моменты, которых великое множество, поэтому крайне рекомендую посмотреть все подряд тем, кто считает себя "джуном" в разработке на react.
6m00s — Артур Донковцев Commit
7m40s — опечатка в названии функции
8m07s — асинхронные запросы не вынесены в экшены
10m07s — все экшены в одном файле. Нет деления на модули.
10m25s — вынос иконки (перебор данных) сделан в компоненте. Лучше в редьюсере или экшене.
12m28s — "прикольные" надписи. Лучше делать "нейтрально", чтобы затем подобные задания можно было сразу посылать работодателю.
13m05s — лишний экшен, указывающий что "загрузка" завершилась. То есть вместо трех экшенов: REQUEST / SUCCESS / STOP, можно уложиться в два: REQUEST / SUCCESS.
16m16s — Дмитрий Петров Commit
18m16s — использование var
18m34s — не вынесена часть URL адреса в константу
21m17s — плохое сообщение в коммите
22m15s — одинаковые названия экшенов.
24m16s — Кацура Владислав Commit
25m17s — (не ошибка) — данные приготовлены в редьюсере
27m38s — использование e.target
, лучше e.currentTarget
28m20s — ==
, а надо бы ===
28m33s — использование componentWillUnmount
29m00s (не ошибка) — рассуждение про "до серверную валидацию".
30m05s — код не отфморатирован (на любителя)
31m35s — использование "не универсального" обработчика, там где это уместно.
32m02s — Сергей Regies Linkas Commit
33m42s — нет экшена для прелоадера
34m30s — порядок методов в компоненте. (eslint плагин)
35m30s — не существующий PropTypes
35m57s — Кононов Виталий Commit
39m45s — не делаем то, что не интересно
40m31s — Евгений Санжиев Commit
41m20s (не ошибка) — словарик для работы с ошибками
42m46s — Виталий Набережный Commit
42m54s — не убраны тестовые данные
44m50s — Вениамин Трепачко Commit
Ачивка: очень классный дизайн.
47m42s — redux версия не полноценная.
47m57s — Ingvarr6 (Игорь) Commit
48m21s — нет 404 роута
51m30s — не очищается ошибка
54m48s — Роман Палесика Commit
55m30s — не хватает экшенов на загрузку/ошибку
56m49s — использование side-effects в редьюсере
58m10s — (не ошибка) вынос иконки web с помощью css (sick!)
59m15s — использование callback'a в setState, что приводит к лишней перерисовке. Лучше валидировать прямо в рендере.
61m01s — неуместное использование else if
62m13s — dsfcv d (boortcore) Commit
63m15s Константин Липский Commit
65m11s — в экшен передается URL целиком, лучше просто id передавать в данном варианте.
67m50s — сложное условие в shouldComponentUpdate, можно проще (сразу проверить на props.data и все)
69m32s — e.preventDefault
не первый в обработчике
71m50s — Ахметанов Альберт Commit
72m20s — компоненты в node_modules
73m15s — дублирование обращений к переменным
76m04s — privateRoute не вынесен в отдельный компонент
76m33s — сложный код для перемещения иконки web
76m56s — избыточное свойство loaded
77m35s — Аладьин Александр Commit
80m33s — ошибка не вынесена в словарик
81m43s — избыточное использование withRouter
83m04s — Dmitrii Shapovalenko Commit
84m58s — избыточное деление экшенов
85m55s — ошибка в названии lifecycle-метода
87m15s — семантически неверное использование тэга article
90m46s — лишний вызов метода массива
Автор: maxfarseer