Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

Документы

Медиа

Назад
Вопрос про React: optimization, rerender, performance, usememo, usecallback

Как оптимизировать количество рендеров в React

Этот вопрос проверяет знание методов оптимизации производительности React приложений через сокращение количества ререндеров компонентов.

Короткий ответ

Оптимизация ререндеров в React достигается через несколько основных подходов: использование React.memo для мемоизации компонентов, применение useMemo и useCallback для кэширования значений и функций, правильное управление состоянием с помощью useReducer, разделение компонентов на более мелкие части, и оптимизацию контекста через мемоизацию. Также важно избегать создания новых объектов и функций в теле компонента, так как это приводит к лишним ререндерам.

Длинный ответ

Оптимизация количества ререндеров - ключевой аспект производительности React приложений.

Основные причины лишних ререндеров

  • Изменение props - даже если новые props фактически не изменились

  • Изменение state - обновление состояния компонента

  • Изменение контекста - обновление значения в Context API

  • Ререндер родителя - дочерние компоненты перерисовываются автоматически

Методы оптимизации

1. React.memo для мемоизации компонентов

jsx

const ExpensiveComponent = React.memo(function ExpensiveComponent({ data }) {
    // Компонент будет ререндериться только при изменении props
    return <div>{data}</div>;
});

2. useMemo для кэширования вычислений

jsx

function Component({ items }) {
    const expensiveValue = useMemo(() => {
        return items.filter(item => item.active)
                   .reduce((sum, item) => sum + item.value, 0);
    }, [items]); // Пересчитывается только при изменении items
}

3. useCallback для стабильных функций

jsx

function Parent() {
    const [count, setCount] = useState(0);
    
    const handleClick = useCallback(() => {
        setCount(prev => prev + 1);
    }, []); // Функция не пересоздается при каждом рендере
    
    return <Child onClick={handleClick} />;
}

4. Оптимизация работы с Context

jsx

const MyContext = React.createContext();

function ContextProvider({ children }) {
    const [state, setState] = useState({});
    
    const value = useMemo(() => ({
        state,
        updateState: setState
    }), [state]);
    
    return (
        <MyContext.Provider value={value}>
            {children}
        </MyContext.Provider>
    );
}

5. Разделение компонентов

jsx

// ПЛОХО: весь компонент ререндерится при изменении input
function UserProfile({ user }) {
    const [input, setInput] = useState('');
    
    return (
        <div>
            <h1>{user.name}</h1>
            <input value={input} onChange={e => setInput(e.target.value)} />
        </div>
    );
}

// ХОРОШО: input изолирован в отдельный компонент
function UserProfile({ user }) {
    return (
        <div>
            <h1>{user.name}</h1>
            <UserInput />
        </div>
    );
}

Практические стратегии

Избегайте создания объектов в render

jsx

// ПЛОХО: новый объект при каждом рендере
<Component style={{ color: 'red' }} />

// ХОРОШО: вынесено за пределы компонента или useMemo
const style = useMemo(() => ({ color: 'red' }), []);
<Component style={style} />

Используйте правильные зависимости

jsx

// Указывайте минимально необходимые зависимости
useEffect(() => {
    // эффект
}, [dependency1, dependency2]); // Только то, что действительно используется

Инструменты для отладки

  • React DevTools Profiler - анализ производительности компонентов

  • Why did you render - библиотека для отслеживания причин ререндеров

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

Уровень

  • Рейтинг:

    5

  • Сложность:

    8

Навыки

  • React

    React

Ключевые слова

#optimization

#rerender

#performance

#usememo

#usecallback

Подпишись на React Developer в телеграм