React Memo рендерится каждый раз с одними и теми же реквизитами

Я пытался использовать React.memo в своем функциональном компоненте. Он принимает реквизиты от родительских компонентов. Но я передаю одни и те же реквизиты моему компоненту «memo». Он отображается каждый раз. То же самое происходит, когда я использую React.Purecomponent.

У меня есть переменная переключения в моем начальном состоянии.

React Memo рендерится каждый раз с одними и теми же реквизитами, когда я изменил размер окна, вызывается handleResize и мой заголовок сбрасывается. Это означает, что теперь мой переключатель false]

React Memo рендерится каждый раз с одними и теми же реквизитами. Я передал переключаемую переменную моему дочернему компоненту.

React Memo рендерится каждый раз с одними и теми же реквизитами А потом беру из реквизита.

React Memo рендерится каждый раз с одними и теми же реквизитами .. Извините, у меня есть опечатки в этом вопросе

пример пожалуйста; помните, что memo/PureComponent делает поверхностное сравнение

r g 15.02.2019 11:49

Возможно, вы захотите добавить немного кода, чтобы читатели могли его лучше понять.

Eliâ Melfior 15.02.2019 11:50

Пожалуйста, поделитесь фрагментами кода вместо изображений

Shubham Khatri 15.02.2019 12:34
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
5
3
4 073
2

Ответы 2

Вы каждый раз передаете реквизит новыйtoggleHamburger.

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

Для решения этой проблемы я бы рекомендовал хук useCallback() или, в вашем случае, метод, так как внешний компонент — это класс:

class ... {
  toggleHamburger = () => this.setState(({toggle}) => ({toggle: !toggle}));
  ...
    <HamburgerButton toggleHamburger = {this.toggleHamburger} />
}

Компонент, обернутый React.memo(), будет отображаться только один раз, если он вызывается с реквизитами такой же:

const Comp = React.memo(props => {
  console.info('Rendering...');
  return props.a;
});

const props = {a: 1};
const at = document.getElementById('app');
render();
render();
render();

function render() {
  console.info('Called render()'); 
  ReactDOM.render(<Comp {...props} />, at);
}
<div id = "app"></div>
<script src = "//unpkg.com/react/umd/react.production.min.js"></script>
<script src = "//unpkg.com/react-dom/umd/react-dom.production.min.js"></script>

Я не понимаю, что вы имеете в виду по этому поводу. Передача нового закрытия в качестве обработчика событий/обратного вызова каждый раз

Khoren Grigoryan 15.02.2019 13:50

@KhorenGrigoryan () => this.setState({ toggle: !toggle }) это создает новое замыкание (функцию), следовательно, каждый раз новую опору.

ᅙᄉᅙ 15.02.2019 13:52

И как лучше всего это сделать, на ваш взгляд?

Khoren Grigoryan 15.02.2019 14:00

@KhorenGrigoryan Обновил ответ с предложениями

ᅙᄉᅙ 15.02.2019 14:09

Спасибо чувак.. Работает ))) .. Последний вопрос. Почему, если я каждый раз создаю новый реквизит shouldComponentUpdate работает, а memo и pureComponent нет.

Khoren Grigoryan 15.02.2019 14:26

Ну, пожалуйста, опубликуйте свой shouldComponentUpdate() и посмотрим. Кстати, если это работает, не могли бы вы принять ответ?

ᅙᄉᅙ 15.02.2019 14:28

@KhorenGrigoryan Итак, это потому, что ваш shouldComponentUpdate() сравнивает только toggle опору, игнорируя toggleHamburger

ᅙᄉᅙ 15.02.2019 15:27

Круто... Большое спасибо.

Khoren Grigoryan 16.02.2019 18:25
    export default class extends Component {
  shouldComponentUpdate(nextProps) {
    const { toggle } = this.props;
    return nextProps.toggle !== toggle;
  }

  render() {
    console.info('Rendering ...');
    const { toggleHamburger, toggle } = this.props;
    return (
      <svg viewBox = "0 0 96 96" height = "1em" onClick = {toggleHamburger} {...{ style }}>
        <Motion
          style = {{
            x: spring(toggle ? 1 : 0, presets.wobbly),
            y: spring(toggle ? 0 : 1, presets.wobbly)
          }}
        >
          {({ x, y }) => (
            <g
              id = "navicon"
              fill = "none"
              stroke = "currentColor"
              strokeWidth = "14"
              strokeLinecap = "round"
              strokeLinejoin = "round"
            >
              <line
                transform = {`translate(${x * 12}, ${x * -7}) rotate(${x * 45}, 7, 26)`}
                x1 = "7"
                y1 = "26"
                x2 = "89"
                y2 = "26"
              />
              <line
                transform = {`translate(${x * 12}, ${x * 7}) rotate(${x * -45}, 7, 70)`}
                x1 = "7"
                y1 = "70"
                x2 = "89"
                y2 = "70"
              />
              <line
                transform = {`translate(${x * -96})`}
                opacity = {y}
                x1 = "7"
                y1 = "48"
                x2 = "89"
                y2 = "48"
              />
            </g>
          )}
        </Motion>
      </svg>
    );
  }
}

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