@iordania

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

Всем привет!

При подписке в разных компонентах на 1 контекст:
const objContext = { name: "Max", changeName: () => {} }


где в компоненте 1 я вывожу name:
const Component1 = () => {
  const { name } = useContext(objContext);

  return (
      <p>Name: {name}</p>
  );
};

а в компоненте 2 вызываю функцию которая в родителе меняет name:
const Component2 = () => {
  const { changeName } = useContext(objContext);

  return (
    <div>
      <button onClick={changeName}>Change name</button>
    </div>
  );
};


Как написано в доке к реакт:

Компонент, вызывающий useContext, всегда будет перерендериваться при изменении значения контекста.


Вопрос: можно ли избавить от лишнего рендера Component2 где просто вызывается функция на изменение имени которая по сути никак не меняется ?
  • Вопрос задан
  • 465 просмотров
Решения вопроса 1
Alexandroppolus
@Alexandroppolus
кодир
можно ли избавить от лишнего рендера Component2
нет, нельзя.
useContext забирает полное значение (и подписывается на него), которое всегда будет меняться при изменении name.

как вариант, можно не использовать useContext в Component2, а передавать туда мемоизованную changeName.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
profesor08
@profesor08
Будет вызвана рендер функция компонента, который передает в Context.Provider данные. Будет вызвана рендер функция каждого компонента, который где-то в потомках Context.Provider использует контекст. Потому что в провайдер ты каждый раз передаешь новую ссылку на объект с данными для контекста, а если не будешь передавать, то и реакции никакой и нигде не будет.

Для твоего случая подойдет mobx.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы