Загрузка...
Загрузка...
React.memo — это функция высшего порядка (Higher Order Component, HOC) в React, которая позволяет мемоизировать функциональные компоненты.
Она предотвращает лишние ререндеры, если пропсы не изменились.
Когда вы оборачиваете компонент в React.memo, React сравнивает текущие и предыдущие props (по умолчанию — поверхностно) и пропускает ререндер, если они остались прежними.
const MyComponent = React.memo((props) => {
// компонент
});
const Button = ({ onClick }) => {
console.log("🔁 Button rendered");
return <button onClick={onClick}>Click me</button>;
};
function App() {
const [count, setCount] = useState(0);
return (
<>
<Button onClick={() => console.log("clicked")} />
<button onClick={() => setCount(count + 1)}>+1</button>
</>
);
}
Даже при нажатии на +1, Button перерендерится, потому что создаётся новая функция onClick на каждом рендере.
const Button = React.memo(({ onClick }) => {
console.log("✅ Button rendered");
return <button onClick={onClick}>Click me</button>;
});
function App() {
const [count, setCount] = useState(0);
const handleClick = useCallback(() => {
console.log("clicked");
}, []);
return (
<>
<Button onClick={handleClick} />
<button onClick={() => setCount(count + 1)}>+1</button>
</>
);
}
Теперь Button не ререндерится, если handleClick не изменился.
Полезен, если:
Не нужен, если:
Props всегда разные (например, функция создаётся заново каждый раз без useCallback)Если нужно контролировать сравнение вручную:
React.memo(Component, (prevProps, nextProps) => {
return prevProps.value === nextProps.value;
});
Вывод:
React.memo помогает оптимизировать производительность, избегая ненужных ререндеров компонентов, если их props не изменились. Но использовать его стоит обдуманно и по необходимости.