최초 렌더링이 끝난 이후, 컴포넌트의 State가 바뀌면 해당 컴포넌트와 그의 자식 컴포넌트는 리렌더링됩니다.
useEffect(()=>{
// logic
})
useEffect(()=>{
// logic
},[state, props])
import React, { ReactElement, useEffect, useState } from 'react';
const Parent = ({ children }: { children: ReactElement }) => {
const [counter, setCounter] = useState(0);
useEffect(() => {
console.log('parent');
});
return (
<div>
<button onClick={() => setCounter((counter) => counter + 1)}>Count: {counter}</button>
{children}
</div>
);
};
const Child = () => {
useEffect(() => {
console.log('child');
});
return <div>Hello</div>;
};
function App() {
return (
<Parent>
<Child />
</Parent>
);
}
export default App;
import React, { useEffect, useMemo, useState } from 'react';
const Child = () => {
useEffect(()=>{
console.log('child')
})
return (
<div>Hello</div>
)
}
function App() {
const [counter1, setCounter1] = useState(0)
const [counter2, setCounter2] = useState(0)
useEffect(()=>{
console.log('parent')
})
const memoizedElement = useMemo(()=>{
return <Child/>
// eslint-disable-next-line react-hooks/exhaustive-deps
},[counter1])
return (
<div>
<button onClick={()=> setCounter1(counter => counter+1)}>Counter 1: {counter1}</button>
<button onClick={()=> setCounter2(counter => counter+1)}>Counter 2: {counter2}</button>
{memoizedElement}
</div>
);
}
export default App;
import React, { useCallback, useEffect, useState } from 'react';
const Child = React.memo(({ onClick }: any) => {
useEffect(() => {
console.log('child');
});
return <button onClick={onClick}>Counter 1</button>;
});
function App() {
const [counter1, setCounter1] = useState(0);
useEffect(() => {
console.log('parent');
});
const onClick = useCallback(() => {
setCounter1((counter1) => counter1 + 1);
}, []);
return (
<div>
<Child onClick={onClick} />
<p>{counter1}</p>
</div>
);
}
export default App;
참고자료