Giter VIP home page Giter VIP logo

s's Introduction

Блок 1

1. Почему ['R'] === ['R'] === false?

Сравнение на равенство двух объектов (в том числе массивов) всегда возвращает false, так как происходит сравнение ссылок.

2. Плюсы использования const

Плюсы использования const/let в отличии от var.

  • Область видимости — блок. У var область видимости функция либо глобальная.

Пример:

function test() {
  let a = 123

  for (let i = 0; i < 1; i++) {
    let a = 0
    console.log(a)
  }

  console.log(a)
}

test()

Выведет в консоль 0, потом 123, так как создались две разые переменные, каждая в отдельной области видимости.

  • Если вызвать переменную, объявленную через const/let до ее создания, то возникнет ошибка (которая будет видна в консоли), что позволит найти ошибку в коде на более раннем этапе разработки.
  • При использовании в цикле, для каждой итерации создаётся своя переменная.

Пример:

function makeArmy() {

  let shooters = []

  for (let i = 0; i < 10; i++) {
    shooters.push(function () {
      console.log(i)
    })
  }

  return shooters
}

const army = makeArmy()

army.forEach((item) => {
  item()
})

В консоль выведутся числа от 0 до 9, так как для каждой итерации создаётся своя переменная и, как следствие, на каждой итерации произойдет замыкание для переменной i в функцию, которая добавляется в массив.

const в отличии от let не позволяет изменять переменную, что позволяет допустить меньше ошибок в коде.

3. Что отработает быстрее - setTimeout или Promise. И почему?

Промисы создают микрозадачи, а setTimeout макрозадачи. Микрозадачи выполняются раньше макрозадач. Следовательно, то, что было в обработчике промиса, выполнится раньше, чем то, что было в setTimeout.

4. Как прочитать http-only куки?

Только на сервере. Либо в инструментах разработчика.

5. Назовите 4 способа применить стили на компонент

  • CSS
  • Inline-стили
  • styled-components
  • CSS-модули

6. Как предотвратить лишние рендеры у функциональных компонентов?

  • Обернуть в memo
  • При необходимости обернуть в useCallback и в useMemo передаваемые пропсы
  • Создавать стейт и вызывать контекст как можно ниже в дереве компонентов (только там, где они нужны), чтобы лишние рендеры не происходили в компонентах, в которых этот стейт или контекст не используется.

7. Минусы использования Context API

  • При обновлении значений в контексте происходит рендер всех компонентов, лежащих ниже провайдера контекста в иерархии компонентов.
  • Можно нечаянно обратиться не к тому провайдеру (в случае, если компонент обернут в провайдер одного и того же контекста несколько раз)

Блок 2

  1. Create React App устарел.
  2. Пришлось установить npm-пакет uuid.
  3. Не следует грузить иконки отдельными запросами.
  4. Не следует создавать модалку в каждом элементе списка.
  5. Лучше использовать clsx или подобную библиотеку для динамических CSS-классов в угоду читаемости кода.
  6. Нужно выносить модалку за корневой элемент при помощи портала.
  7. https://github.com/surfstudio/frontend-interview-test_todo/blob/0f34efeac13406ca6ebdba36ef2ed6d96ea2e504/src/Modal/ModalCreateItem.tsx#L66
    Нечитаемый код. Стоит вынести в функцию. Кроме того, здесь баг.
    name
    ? () => {
        dispatch(
          isCategories
            ? categoriesAdded({ name, description })
            : tasksAdded({
                name,
                description,
                category: setSelected, // баг
              })
        );
        clearState();
        setActive(false);
      }
    : () => {}

Как можно поправить:

