state

์š”์ฆ˜ ์ œ์ผ ๊ณ ๋ฏผ์ด ๋งŽ์€ ์ƒํƒœ๊ด€๋ฆฌ์— ๋Œ€ํ•ด ๊ณต๋ถ€ํ•˜๋ฉฐ ์ •๋ฆฌํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค. ์ฐธ๊ณ  ๋„์„œ : ๋ฆฌ์•กํŠธ ํ›…์„ ํ™œ์šฉํ•œ ๋งˆ์ดํฌ๋กœ ์ƒํƒœ ๊ด€๋ฆฌ ( ๋‹ค์ด์‹œ ์นดํ†  ์ง€์Œ )

๋งˆ์ดํฌ๋กœ ์ƒํƒœ๊ด€๋ฆฌ

๋ฒ”์šฉ์ ์ธ ์ƒํƒœ ๊ด€๋ฆฌ ๋ฐฉ๋ฒ•์€ ๊ฐ€๋ณ๊ณ , ์œ ์—ฐํ•ด์•ผํ•œ๋‹ค. ๋งˆ์ดํฌ๋กœ ์ƒํƒœ๊ด€๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ธฐ๋ณธ์ ์ธ ์ƒํƒœ ๊ด€๋ฆฌ ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•œ๋‹ค.

  1. ์ƒํƒœ ์ฝ๊ธฐ

  2. ์ƒํƒœ ๊ฐฑ์‹ 

  3. ์ƒํƒœ ๊ธฐ๋ฐ˜ ๋ Œ๋”๋ง

๊ทธ ์™ธ ์ถ”๊ฐ€์ ์œผ๋กœ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ๋“ค

  1. ๋ฆฌ๋ Œ๋”๋ง ์ตœ์ ํ™”

  2. ๋‹ค๋ฅธ ์‹œ์Šคํ…œ๊ณผ์˜ ์ƒํ˜ธ ์ž‘์šฉ

  3. ๋น„๋™๊ธฐ ์ง€์›

  4. ํŒŒ์ƒ ์ƒํƒœ

  5. ๊ฐ„๋‹จํ•œ ๋ฌธ๋ฒ•

๋‹ค์–‘ํ•œ ๋งˆ์ดํฌ๋กœ ์ƒํƒœ ๊ด€๋ฆฌ ๋ฐฉ๋ฒ•์„ ๊ณต๋ถ€ํ•˜๊ณ , ํ˜„์žฌ ํ”„๋กœ์ ํŠธ์— ์–ด๋–ค ๋ฐฉ๋ฒ•์ด ์ ํ•ฉํ•œ์ง€ ๊ณ ๋ฏผํ•ด๋ณด์ž.

React Hook

๋ฆฌ์•กํŠธ์—๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” ์ƒํƒœ๊ด€๋ฆฌ hook์ด ์žˆ๋‹ค.

  1. useState

  2. useReducer

  3. useEffect

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์œผ๋กœ ๋ถ„๋ฆฌํ•˜๋ฉด ๋‘๊ฐ€์ง€ ๊ด€์ ์„ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค.

  1. Component์™€ useCount๊ฐ€ ๋ถ„๋ฆฌ๋˜์–ด ๊ด€์‹ฌ์‚ฌ๊ฐ€ ๋ถ„๋ฆฌ๋œ๋‹ค.

  2. 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