Задать вопрос
@lexstile

Как оптимизировать списки при повторных рендрах?

Есть список категорий и блюд:
{positions.map(({ id, name, ref, dishes }) => (
              <InView key={id} threshold="0" rootMargin="-50% 0% -50% 0%" onChange={onChangeInView(id)}>
                <Group getRootRef={ref} header={<Header mode="secondary">{name}</Header>}>
                  <Div>
                    <Grid.Row>
                      {dishes.map((item) => (
                        <Grid.Col key={item.id} xs={6}>
                          <Position
                            position={item}
                            count={get(cart.positions, `${item.id}.quantity`, 0)}
                            onAddPosition={onAddPosition}
                            onRemovePosition={onRemovePosition}
                          />
                        </Grid.Col>
                      ))}
                    </Grid.Row>
                  </Div>
                </Group>
              </InView>
            ))}


Есть глупый компонент для отрисовки конкретной позиции:
export const Position = memo(({ position, count, onAddPosition, onRemovePosition }) => {...});


Проблема в том, что все позиции перерендериваются при изменении одной, что не должно быть.
Проблему решил через React.memo, что доказывает, что пропсы других аналогичных компонентов не изменяются.
Но как показалось, React.memo можно было избежать.
На что обратить внимание? Или другого способа решения данной проблемы в текущем кейсе нет?
  • Вопрос задан
  • 63 просмотра
Подписаться 1 Простой Комментировать
Помогут разобраться в теме Все курсы
  • Яндекс Практикум
    Мидл фронтенд-разработчик
    5 месяцев
    Далее
  • Javascript.ru
    Курс по React
    5 недель
    Далее
  • Нетология
    Fullstack-разработчик на Python + нейросети
    20 месяцев
    Далее
Решения вопроса 1
Alexandroppolus
@Alexandroppolus
кодир
Но как показалось, React.memo можно было избежать.

зачем? здесь оно в самый раз.

а вообще у тебя какая-то хрень в нейминге. По идее, компонент Position должен быть для каждого элемента массива positions. А то что у тебя называется Position, должно называться Dish, и тоже быть memo
т.е. так:
{positions.map(({ id, name, ref, dishes }) => <Position ... />)}


export const Position = memo(({ ...,  dishes, ... }) => {
.........
   {dishes.map((item) => <Dish ... />}
.....
});


тогда при изменении чего-то, например, внутри блюда, будет перерендер компонента со списком позиций, перерендер одной позиции с блюдом, и перерендер блюда.
Это минимум для иммутабельного стейта. Если хочешь совсем упороться и выкинуть перерендер списка, то mobx в помощь.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
ITK academy Нижний Новгород
от 50 000 до 90 000 ₽
IT ATLAS Москва
от 200 000 до 250 000 ₽
ITK academy Казань
от 50 000 до 90 000 ₽