// App.jsx
import React, { useState } from 'react'
import Box1 from './components/Box1';
import Box2 from './components/Box2';
import Box3 from './components/Box3';
function App() {
console.log("App 컴포넌트가 렌더링 되었습니다.")
// 카운터 useState 만들기
const [count, setCount] = useState(0);
// 증가 버튼 함수
const onPlusButton = () => {
setCount(count + 1);
}
// 감소 버튼 함수
const onMinusButton = () => {
setCount(count - 1);
}
return (
<div style={{marginLeft: '110px', marginTop: '110px'}}>
<h3>카운트 예제입니다!</h3>
<p>현재 카운트 : {count}</p>
// 버튼에 증감 버튼 먹여주기
<button onClick={onPlusButton}>+</button>
<button onClick={onMinusButton}>-</button>
<div style={{display: 'flex', marginTop: '10px'}}>
<Box1 />
<Box2 />
<Box3 />
</div>
</div>
)
}
export default App
// Box1.jsx
import React from 'react'
const style = {
width: '100px',
height: '100px',
backgroundColor: '#01c49f',
color: 'white',
}
function Box1() {
console.log("Box1 컴포넌트가 렌더링 되었습니다.")
return (
<div style={style}>Box1</div>
)
}
export default Box1;
// Box2.jsx
import React from 'react'
const style = {
width: '100px',
height: '100px',
backgroundColor: '#4e93ed',
color: 'white',
}
function Box2() {
console.log("Box2 컴포넌트가 렌더링 되었습니다.")
return (
<div style={style}>Box2</div>
)
}
export default Box2;
// Box3.jsx
import React from 'react'
const style = {
width: '100px',
height: '100px',
backgroundColor: '#c491be',
color: 'white',
}
function Box3() {
console.log("Box3 컴포넌트가 렌더링 되었습니다.")
return (
<div style={style}>Box3</div>
)
}
export default Box3;
export default React.memo(Box1);
export default React.memo(Box2);
export default React.memo(Box3);
// App.jsx
import React, { useCallback, useState } from 'react'
import Box1 from './components/Box1';
import Box2 from './components/Box2';
import Box3 from './components/Box3';
function App() {
console.log("App 컴포넌트가 렌더링 되었습니다.")
const [count, setCount] = useState(0);
const onPlusButton = () => {
setCount(count + 1);
};
const onMinusButton = () => {
setCount(count - 1);
};
// 초기화 버튼 함수 만들기
const initCount = () => {
setCount(0);
};
return (
<div style={{marginLeft: '110px', marginTop: '130px'}}>
<h3>카운트 예제입니다!</h3>
<p>현재 카운트 : {count}</p>
<button onClick={onPlusButton}>+</button>
<button onClick={onMinusButton}>-</button>
<div style={{display: 'flex', marginTop: '10px'}}>
// Box1 컴포넌트로 데이터 넘겨주기
<Box1 initCount={initCount}/>
<Box2 />
<Box3 />
</div>
</div>
)
}
export default App
// Box1.jsx
import React from 'react'
const style = {
width: '100px',
height: '100px',
backgroundColor: '#01c49f',
color: 'white',
}
// initCount 데이터 가져오기
function Box1({initCount}) {
console.log("Box1 컴포넌트가 렌더링 되었습니다.")
return (
<div style={style}>
// onClick에 initCount 함수 먹여주기
<button onClick={()=>{
initCount();
}}>초기화</button>
</div>
)
}
// 렌더링이 되지 않도록 React.memo는 유지
export default React.memo(Box1);
???
렌더링이 되지 않도록 React.memo는 유지했는데 증감버튼을 누르면 Box1 컴포넌트도 함께 렌더링 되는 것을 볼 수 있다.
함수형 컴포넌트를 사용했기 때문에 Box1 컴포넌트에 React.memo가 되어있음에도 불구하고 카운터가 올라갈때마다 렌더링이 되는 것을 알 수 있다.
이게 무슨 말이냐 하면..
const initCount = useCallback(() => {
setCount(0);
}, []);
const initCount = useCallback(() => {
console.log(`${count}에서 0으로 변경되었습니다.`)
setCount(0);
}, []);
const initCount = useCallback(() => {
console.log(`${count}에서 0으로 변경되었습니다.`)
setCount(0);
}, [count]);
// App.jsx
import React from 'react'
import HeavyComponent from './components/HeavyComponent'
// heavy work -> 엄청 무거운 작업
function App() {
return (
<>
<nav style={{
backgroundColor: 'yellow',
marginBottom: '30px',
}}>네비게이션 바</nav>
<HeavyComponent />
<footer style={{
backgroundColor: 'green',
marginBottom: '30px',
}}>푸터 영역이에요.</footer>
</>
)
}
export default App
// HeavyComponent.jsx
import React, { useState } from 'react'
function HeavyComponent() {
const [count, setCount] = useState(0)
const heavyWork = () => {
for(let i=0; i<200000000000000; i++)
return 100;
}
const value = heavyWork();
return (
<>
<p>나는 엄청 무거운 컴포넌트야!</p>
<button onClick={()=>{setCount(count+1)}}>누르면 아래 count가 올라가요!</button><br />
{count}
</>
)
}
export default HeavyComponent
// useMemo import 잊지말기!
import React, { useState, useMemo } from 'react'
function HeavyComponent() {
const [count, setCount] = useState(0)
const heavyWork = () => {
for(let i=0; i<200000000000000; i++)
return 100;
}
// heavyWork()를 useMemo로 감싸고 , 뒤에 의존성 배열까지 넣어주면 된다.
const value = useMemo(() => heavyWork(), [])
return (
<>
<p>나는 엄청 무거운 컴포넌트야!</p>
<button onClick={()=>{setCount(count+1)}}>누르면 아래 count가 올라가요!</button><br />
{count}
</>
)
}
export default HeavyComponent
🙄😵😫😖🤯
갈 길이 먼데 머릿 속에 새로운 것을 하나 집어 넣는 것도 몇 시간동안 붙잡고 있어야 하니 조급해지지만.. 멘탈 관리 잘하자!😆