5 способов избежать повторного рендеринга React-компонентов.

5 способов избежать повторного рендеринга React-компонентов.

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

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

1. Использование React.memo

React.memo – это высокоуровневый компонент React, который оборачивает функциональный компонент и предотвращает его повторный рендеринг, если пропсы компонента не изменились. Это достигается путем сравнения пропсов предыдущего и текущего рендеринга с помощью поверхностного сравнения (shallow equality).

Вот простой пример использования React.memo:

jsx

import React from ‘react’;

const MyComponent = React.memo(({ data }) => {
console.log(‘Рендеринг MyComponent’);

return

{data}

;
});

export default MyComponent;

В этом примере MyComponent будет перерендериваться только в том случае, если значение data изменилось между рендерингами.

2. Использование shouldComponentUpdate в классовых компонентах

Если вы работаете с классовыми компонентами в React, вы можете переопределить метод shouldComponentUpdate для предотвращения ненужного повторного рендеринга. Этот метод вызывается перед рендерингом компонента и позволяет вам контролировать, должен ли компонент перерендериваться или нет.

Вот пример реализации shouldComponentUpdate:

jsx

import React from ‘react’;

class MyComponent extends React.Component {
shouldComponentUpdate(nextProps, nextState) {
// Проверяем, изменились ли пропсы или состояние
return (
nextProps.data !== this.props.data ||
nextState !== this.state
);
}

render() {
console.log(‘Рендеринг MyComponent’);

return

{this.props.data}

;
}
}

export default MyComponent;

В этом примере компонент MyComponent перерендерится только в том случае, если значение data или состояние компонента изменились.

3. Использование React.PureComponent

React.PureComponent – это базовый класс, предоставляемый React, который реализует метод shouldComponentUpdate с помощью поверхностного сравнения пропсов и состояния. Это позволяет автоматически предотвращать ненужные повторные рендеринги компонентов, если их пропсы и состояние не изменились.

Вот пример использования React.PureComponent:

jsx

import React from ‘react’;

class MyComponent extends React.PureComponent {
render() {
console.log(‘Рендеринг MyComponent’);

return

{this.props.data}

;
}
}

export default MyComponent;

В этом примере MyComponent наследуется от React.PureComponent, что автоматически предотвращает повторный рендеринг, если пропсы и состояние компонента не изменились.

4. Использование мемоизированных обработчиков событий

Одной из распространенных причин ненужного повторного рендеринга является передача новых обработчиков событий (event handlers) при каждом рендеринге компонента. Это может привести к бесконечному циклу повторных рендерингов, так как React будет считать компонент измененным из-за нового обработчика события.

Читайте также  Улучшение пользовательского опыта с помощью CSS-селектора :focus-within

Чтобы избежать этого, вы можете использовать мемоизированные обработчики событий с помощью хука useCallback или метода bind в классовых компонентах.

Вот пример использования useCallback для мемоизации обработчика события:

jsx

import React, { useCallback } from ‘react’;

const MyComponent = ({ data, handleClick }) => {
console.log(‘Рендеринг MyComponent’);

const memoizedHandleClick = useCallback(() => {
handleClick(data);
}, [data, handleClick]);

return

{data}

;
};

export default MyComponent;

В этом примере memoizedHandleClick будет пересоздаваться только в том случае, если значения data или handleClick изменились, что предотвращает ненужный повторный рендеринг.

5. Использование усечения циклов рендеринга

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

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

Вот пример использования shouldComponentUpdate для усечения цикла рендеринга:

jsx

import React from ‘react’;

class MyComponent extends React.Component {
state = {
count: 0,
preventRendering: false,
};

componentDidUpdate(prevProps, prevState) {
if (prevState.count !== this.state.count) {
this.setState({ preventRendering: true });
}
}

shouldComponentUpdate(nextProps, nextState) {
return !this.state.preventRendering;
}

handleClick = () => {
this.setState((prevState) => ({
count: prevState.count + 1,
preventRendering: false,
}));
};

render() {
console.log(‘Рендеринг MyComponent’);

return (

Счетчик: {this.state.count}

Советы по созданию сайтов