
Class Componnet์ ๋จ์ ์ ๋ณด์ํ๊ธฐ ์ํด ๋ํ๋จ
Class Component๋ function Component์ ๋นํด
์ด๋ ค์ด ๋ฌธ๋ฒ, ์ถ์ ๋ฐฉ์, Reloading์ ๋จ์ด์ง๋ ์ ๋ขฐ์ฑ, ์ต์ ๊ธฐ์ ์ ์ฉ์ ๋ถ๋ฆฌํจClass Componente๋ Lifecycle methods, state ์ ๊ณต ๊ทธ๋์ Function Component๋ ๋น๊ต์ ๊ฐ๋จํ๊ธฐ ๋๋ฌธ์ ์ด์ ๊ด๋ จ๋ method๊ฐ ์์์=
const [state(๋ณ์๋ช
), setState(setํจ์๋ช
)] = useState(์ด๊ธฐ๊ฐ);
import React, {useState} from 'react';
//useState ํธ์ถํ๊ธฐ
function Example(props) {
const [ count, setCount]=useState(0);
//useState ์ ์ธํ๊ธฐ , 'count'๋ผ๋ ์๋ก์ด ์ํ ๊ฐ์ ์ ์
// ์ธ์๋ก ์ด๊น๊ฐ ๋ฐ๊ธฐ
return (
<div>
<p>์ด {count}๋ฒ ํด๋ฆญํ์ต๋๋ค</p>
<button onClick = { () => setCount(count+1)}>
ํด๋ฆญ
</button>
</div>
);
}
//onClick ๋ ๋> setCount์์ ์๋ ํจ์๊ฐ ํธ์ถ๋์ด count ๊ฐ์ 1์ถ๊ฐ
๋ณ์ ํ ๊ฐ ๋น state ๊ฐ ํ๊ฐ์ฉ ๋ค์ด๊ฐ์ผํจ
Side Effect?
-React Component ๋ ๋๋ง ํ ๋น๋๊ธฐ๋ก ์ฒ๋ฆฌํด์ผ ํ๋ ํจ๊ณผ(ex: ์๋ฒ์์ ๋ฐ์ดํฐ ๋ฐ๊ธฐ), ์ฌ์ฉ์๊ฐ ์๊ตฌํ effect ์ธ์ effect => Hook์ด ์ํ ๊ฐ๋ฅํ๋๋ก ์ฒ๋ฆฌ
useEffect ( function(์ดํํธ ํจ์), deps(์์กด์ฑ ๋ฐฐ์ด));
//๋ฐฐ์ด ์์ ๊ฐ์ด ํ๋๋ผ๋ ๋ณ๊ฒฝ๋์์ ๋ effectํจ์๊ฐ ์คํ๋จ
//deps ์์น์ ๋ฐฐ์ด ์์ ๊ฒ์ฌํ๊ณ ์ถ์ ๊ฐ์ ๋ฃ์ผ๋ฉด ํน์ ๊ฐ์ด ์
๋ฐ์ดํธ ๋ ๋ ์คํ
useEffect ( function(์ดํํธ ํจ์), []);
//ํ๋ฒ์ฉ๋ง ์คํ๋๋๋ก ํ ๋ ์์กด์ฑ ๋ฐฐ์ด ๋ถ๋ถ์ ๋น ๋ฐฐ์ด์ ๋ฃ์ด์ผ ํจ
useEffect(() => {
//์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ ๋ ์ดํ,
//์์กด์ฑ ๋ฐฐ์ด์ ์๋ ๋ณ์๋ค ์ค ํ๋๋ผ๋ ๊ฐ์ด ๋ณ๊ฒฝ๋์์ ๋ ์คํ๋จ
//์์กด์ฑ ๋ฐฐ์ด์ ๋น ๋ฐฐ์ด ([])์ ๋ฃ์ผ๋ฉด ๋ง์ดํธ์ ์ธ๋ง์ดํธ์์ ๋จ ํ๋ฒ์ฉ๋ง ์คํ๋จ
//์์กด์ฑ ๋ฐฐ์ด ์๋ต ์ ์ปดํฌ๋ํธ ์
๋ฐ์ดํธ ์๋ง๋ค ์คํ๋จ
...
return() => {
//์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ ํด์ ๋๊ธฐ ์ ์ ์คํ๋จ
...
}
}, [์์กด์ฑ ๋ณ์1, ์์กด์ฑ ๋ณ์2 ...]);
import React, {useState, useEffect} from 'react';
function Counter(props){
count [count, setCount] = useState(0);
//componentDidMount, componentDidUpstate์ ๋น์ทํ๊ฒ ์๋
useEffect(()=> {
//๋ธ๋ผ์ฐ์ api๋ฅผ ์ฌ์ฉํ์ฌ document์ title์ ์
๋ฐ์ดํธ ํฉ๋๋ค.
//ํจ์ ์ปดํฌ๋ํธ ์์์ ์ ์ธ๋๊ธฐ ๋๋ฌธ์ props, state์ ์ ๊ทผ ๊ฐ๋ฅ
document.title = 'You Clicked ${count} times';
});
return (
<div>
<p>์ด {count}๋ฒ ํด๋ฆญํ์ต๋๋ค</p>
<button onClick = { () => setCount(count+1)}>
ํด๋ฆญ
</button>
</div>
);
}
import React, {useState, useEffect} from 'react';
function UseState(props) {
const [isOnline, setIsOnline ] = useState(null);
function handleStatusChange(status) {
setIsOnline(status, isOnline);
}
useEffect(()=> {
ServerAPI.subscribeUserStatus(props.user.id handleStatusChange};
return() => {
ServerAPI.unsubscribeUserStatus(props.user.id handleStatusChange);
//์ปดํฌ๋ํธ๊ฐ unmount๋ ๋ ํธ์ถ๋จ!
};
});
if (isOnline === null ){
return '๋๊ธฐ์ค....';
} return isOnline ? '์จ๋ผ์ธ' : '์คํ๋ผ์ธ';
}
Memoization ์ฐ์ฐ๋์ ๊ฐ์ด ๋ง์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์ฅํด ๋์๋ค๊ฐ ํ์ํ ๋ ๋ค์ ๊ณ์ฐํ์ง ์๊ณ ๋ฉ๋ชจ๋ฆฌ์์ ๊บผ๋ด์ ์ฌ์ฌ์ฉํด์ ๋ฐ๋ก ๋ฐํํ๋ ๊ฒ
Memoization์ ๊ฒฐ๊ด๊ฐ = Momoized Value
const memoizedValue = useMemo(
() => {
//์ฐ์ฐ๋์ด ๋์ ์์
์ ์ํํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ
return computeExpensiveValue(์์กด์ฑ ๋ณ์1, ์์กด์ฑ ๋ณ์2);
},
[์์กด์ฑ ๋ณ์1, ์์กด์ฑ ๋ณ์2]
);
const value = useMemo (()=>{
return calculate(); //์ฝ๋ฐฑ ํจ์: ์ฝ๋ฐฑํจ์๊ฐ returnํ๋ ๊ฐ
}, [item]) //์์กด์ฑ ๋ฐฐ์ด: ๋ฐฐ์ด ์์ ์์ ๊ฐ์ด update๋ ๋๋ง ์ฝ๋ฐฑํจ์๋ฅผ ๋ค์ ํธ์ถ, Memoization value๋ฅผ updateํ์ฌ ๋ค์ memoizationํจ
//๋ ๋๋ง์ด ์ผ์ด๋๋ ๋์ ์คํ๋๋ ๊ฒ์ useMemo์ ๋ฃ์ผ๋ฉด ์๋จ
//์์กด์ฑ ๋ฐฐ์ด์ ๋ฃ์ง ์์ ๊ฒฝ์ฐ, ๋งค ๋ ๋๋ง๋ง๋ค ํจ์๊ฐ ์คํ๋๋ฏ๋ก useMemo hook์ ์ฌ์ฉํ๋ ์๋ฏธ๊ฐ ์์ด์ง
//์์กด์ฑ ๋ฐฐ์ด์ด ๋น ๋ฐฐ์ด์ผ ๊ฒฝ์ฐ, ์ปดํฌ๋ํธ ๋ง์ดํธ ์์๋ง ํธ์ถ ๋จ
useMemo๋ฅผ ์ฌ์ฉํ์ง ์์์ ๋
function calculate() {
return 10
}
function Component () {
const value = calculate();
return (<div>{value}</div>)
}
//Component๊ฐ ๋ ๋๋ง๋ ๋๋ง๋ค value ๋ณ์๊ฐ ์ด๊ธฐํ๋์ด์ calculateํจ์๋ ๋ฐ๋ณต์ ์ผ๋ก ํธ์ถ๋จ, ๋ฐ๋ผ์ ๋นํจ์จ์
useMemo๋ฅผ ์ฌ์ฉํ์ ๋
function claculate() {
return 10
}
function Component(){
const value=useMemo(
()=>calculate(), []
)
return (<div>{value}</div>)
}
//์ฒ์ ๊ณ์ฐ๋ ๊ฒฐ๊ณผ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ์ฌ ๋ฐ๋ณต์ ์ผ๋ก ๋ ๋๋ง ๋๋ ๊ฒฝ์ฐ ๊ณ์ฐ๋ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์์ ๊ฐ์ ธ์ ์ฌ์ฌ์ฉ!
const memoizedCallback = useCallback(
()=>{
doSomthing(์์กด์ฑ ๋ณ์1, ์์กด์ฑ ๋ณ์2);
},
[์์กด์ฑ ๋ณ์1, ์์กด์ฑ ๋ณ์2]
);
useCallback(ํจ์, ์์กด์ฑ ๋ฐฐ์ด); == useMemo(()=>ํจ์, ์์กด์ฑ ๋ฐฐ์ด);
import { useState, useCallback } from 'react';
function ParentComponent(props) {
const [count, setCount] = useState(0);
//์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ ๋ ๋๋ง ํจ์๊ฐ ์ ์๋จ
const handleClick = useCallback((event) => {
//ํด๋ฆญ ์ด๋ฒคํธ ์ฒ๋ฆฌ
} []);
return (
<div>
<button
onClick = (()=>{
setCount(count+1);
}}
>
{count}
</button>
<ChildComponent handleClick = {handleClick}/>
</div>
);
}
Reference: ํน์ ์ปดํฌ๋ํธ์ ์ ๊ทผํ ์ ์๋ ๊ฐ์ฒด,
refObject.current: current ์์ฑ: ํ์ฌ ์ฐธ์กฐํ๊ณ ์๋ element
const refContainer = useRef(์ด๊น๊ฐ);
//ํด๋น ์ด๊น๊ฐ์ผ๋ก ์ด๊ธฐํ๋ refernce๊ฐ์ฒด๋ฅผ ๋ฐํ
function TextInputWithFocusButton(props){
const isPutElem = useRef(null);
const onButtonClick = () =>{
//'current'๋ ๋ง์ดํธ๋ input element๋ฅผ ๊ฐ๋ฆฌํด
inputElem.current.focus();
};
return (
<>
<input ref = {inputElem} type="text"/>
<button onClick={onButtonClick}>
Focus the input
</button>
</>
);
}