๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ’ปWEB FrontEnd/ํ”„๋ ˆ์ž„์›Œํฌ React

Redux (2) - state ๋ณ€๊ฒฝ

1. store์˜ state ๋ณ€๊ฒฝํ•˜๋Š” ๋ฒ• 

step 1) store.js ์•ˆ์— state ์ˆ˜์ •ํ•ด์ฃผ๋Š” ํ•จ์ˆ˜ ์ƒ์„ฑ

- slice ์•ˆ์— reducers : { }  ์—ด๊ณ  ๊ฑฐ๊ธฐ ์•ˆ์— ํ•จ์ˆ˜ ๋งŒ๋“ค๋ฉด ๋œ๋‹ค. (ํ•จ์ˆ˜ ์ž‘๋ช…์€ ์ž์œ ๋กญ๊ฒŒ)

- ํŒŒ๋ผ๋ฏธํ„ฐ ํ•˜๋‚˜ ์ž‘๋ช…ํ•˜๋ฉด ๊ทธ๊ฑด ๊ธฐ์กด state๊ฐ€ ๋œ๋‹ค.

- return ์šฐ์ธก์— ์ƒˆ๋กœ์šด state ์ž…๋ ฅํ•˜๋ฉด ๊ทธ๊ฑธ๋กœ ๊ธฐ์กด state๋ฅผ ๋ณ€๊ฒฝํ•ด์ค€๋‹ค. 

let user = createSlice({
  name : 'user',
  initialState : 'kim',
  reducers : {
    //state ์ˆ˜์ •ํ•ด์ฃผ๋Š” ํ•จ์ˆ˜
    changeName(state){ 
      return 'john ' + state
    },
    ์ˆ˜์ •ํ•จ์ˆ˜2(state){ 
      return ...
    },
  }
})

 

step 2) ์ƒ์„ฑํ•œ ์ˆ˜์ •ํ•จ์ˆ˜(changeName) export 

slice์ด๋ฆ„.actions ๋ผ๊ณ  ์ ์œผ๋ฉด state ๋ณ€๊ฒฝํ•จ์ˆ˜๊ฐ€ ์ „๋ถ€ ๊ทธ ์ž๋ฆฌ์— ์ถœ๋ ฅ๋œ๋‹ค. 

๊ทธ๊ฑธ ๋ณ€์ˆ˜์— ์ €์žฅํ–ˆ๋‹ค๊ฐ€ export ํ•˜๋ฉด ๋œ๋‹ค. 

(store.js)

export let { changeName, ์ˆ˜์ •ํ•จ์ˆ˜2 } = user.actions

 

step 3) import ํ•ด์„œ ์‚ฌ์šฉ

์˜ˆ๋ฅผ ๋“ค์–ด์„œ Cart.js ์—์„œ ๋ฒ„ํŠผ๊ฐ™์€๊ฑฐ ํ•˜๋‚˜ ๋งŒ๋“ค๊ณ  ๊ทธ ๋ฒ„ํŠผ ๋ˆ„๋ฅด๋ฉด state๋ฅผ 'kim' -> 'john kim' ์ด๋ ‡๊ฒŒ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ์œผ๋ฉด

- store.js์—์„œ ์›ํ•˜๋Š” state๋ณ€๊ฒฝํ•จ์ˆ˜๋ฅผ import ํ•œ๋‹ค.

- useDispatch ๋ผ๋Š” ๊ฒƒ๋„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ๊ฐ€์ ธ์˜จ๋‹ค.

- ๊ทธ๋ฆฌ๊ณ  dispatch( state๋ณ€๊ฒฝํ•จ์ˆ˜() ) ์ด๋ ‡๊ฒŒ ๊ฐ์‹ธ์„œ ์‹คํ–‰ํ•˜๋ฉด state ๋ณ€๊ฒฝํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋œ๋‹ค. 

import { useDispatch, useSelector } from 'react-redux';
import { changeName } from './../store.js'

function CartPage() {
    let state = useSelector((state) => state)
    let dispatch = useDispatch()

    return (
        <div>
            <button onClick={() => {
                dispatch(changeName())
            }}>+</button>
        </div>
    ) 
}

export default CartPage;

 

 

2. redux state๊ฐ€ array/object์ธ ๊ฒฝ์šฐ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด 

{name : 'kim', age : 20} ์ธ state๋ฅผ 'kim' -> 'park' ์ด๋ ‡๊ฒŒ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ์œผ๋ฉด? 

 

๋ฐฉ๋ฒ•โ‘  return ์˜ค๋ฅธ์ชฝ์— ์ ์€๊ฑธ๋กœ ๊ธฐ์กด state๋ฅผ ๋ณ€๊ฒฝ

let user = createSlice({
  name : 'user',
  initialState : {name : 'kim', age : 20},
  reducers : {
    changeName(state){
      return {name : 'park', age : 20}
    }
  }
}) 

 

๋ฐฉ๋ฒ•โ‘ก state๋ฅผ ์ง์ ‘ ์ˆ˜์ •

let user = createSlice({
  name : 'user',
  initialState : {name : 'kim', age : 20},
  reducers : {
    changeName(state){
      state.name = 'park'
    }
  }
}) 

 

state๋ฅผ ์ง์ ‘ ์ˆ˜์ •ํ•˜๋Š” ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•ด๋„ ์ž˜ ๋ณ€๊ฒฝ๋˜๋Š” ์ด์œ ๋Š”

Immer.js ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ state ์‚ฌ๋ณธ์„ ํ•˜๋‚˜ ๋” ์ƒ์„ฑํ•ด์ค€ ๋•๋ถ„์ธ๋ฐ Redux ์„ค์น˜ํ•˜๋ฉด ํฌํ•จ๋˜์–ด ์˜จ๋‹ค.

 

โ˜ž array/object ์ž๋ฃŒ์˜ ๊ฒฝ์šฐ state๋ฅผ ์ง์ ‘ ์ˆ˜์ •ํ•ด๋„ ์ž˜ ๋ณ€๊ฒฝ๋˜๋‹ˆ, ์ง์ ‘ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. 

 

 

3. state ๋ณ€๊ฒฝํ•จ์ˆ˜์— ๋ณ€์ˆ˜ ์‚ฌ์šฉํ•˜๋Š” ๋ฒ•

let user = createSlice({
  name : 'user',
  initialState : {name : 'kim', age : 20},
  reducers : {
    increase(state, a){
      state.age += a.payload
    }
  }
})

 

(์ฐธ๊ณ )

- a ๋ง๊ณ  action ์ด๋Ÿฐ ์‹์œผ๋กœ ์ž‘๋ช… ๋งŽ์ด ํ•œ๋‹ค. 

- action.type ํ•˜๋ฉด state๋ณ€๊ฒฝํ•จ์ˆ˜ ์ด๋ฆ„์ด ๋‚˜์˜ค๊ณ 

- action.payload ํ•˜๋ฉด ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ๋‚˜์˜จ๋‹ค.