Как я могу предотвратить повторный рендеринг моего функционального компонента с помощью React memo или React hooks?

Когда hiddenLogo меняет значение, компонент перерисовывается. Я хочу, чтобы этот компонент повторно отображал никогда, даже если его свойства изменились. С компонентом класса я мог бы сделать это, реализовав sCU следующим образом:

shouldComponentUpdate() {
  return false;
}

Но есть ли способ сделать это с помощью React hooks/React memo?

Вот как выглядит мой компонент:

import React, { useEffect } from 'react';
import PropTypes from 'prop-types';

import ConnectedSpringLogo from '../../containers/ConnectedSpringLogo';

import { Wrapper, InnerWrapper } from './styles';
import TitleBar from '../../components/TitleBar';

const propTypes = {
  showLogo: PropTypes.func.isRequired,
  hideLogo: PropTypes.func.isRequired,
  hiddenLogo: PropTypes.bool.isRequired
};

const Splash = ({ showLogo, hideLogo, hiddenLogo }) => {
  useEffect(() => {
    if (hiddenLogo) {
      console.info('Logo has been hidden');
    }
    else {
      showLogo();

      setTimeout(() => {
        hideLogo();
      }, 5000);
    }
  }, [hiddenLogo]);

  return (
    <Wrapper>
      <TitleBar />
      <InnerWrapper>
        <ConnectedSpringLogo size = "100" />
      </InnerWrapper>
    </Wrapper>
  );
};

Splash.propTypes = propTypes;

export default Splash;
Поведение ключевого слова "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) для оценки ваших знаний,...
42
0
43 643
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

React.памятка — это то же самое, что и React.PureComponent.

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

Для компонентов класса:

class MyComponents extends React.PureCompoment {}

Для функциональных компонентов:

const Mycomponents = React.memo(props => {
  return <div> No updates on this component when rendering </div>;
});

Так что это просто создание компонента с React.memo

To verify that your component doesn't render you can just activate HightlightUpdates in react extension and check your components reaction on rendering

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

j.doe 01.03.2019 16:32

Переписать второй параметр memo в () => true;

DanteTheSmith 09.05.2019 14:22
Ответ принят как подходящий

Как сказал Г.азиз, React.memo работает аналогично чистому компоненту. Однако вы также можете настроить его поведение, передав ему функцию, которая определяет, что считается равным. По сути, это функция shouldComponentUpdate, за исключением того, что вы возвращаете true, если хотите, чтобы отображалась нет.

const areEqual = (prevProps, nextProps) => true;

const MyComponent = React.memo(props => {
  return /*whatever jsx you like */
}, areEqual);

Потрясающий! Спасибо!

j.doe 01.03.2019 16:39

Как мы можем выполнить глубокое сравнение реквизита?

HalfWebDev 09.08.2019 14:45

React.memo сравнивает только newProps и oldProps, как мы можем сравнить newState и oldState, чтобы решить, когда выполнять повторный рендеринг?

Quoc Van Tang 26.09.2019 02:17

@QuocVanTang хук useState выполнит собственную проверку, чтобы убедиться, что значение изменилось, и пропустит рендеринг, если это не так. Кроме этого, вы не можете предотвратить повторную визуализацию при установке состояния в функциональном компоненте. В зависимости от того, что делает ваш компонент, вы можете использовать useMemo или useCallback, чтобы пропустить некоторые вычисления при рендеринге.

Nicholas Tower 26.09.2019 03:26

Спасибо за ответ, я полагаю, если у нас есть oldState {xyz: 1}, тогда мы устанавливаем ему newState как равное значение {xyz: 1} (новый ссылочный объект, но равный при глубоком сравнении). На данный момент он все еще перерисовывается, потому что реагирующие хуки делают мелкое сравнение, поэтому я хочу пропустить повторный рендеринг для этого случая.

Quoc Van Tang 26.09.2019 04:01

Что касается React.memo, в документации говорится: «Этот метод существует только как оптимизация производительности. Не полагайтесь на него, чтобы «предотвратить» рендеринг, так как это может привести к ошибкам». (reactjs.org/docs/react-api.html#reactmemo). Кто-нибудь знает больше о том, какие ошибки могут возникнуть?

AlexJ 19.12.2019 20:15

Я думаю, что это (stackoverflow.com/a/61547432/839847) довольно хорошее обсуждение потенциальных затрат на использование React.memo - хотя обсуждение касается затрат на производительность, а не потенциальных ошибок.

bergie3000 16.01.2021 09:18

Мы можем использовать памятка для предотвращения рендеринга в функциональных компонентах только для целей оптимизации. Согласно документу React:

This method only exists as a performance optimization. Do not rely on it to “prevent” a render, as this can lead to bugs.

Согласно документации по реакции: - [https://reactjs.org/docs/react-api.html][1]

React. memo is a higher order component. If your component renders the same result given the same props, you can wrap it in a call to React. memo for a performance boost in some cases by memoizing the result. This means that React will skip rendering the component, and reuse the last rendered result.

Для практического понимания я наткнулся на эти два видео, они очень хороши, если вы также хотите прояснить концепции, лучше посмотреть, чтобы сэкономить ваше время.

Отказ от ответственности: - Это не мой канал на YouTube.

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