Рубрика развивается при поддержке
Разработка
Max Patsitansky
3853

Тестовое задание и code-review для новичков (frontend, react)

Привет будущим frontend-разработчикам (и некоторым бывалым).

В закладки

Мы (я и мой коллега Роман) проводим тестовое задание с разбором ваших ошибок. Сегодня мы анонсируем повторный запуск первого ТЗ (видео с прошлого разбора, но если вы планируете выполнять - не торопитесь смотреть).

Ключевой игрок - React. Задание подходит новичкам, не подходит опытным разработчикам [1].

[1] - для тех, кто с легкостью пишет на JS и React, предлагаем выполнить данное ТЗ на TypeScript и Reach router. А также вы можете дополнить выполнение Docker-образом. Получите новый опыт.

Участие бесплатное.

Что проверяем?

Начальные знания по React, Redux и роутингу. Текст задания.

Примерный результат

Порядок проведения

Вы выполняете задание и присылаете письмо со ссылкой на гитхаб. На разборе обсуждаются как коллективные ошибки, так и индивидуальные. Так же обсуждаются хорошие решения и выбираются топ-3 работы.

Плюсы:

  • вам указывают на ошибку
  • вам подсказывают решение
  • вы смотрите как эту же проблему решали другие участники

Минусы:

  • публичное порицание за халтуру (не путать с “непреднамеренными ошибками”)

Рекомендации к выполнению

Заполните README .md по образцу

После того как сделали, посмотрите подобный разбор (видео), исправьте ошибки.

Для тех, кто пишет на TS - используйте строгие правила:

  • noImplicitAny
  • noImplicitThis
  • alwaysStrict
  • strictNullChecks
  • strictFunctionTypes
  • strictPropertyInitialization

Подробнее здесь (EN).

Предоставьте ссылку на demo и добавьте оформление проекту.

Дедлайн

Прием работ заканчивается ровно через месяц: 11 апреля 2019 года. Не тормозите, изучение без практики невозможно.

Работы присылайте мне на почту (maxpfrontend@gmail.com) с темой письма: TZ #1 v2.0

Если есть вопросы - задавайте в комментариях.

Материал опубликован пользователем.
Нажмите кнопку «Написать», чтобы поделиться мнением или рассказать о своём проекте.

Написать
{ "author_name": "Max Patsitansky", "author_type": "self", "tags": ["1"], "comments": 8, "likes": 13, "favorites": 9, "is_advertisement": false, "subsite_label": "dev", "id": 60753, "is_wide": true, "is_ugc": true, "date": "Mon, 11 Mar 2019 12:37:33 +0300", "is_special": false }
Облачная платформа
Основа для цифровизации бизнеса
0
{ "id": 60753, "author_id": 263554, "diff_limit": 1000, "urls": {"diff":"\/comments\/60753\/get","add":"\/comments\/60753\/add","edit":"\/comments\/edit","remove":"\/admin\/comments\/remove","pin":"\/admin\/comments\/pin","get4edit":"\/comments\/get4edit","complain":"\/comments\/complain","load_more":"\/comments\/loading\/60753"}, "attach_limit": 2, "max_comment_text_length": 5000, "subsite_id": 235819, "last_count_and_date": null }
8 комментариев
Популярные
По порядку
Написать комментарий...
0

А можно сделать авторизацию пользователя через firebase?

Ответить
0

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

Ответить
0

Прочитал публикацию на habr, здесь уже все моменты разобраны, в т. ч. с TS и hooks. Что тогда еще остается сделать?

Ответить
0

Остается добавить Redux и переписать логику с хуков, на redux там, где нужно.

Ответить
0

Привет, при вызове внутри useEffect экшена который диспатчит в store массив новостей, при первой отрисовке страницы эффект вызывается 2 раза, в depends передаю ему длину массива, подскажи как избавиться от этого перерендера для новостей. https://github.com/AlekseyPn/react_study_app/tree/redux компонент News.

Ответить
0

Или нам не нужно в хуках этого делать в задании а просто прикрутить redux через statefull компоненты?

Ответить
0

Я думаю новости надо забирать redux-ом, процитирую:
While hooks are local, some state is global. And that means that state managers will always be your friend! (в переводе: пока хуки локальны, кое-что в стейте глобально. И это значит, что стейт-менеджер (Redux/mobx/etc..) все еще ваш друг)

Взял отсюда: https://frontarm.com/james-k-nelson/react-hooks-intuition/

Ответить
0

Спасибо, просто хотел попробовать все это подружить, но дружится кривовато :) меня не устраивает такой вариант, спасибо за инфу и пояснения :)

Ответить
{ "page_type": "article" }

Прямой эфир

[ { "id": 1, "label": "100%×150_Branding_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox_method": "createAdaptive", "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfl" } } }, { "id": 2, "label": "1200х400", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfn" } } }, { "id": 3, "label": "240х200 _ТГБ_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fizc" } } }, { "id": 4, "label": "Article Branding", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "p1": "cfovx", "p2": "glug" } } }, { "id": 5, "label": "300x500_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfk" } } }, { "id": 6, "label": "1180х250_Interpool_баннер над комментариями_Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "bugf", "p2": "ffyh" } } }, { "id": 7, "label": "Article Footer 100%_desktop_mobile", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjxb" } } }, { "id": 8, "label": "Fullscreen Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjoh" } } }, { "id": 9, "label": "Fullscreen Mobile", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjog" } } }, { "id": 10, "disable": true, "label": "Native Partner Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyb" } } }, { "id": 11, "disable": true, "label": "Native Partner Mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyc" } } }, { "id": 12, "label": "Кнопка в шапке", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "p1": "bscsh", "p2": "fdhx" } } }, { "id": 13, "label": "DM InPage Video PartnerCode", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox_method": "createAdaptive", "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "bugf", "p2": "flvn" } } }, { "id": 14, "label": "Yandex context video banner", "provider": "yandex", "yandex": { "block_id": "VI-223676-0", "render_to": "inpage_VI-223676-0-1104503429", "adfox_url": "//ads.adfox.ru/228129/getCode?pp=h&ps=bugf&p2=fpjw&puid1=&puid2=&puid3=&puid4=&puid8=&puid9=&puid10=&puid21=&puid22=&puid31=&puid32=&puid33=&fmt=1&dl={REFERER}&pr=" } }, { "id": 15, "label": "Баннер в ленте на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byudx", "p2": "ftjf" } } }, { "id": 16, "label": "Кнопка в шапке мобайл", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byzqf", "p2": "ftwx" } } }, { "id": 17, "label": "Stratum Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fzvb" } } }, { "id": 18, "label": "Stratum Mobile", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fzvc" } } }, { "id": 19, "disable": true, "label": "Тизер на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "p1": "cbltd", "p2": "gazs" } } }, { "id": 20, "label": "Кнопка в сайдбаре", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "p1": "cgxmr", "p2": "gnwc" } } } ] { "page_type": "default" }