const onSubmit = () => {
  if (!name) {
    return;
  }

  dispatch(
    isCategories
      ? categoriesAdded({ name, description })
      : tasksAdded({
        name,
        description,
        category: selected, // selected вместо setSelected
      })
  );
  clearState();
  setActive(false);
}
  1. https://github.com/surfstudio/frontend-interview-test_todo/blob/0f34efeac13406ca6ebdba36ef2ed6d96ea2e504/src/Lists/ListItem.tsx#L55
    Обновлять стейт нужно через сеттер. Если бы на строке 24 был const, а не let, то было бы больше шансов не совершить данную ошибку.

  2. Не стоит добавлять модалку в DOM-дерево, если она закрыта.

  3. Следует убирать скроллбар при открытой модалке.

  4. Лучше не задавать фиксированную высоту для list-item, так как в нем может быть много текста.

  5. Стоит добавить для класса list-item-col2 правило flex-shrink: 0, чтобы кнопки всегда отображались горизонтально (запретить элементу с классом list-item-col2 сжиматься).

  6. Если в открытой модалке зажать левую кнопку мышки в текстовом поле, а затем перенести курсор вне модалки и отпустить мышку, то модалка закроется. Желательно это исправить для лучшего UX. Например, убрать вообще функцию закрытия при нажатии за модалку.

  7. Лучше называть редьюсеры в виде add, update, remove внутри слайсов, а экспортировать в виде addCategory, updateCategory, removeCategory и т. д. То есть использовать глаголы настоящего времени и учитывать контекст при именовании.

  8. Если перейти на несуществующую страницу, то можно создавать задачу, но список при этом останется пуст. Это вводит в заблуждение. Стоит либо делать редирект на страницу задач, либо не отображать хедер на несуществующей странице.

  9. Тесты не должны быть в src.

  10. https://github.com/surfstudio/frontend-interview-test_todo/blob/0f34efeac13406ca6ebdba36ef2ed6d96ea2e504/src/Lists/ListItem.tsx#L22
    Не следует объявлять переменные через запятую. Лучше использовать const, где только можно вместо let.

  11. https://github.com/surfstudio/frontend-interview-test_todo/blob/0f34efeac13406ca6ebdba36ef2ed6d96ea2e504/src/Lists/ListItem.tsx#L31
    Стоит создавать менее запутанные наименования классов.

  12. https://github.com/surfstudio/frontend-interview-test_todo/blob/0f34efeac13406ca6ebdba36ef2ed6d96ea2e504/src/App.css#L6
    Нужно описывать CSS правила в отдельных файлах для каждого компонента и подгружать в каждом компоненте свой CSS.

  13. https://github.com/surfstudio/frontend-interview-test_todo/blob/0f34efeac13406ca6ebdba36ef2ed6d96ea2e504/src/Modal/Modal.css#L16
    Здесь и еще во многих местах применяется комбинация селекторов. Это не по БЭМ.

  14. https://github.com/surfstudio/frontend-interview-test_todo/blob/0f34efeac13406ca6ebdba36ef2ed6d96ea2e504/src/Modal/ModalRow.tsx#L18
    Это обычный элемент, но зачем-то применяется синтаксис как для модификатора.

  15. label перекрывает текст в текстовых полях. Данную проблему можно решить при помощи fieldset.
    image

  16. https://github.com/surfstudio/frontend-interview-test_todo/blob/0f34efeac13406ca6ebdba36ef2ed6d96ea2e504/src/features/tasksSlice.ts#L57
    Лучше не выносить функцию в переменную rm. Аргументы i и arr не нужны. Крайне нежелательно объявлять переменные через запятую (в данном случае rm и rmTaskIndex), так как это сильно сказывается на читаемости. Можно просто уместить в одну строку:

    const rmTaskIndex = state.findIndex((el) => el.id === action.payload);
  17. https://github.com/surfstudio/frontend-interview-test_todo/blob/0f34efeac13406ca6ebdba36ef2ed6d96ea2e504/src/features/tasksSlice.ts#L64
    Здесь логичнее использовать forEach

  18. В модалке не нужно использовать теги header и footer

  19. Стоит продумать структуру проекта. Как минимальный вариант создать папку components и туда поместить все компоненты. Также для каждого компонента лучше создавать папку ComponentName, в которой находятся файлы ComponentName.tsx, ComponentName.css и index.ts.

s's People

Contributors

vladcyb avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.