Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Month 8/step 2 #4

Merged
merged 21 commits into from Jun 19, 2022
Merged

Month 8/step 2 #4

merged 21 commits into from Jun 19, 2022

Conversation

olegnyunkov
Copy link
Owner

No description provided.

@irinamozes
Copy link

irinamozes commented Jun 15, 2022

Проект очень неплохой.

Методы обращения к серверу имеют нужную структуру.

Все действия в проекте представлены как экшены, в том числе асинхронные.

Учитывается, что редьюсер должен быть чистой функцией, которая не может возвращать результат, зависящмий от неизвестных случайных величин.
Поэтому в редьюсере не формируется случайный уникальный идентификатор слоя.
Задача редьюсера - получить данные для изменения стейта, внести эти изменения в новый стейт и вернуть новый стейт, сохранив старый, чтобы React мог определить, нужно ему перерисовывать какие-либо компоненты, сравнив эти стейты.

Что нужно исправить.

  1. В компоненте BurgerIngredients нужно при рендере списка ингредиентов методом map (в левой части главной страницы) использовать в качестве значения атрибута key идентификатор ингредиента _id. Сейчас при задании
    рандомного значения атрибута key (nanoid), происходит явно большее число перерисовок элементов списка, чем могло бы быть.
    Но, то, что Вы создаёте уникальный номер для каждого слоя бургера - это правильно.

  2. Не совсем верно реализовано перемещение слоёв в бургере. У Вас перемещаемый и целевой слой меняются местами, а нужна сортировка слоёв, а не перемена их местами.
    Алгоритм сортировки слоёв в конструкторе должен быть такой: если пользователь хочет какой-то ингредиент поставить на место другого ингредиента, он должен перемещаемый ингредиент совместить с целевым ингредиентом и осуществить бросок. После этого, другие ингредиенты вместе с целевым смещаются вниз на один слой (если
    перемещаемый ингредиент двигался с низу), а перемещаемый ингредиент встаёт на место целевого ингредиента. Точно также ингредиенты смещаются вверх, если перемещаемый ингредиент был расположен сверху по отношению к целевому.

  3. При перемещении слоёв в бургере (возможно, когда в бургере есть одинаковые ингредиенты) появляются сообщения dnd об ошибках в консоли (см. снимок).
    Снимок экрана в 2022-06-15 19-02-31

  4. При открытии окна с номером заказа появляется сообщения об ошибках в консоли (см. снимок).
    Снимок экрана в 2022-06-15 19-04-40

Нужно устранить ошибки.

@olegnyunkov
Copy link
Owner Author

Ирина, спасибо за ревью.
По 3й ошибке столкнулся с проблемой, которую не смог решить. Нагуглил подобную,
react-dnd/react-dnd#236
но моих знаний пока не хватило разобраться. Что то связанное с быстрым рендерингом и его замедлением.
Ниже там ссылка на чей то пулреквест, в котором вышли из ситуации заменой hover на drop. Сделал пока так же.
Буду рад дальнейшей проверке и замечаниям)

@irinamozes
Copy link

Здравствуйте, Олег.

Сейчас, при работе Вашего проекта, ошибки в консоли у меня не выдавались - ни ошибки dnd, ни ошибки при открытии окна с номером заказа.

Но, чтобы проект работал совсем стабильно (возможно это решит и проблему, о которой говорилось в сообщении dnd от предыдущей проверки),

нужно исправить:

  1. Функция nanoid() не должна выполняться при рендере списка слоёв бургра методом map.
    Уникальный случайный номер, созданный nanoid(), должен присваиваться новому слою в бургере, но при рендере и сортировке слоёв в бургере этот номер уже у конкретного слоя должен быть постоянным. Сейчас nanoid() выполняется для каждого слоя при каждом перемещении какого-либо слоя, чего не должно быть (извините, не сообразила при предыдущей проверке).
    Поэтому, уникальный номер нового слоя должен формироваться с помощью nanoid() в обработчике события перетаскивания ингредиента из окна ингредиентов в бургер, и затем становиться постоянным идентификатором этого слоя, подобно идентификатору _id ингредиента.
    То есть, если обозначить уникальный идентификатор слоя бургера как uniqId, то вместо Вашего кода для элемента списка в методе map компоненты BurgerConstructor, должно быть:
<BurgerConstructorFilling
  key={uniqId}
  filling={filling}
  fill={fill}
  id={uniqId}
  index={index}
/>

Исправьте это замечание, пожалуйста.

@irinamozes
Copy link

Сейчас сортировка слоёв в бургере визуально стала работать более чётко.

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

Что нужно исправить.

  1. Как я писала при прошлой проверке: "уникальный номер нового слоя должен формироваться с помощью nanoid() в обработчике события перетаскивания ингредиента из окна ингредиентов в бургер". То есть, этот номер должен формироваться не в редьюсере (хотела об этом напомнить Вам в предыдущем ревью, но подумала, что Вам об этом говорили).
    Редьюсер должен быть чистой функцией, которая не может возвращать результат, зависящий от неизвестных случайных величин.
    Чистая функция может работать только со значениями своих параметров, и возвращать во внешнюю область объекты (state), сформированные только с помощью поступивших в неё значений параметров.
    Поэтому в редьюсере нельзя формировать случайный уникальный идентификатор слоя бургера. Этот уникальный идентификатор должен поступать в редьюсер в payload экшена.
    Задача редьюсера - получить данные для изменения стейта, внести эти изменения в новый стейт и вернуть новый стейт, сохранив старый, чтобы React мог определить, нужно ему перерисовывать какие - либо компоненты, сравнив эти стейты.
    Поэтому формировать с помощью nanoid уникальный идентификатор нового слоя нужно в функции drop(item), которая
    посылает экшен добавления ингредиента (dispatch(addConstructorItem(item))) , в компоненте BurgerConstructor.

@olegnyunkov
Copy link
Owner Author

Ирина, спасибо за ревью, кажется я наконец то понял принцип работы с id. )

@irinamozes
Copy link

Проект стал отличным!

Только нужно обязательно инструкцию const uId = nanoid() внести в функцию drop(item), чтобы уникальный идентификатор вычислялся только при добавлении ингредиента в бургер, а не каждый раз при перерисовке компоненты BurgerConstructor.
То есть функцию drop(item) нужно записать в виде:

drop(item) {
  const uId = nanoid()
  dispatch(addConstructorItem(item, uId));
}

См. снимок редактора VScode с копией Вашего проекта:
Снимок экрана в 2022-06-18 23-49-28

Задание принимается.

Желаю дальнейших успехов в учёбе и удачи!

@olegnyunkov olegnyunkov merged commit 05f49e3 into main Jun 19, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants