์์ฆ ์ ์ผ ๊ณ ๋ฏผ์ด ๋ง์ ์ํ๊ด๋ฆฌ์ ๋ํด ๊ณต๋ถํ๋ฉฐ ์ ๋ฆฌํ ๋ด์ฉ์
๋๋ค.
์ฐธ๊ณ ๋์ : ๋ฆฌ์กํธ ํ
์ ํ์ฉํ ๋ง์ดํฌ๋ก ์ํ ๊ด๋ฆฌ ( ๋ค์ด์ ์นดํ ์ง์ )
๋ง์ดํฌ๋ก ์ํ๊ด๋ฆฌ
๋ฒ์ฉ์ ์ธ ์ํ ๊ด๋ฆฌ ๋ฐฉ๋ฒ์ ๊ฐ๋ณ๊ณ , ์ ์ฐํด์ผํ๋ค. ๋ง์ดํฌ๋ก ์ํ๊ด๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ ๊ธฐ๋ณธ์ ์ธ ์ํ ๊ด๋ฆฌ ๊ธฐ๋ฅ์ด ํ์ํ๋ค.
๊ทธ ์ธ ์ถ๊ฐ์ ์ผ๋ก ํ์ํ ๊ธฐ๋ฅ๋ค
๋ค๋ฅธ ์์คํ
๊ณผ์ ์ํธ ์์ฉ
๋ค์ํ ๋ง์ดํฌ๋ก ์ํ ๊ด๋ฆฌ ๋ฐฉ๋ฒ์ ๊ณต๋ถํ๊ณ , ํ์ฌ ํ๋ก์ ํธ์ ์ด๋ค ๋ฐฉ๋ฒ์ด ์ ํฉํ์ง ๊ณ ๋ฏผํด๋ณด์.
React Hook
๋ฆฌ์กํธ์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณตํ๋ ์ํ๊ด๋ฆฌ hook์ด ์๋ค.
useState
useState๋ฅผ ์ฌ์ฉํ ๊ฐ๋จํ ์์
// useState๊ฐ count์ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ค.
const Component = () => {
const [count, setCount] = useState(0);
return (
<div>
{count}
<button onClick={()=>{setCount(c => c + 1)}}>
+1
</button>
</div>
)
}
// useCount hook์ผ๋ก ๋ถ๋ฆฌ
const useCount = () => {
const [count, setCount] = useState(0);
return [count, setCount];
}
const Component = () => {
const [count, setCount] = useCount();
return (
<div>
{count}
<button onClick={()=>{setCount(c => c + 1)}}>
+1
</button>
</div>
)
}
useCount๋ฅผ hook์ผ๋ก ๋ถ๋ฆฌํ๋ฉด ๋๊ฐ์ง ๊ด์ ์ ์๊ฐํ ์ ์๋ค.
Component์ useCount๊ฐ ๋ถ๋ฆฌ๋์ด ๊ด์ฌ์ฌ๊ฐ ๋ถ๋ฆฌ๋๋ค.
useCount๋ผ๋ ์ด๋ฆ์ผ๋ก ์ด๋ค ์ํ๋ฅผ ๊ด๋ฆฌํ๋์ง ๋ช
ํํด์ก๋ค.
count๋ฅผ ์ฌ์ฉํ๋ ์ฝ๋์ ๋ค๋ฅธ ์ฝ๋๊ฐ ์ถ๊ฐ๋์ด๋ Component๋ ์๋ฌด ์ํฅ์ ๋ฐ์ง ์๋๋ค.
useSate ์ํ ๊ฐฑ์ ํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด์.
๊ฐ์ผ๋ก ๊ฐฑ์
state์ ์๋ก์ด ๊ฐ์ ๋ฃ์ด์ฃผ๋ฉด ์ํ๊ฐ ๋ณ๊ฒฝ๋๋ค. ์ฃผ์ํ ์ ์ useState๋ ์ด์ ๊ฐ๊ณผ ๋์ผํ ๊ฐ์ด ๋ค์ด์ค๋ฉด ๋ฆฌ๋ ๋๋ง์ด ๋์ง ์๋๋ค.
// ๊น์ด ๋ณ๊ฒฝ๋๋ฉด ๋ฆฌ๋ ๋๋ง์ด ๋๋ค.
const Component = () => {
const [count, setCount] = useState(0);
return (
<div>
{count}
<button onClick={()=>{setCount(c => c + 1)}}>
1๋ก ๋ณ๊ฒฝ
</button>
</div>
)
}
// ์ฒ์ ๋ฒํผ์ ๋๋ ์ ๋๋ง ๋ฆฌ๋ฐ๋
์ด ๋๊ณ , ๊ทธ ์ดํ์ ๋ฒํผ์ ๋๋ฌ๋ ๋ฆฌ๋ ๋๋ง์ด ๋์ง ์๋๋ค.
const Component = () => {
const [count, setCount] = useState(0);
return (
<div>
{count}
<button onClick={()=>{setCount(1)}}>
1๋ก ๋ณ๊ฒฝ
</button>
</div>
)
}
useReducer
๋ฆฌ๋์๋ ๋ณต์กํ ์ํ์ ์ ์ฉํ๋ค.
// useReducer๋ฅผ ์ฌ์ฉํ ๊ฐ๋จํ ์์
const reducer = (state, action) => {
switch(action.type) {
case 'INCREMENT':
return {...state, count: state.count + 1};
case 'SET_TEXT':
return {...state, text: action.text};
default:
throw new Error('unknown action type')
}
}
const Component = () => {
const [state, dispatch] = useReducer(
reducer,
{ count: 0, text: 'hi'}
);
return (
<div>
{state.count}
<button onClick={()=>dispatch({ type: 'INCREMENT' })}>
Increment count
</button>
<input
value={state.text}
onChange={(e) => dispatch({ type: 'SET_TEXT', text: e.target.value})}
/>
</div>
)
}
useReduce ๋ฒ ์ผ ์์ ๋ฐ์์ํค๊ธฐ
const reducer = (state, action) => {
switch(action.type) {
case 'INCREMENT':
return {...state, count: state.count + 1};
case 'SET_TEXT':
// state ์์ฒด๋ฅผ ๋ณ๊ฒฝํ๋ฉด ๋ฆฌ๋ ๋๋ง์ด ๋์ง ์๋๋ค.
if(!action.text) {
return state
}
return {...state, text: action.text};
default:
throw new Error('unknown action type')
}
}
useSate์ useReducer
useReducer๋ฅผ ์ด์ฉํ useState ๊ตฌํํ๊ธฐ
const useState = (initialState) => {
const [state, dispatch] = useReducer(
(prev, action) =>
typeof action === 'function' ? action(prev) : action, initialState
)
return [state, dispatch];
}
Last updated