Как не перерисовывать родителя дочернего компонента?

У меня проблемы с повторным рендерингом, любая помощь очень ценится. Я попробовал использовать useMemo и useCallback, и это сломало флажок. У меня есть компонент, и внутри этого компонента я отображаю некоторую информацию в своем объекте. У меня есть, скажем, объект как таковой:

fakeObject = {
name: "rectangle"
width: 10
height: 20
visible: true
}

const fakeComponent = () => {
const [checked, setChecked] = React.useState(true);

  const handleChangeEvent = (event: React.ChangeEvent<HTMLInputElement>) => {
    setChecked(event.target.checked);
    fakeObject["visible"] = event.target.checked;
  };
return(
   <div>
   <h2> {fakeObject.name} </h2>
   <p> The height is {fakeObject.height} </p>
   <Checkbox
      checked = {checked}
      onChange = {handleChangeEvent}
      inputProps = {{ 'aria-label': 'controlled' }}
    />
  </div>
)
};

Проблема в том, что каждый раз, когда я нажимаю на свой флажок, он перерисовывает весь компонент. Это упрощенная версия моей проблемы, но я вижу, что компонент использует мой fakeObject и что флажок меняет это, но как мне сделать так, чтобы весь мой компонент не отображался повторно? Спасибо за любую помощь

Каждый раз, когда ваше состояние изменяется, компонент перерисовывается, и все компоненты, использующие это состояние, также перерисовываются. Вот что делает реакция.

Mohammed Shahed 15.11.2022 17:37

вы не можете, потому что checked является состоянием fakeComponent и поэтому вызывает повторный рендеринг

R4ncid 15.11.2022 17:37

похоже на дубликат stackoverflow.com/questions/54015086/…

ymz 15.11.2022 17:39

@ymz у меня немного наоборот? например, не перерисовывать родителя, а не перерисовывать дочерний элемент

Ikura 15.11.2022 17:57
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
4
62
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Родительский компонент будет повторно визуализирован, потому что вы сохраняете проверенное состояние родительского компонента с помощью useStateHook, если вы хотите избежать повторного рендеринга компонента, вы можете использовать memo, но вам нужно удалить хук там, где вы хотите избегать повторного рендера.

Ответ принят как подходящий

Как не перерисовывать родителя дочернего компонента?

Это возможно, но вам придется перенести всю логику, отвечающую за установку флажка, в дочерний компонент (Child).

const Checkbox = () => {
  const [checked, setChecked] = useState(false);
  console.info('child re-render');

  return (
    <input
      value = {checked}
      type = "checkbox"
      onChange = {() => setChecked((prev) => !prev)}
    />
  );
};

Тогда вам даже не нужно беспокоиться о memo.

Codesandbox: https://codesandbox.io/s/modest-star-y0z3xt?file=/src/App.js

Спасибо, это помогло в каком-то сценарии

Ikura 17.11.2022 03:59

Другие вопросы по теме