-
Notifications
You must be signed in to change notification settings - Fork 7
๐ ๋ฆฌ์กํธ ํ ์ค
State๋ ์ปดํฌ๋ํธ๊ฐ ๊ฐ์ง ์ ์๋ ์ํ๋ฅผ ์๋ฏธํ๋ค. ์๋ฅผ ๋ค์ด ์๊ณ ์ปดํฌ๋ํธ๋ time์ ์ํ๋ก ๊ฐ์ง๋ค.
const [state, setState] = useState(์ด๊ธฐ๊ฐ);
setState๋ฅผ ์ฌ์ฉํ์ฌ state๋ฅผ ๊ฐํธํ๊ฒ ๋ฐ๊ฟ ์ ์๋ค. state๋ฅผ ๋ณ๊ฒฝํ๋ฉด ์ฌ๋ ๋๋ง์ด ๋์ด ํ๋ฉด์ด ์ ๋ฐ์ดํธ ๋๋ค.
- Mount ํ๋ฉด์ ์ฒซ ๋ ๋๋ง
- Update ๋ค์ ๋ ๋๋ง
- Unmount ํ๋ฉด์์ ์ฌ๋ผ์ง
๋ ๋๋ง ๋ ๋๋ง๋ค ์คํ
useEffect(()=>{
//์์
...
});
ํ๋ฉด์ ์ฒซ ๋ ๋๋ง ๋ ๋, value๊ฐ์ด ๋ฐ๋ ๋ ์คํ
useEffect(()=>{
//์์
...
} [value]);
์์กด์ฑ ๋ฐฐ์ด์ด ๋น์ด ์๋ค๋ฉด ํ๋ฉด์ ์ฒซ ๋ ๋๋ง ๋ ๋๋ง ์คํ
clean Up - ์ ๋ฆฌ
ํ๋ฉด์ ์ฒซ ๋ ๋๋ง ๋ ๋, value๊ฐ์ด ๋ฐ๋ ๋ ์คํ
useEffect(()=>{
//๊ตฌ๋
...
return () => {
//๊ตฌ๋
ํด์ง...
}
} [value]);
const ref = useRef(value)
//{current: value}
ref ์ค๋ธ์ ํธ๋ ์์ ์ด ๊ฐ๋ฅํ๋ค. ๋ฐํ๋ ref๋ ์ปดํฌ๋ํธ์ ์ ์์ ์ฃผ๊ธฐ๋ฅผ ํตํด ์ ์ง๊ฐ ๋๋ค. ์ปดํฌ๋ํธ๊ฐ ๊ณ์ํด์ ๋ ๋๋ง ๋์ด๋ unmount๋๊ธฐ ์ ๊น์ง๋ ๊ฐ์ ๊ทธ๋๋ก ์ ์ง.
-
์ด๋ ํ ๊ฐ์ ์ ์ฅํ๋ ์ ์ฅ๊ณต๊ฐ, ๋ณ๊ฒฝ ์ ๋ ๋๋ง์ ๋ฐ์์ํค์ง ๋ง์์ผ ํ ๊ฐ state์ ๋ณํ -> ๋ ๋๋ง -> ์ปดํฌ๋ํธ ๋ด๋ถ ๋ณ์๋ค ์ด๊ธฐํ ref์ ๋ณํ -> no ๋ ๋๋ง -> ๋ณ์๋ค์ ๊ฐ์ด ์ ์ง๋จ state์ ๋ณํ -> ๋ ๋๋ง -> ๊ทธ๋๋ ref์ ๊ฐ์ ์ ์ง๋จ
-
DOM ์์์ ์ ๊ทผ focus()
๋ค์ํ ๋ ๋ฒจ์ ์๋ ๋ง์ ์ปดํฌ๋ํธ์ ์ ์ญ์ ์ธ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๊ธฐ ์ํจ์ด๋ค.
- Context๋ฅผ ์ฌ์ฉํ๋ฉด ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฌ์ฉํ๊ธฐ ์ด๋ ค์ ์ง ์์๋ค.
- Prip Drilling์ ํผํ๊ธฐ ์ํ ๋ชฉ์ ์ด๋ผ๋ฉด ์ปดํฌ๋ํธ ํฉ์ฑ์ ๋จผ์ ๊ณ ๋ คํ์.
Memoization: ๋์ผํ ๊ฐ์ ๋ฆฌํดํ๋ ํจ์๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ํธ์ถํด์ผ ํ๋ค๋ฉด ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ์ ๋งจ ์ฒ์ ๊ณ์ฐํ ๋ ์บ์์ ๋ฌ์ ์บ์์์ ๊บผ๋ด ์ฌ์ฉ.
function Component() {
const value = useMemo( () => caculate(), []
)
return <div>{value}</div>
}
๋ ๋๋ง -> Component ํจ์ ํธ์ถ, Memoization -> ๋ ๋๋ง -> Component ํจ์ ํธ์ถ, Memoize๋ ๊ฐ์ ์ฌ์ฌ์ฉ
const value = useMemo( () => {
return caculate
},[]);
๊ผญ ํ์ํ ๋๋ง
- ์ปดํฌ๋ํธ ์ต์ ํ
cosnt caculate = useCallback((num) => {
return num + 1;
}, [item])
๋ณต์กํ state๋ฅผ ๋ค๋ฃฐ ๋ useReducer๊ฐ ํธํ ์ ์๋ค.
// reducer - state๋ฅผ ์ ๋ฐ์ดํธ ํ๋ ์ญํ (์ํ) // dispatch - state ์ ๋ฐ์ดํธ๋ฅผ ์ํ ์๊ตฌ // action - ์๊ตฌ์ ๋ด์ฉ
cosnt ACTION_TYPES = {
deposit: "deposit",
widthdraw: "withdraw"
}
const reducer = (sate, action) => {
switch (action.type) {
case ACTION.type.depisit:
return state + action.payload
case ACTION.type.withdraw:
return state - action.payload
default:
return satae;
}
}
function App() {
const [money, dispatch] = useReducer(reducer, 0);
return (
<button onClick={()=>{dispatch({type: ACTION_TYPE.deposit, payload: number});}>
)
}
์ปดํฌ๋ํธ์ ๋ ๋๋ง ํ์๋ฅผ ์ ํ. ๋ถ๋ชจ ์ปดํฌ๋ํผ๊ฐ ๋ณ๊ฒฝ๋๋ฉด ์์ ์ปดํฌ๋ํธ๋ ์ฌ์คํ๋๋๋ฐ ์ด์ props๊ฐ ๋ณ๊ฒฝ๋๋ ๊ฒฝ์ฐ์๋ง ๋ ๋๋ง ๋๋๋ก ์ต์ ํ๋ ์ปดํฌ๋ํธ๋ฅผ ์ ๊ณต. prop check๋ฅผ ํตํด ์ฌ์ฌ์ฉ.
1.์ปดํฌ๋ํธ๊ฐ ๊ฐ์ props๋ก ์์ฃผ ๋ ๋๋ง๋ ๋ 2.์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง์ด ๋ ๋๋ง๋ค ๋ณต์กํ ๋ก์ง์ ์ฒ๋ฆฌํด์ผ ํ๋ค
** ์ค์ง props ๋ณํ์๋ง ์์กดํ๋ ์ต์ ํ ๋ฐฉ๋ฒ์ด๋ค. **
import {useInput} from "./useInput"
function displayMessage(message) {
alert(message)
}
function App() {
cosnt [inputValue, handleChange, handleSubmit] = useInput("", displayMessage)
return (
<input value={inputValue} onChange={handleChange} />
)
}
impoert {useState} from "react"
export function useInput(initialValue, submitAction) {
const [inputValue, setInputValue] = useState(initialValue)
cosnt handleChange = (e) => {
setInputValue(e.target.value)
}
const handleSubmit = () => {
setInputValue("");
submitAction(inputValue);
}
return [inputValue, handleChange, handleSubmit]
}
function App() {
const { data: userData , fetchUrl } = useFetch(baeUrl), "users";
const { data: postData , fetchUrl } = useFetch(baeUrl), "posts";
.
}
useEffect(()=>{
fetchUrl("users")
},[])
return (
<div>
<h1>useFetch</h1>
<button onClick={()=>fetchUrl("users")}>Users</button>
<button onClick={()=>fetchUrl("posts")}>posts</button>
<button onClick={()=>fetchUrl("todos")}>todos</button>
</div>
)
}
function useFetch(baseUrl, initialType) {
const [data,setData] = useSatate(null);
const fetchUrl = (type) => {
fetch(baseUrl + "/" + type)
.then(res => res.json()).then((res)=> setData(res))
}
useEffect(()=>{
fetch(initialType)
},[])
return {
date, fetchUrl,
}
}