Reputation: 21885
Consider the code :
APP.JS
import React, { useState, useMemo } from 'react';
import Counter from './components/Counter';
import './App.css';
function App() {
const [countA, setCountA] = useState(0);
const incrementA = () => {
setCountA(countA + 1);
};
// const memoCounter = useMemo(() => {
// return <Counter />;
// }, []);
return (
<div className='App'>
<h1>Incrementing CountA from APP.JS : {countA}</h1>
<p>
<button onClick={incrementA}>Increment A</button>
</p>
{/* {memoCounter} */}
<Counter />
</div>
);
}
export default App;
Counter.js :
import React, { useEffect } from 'react';
let renderCount = 1;
const Counter = () => {
useEffect(() => {
renderCount++;
});
return (
<div>
<h1>Rendering Counter component : {renderCount}</h1>
</div>
);
};
export default Counter;
When the user hits the button and increments , React renders Counter
component all over again , even though I don't pass anything to it.
However when I put useMemo
it doesn't.
Why ?
Upvotes: 1
Views: 43
Reputation: 53994
By default when a parent component renders (App
), it renders all its children (Counter
).
To overload the default behaviour, use React API like React.memo
:
const Counter = () => {...}
export default React.memo(Counter);
Upvotes: 2