โš›๏ธ Redux Toolkit

HoJinยท2023๋…„ 9์›” 6์ผ

โš›๏ธ React

๋ชฉ๋ก ๋ณด๊ธฐ
1/2
post-thumbnail

โš›๏ธ Redux Toolkit ๊ธฐ์ดˆ

  • props ์—†์ด state๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
  • JS ํŒŒ์ผ ํ•˜๋‚˜์— state๋ฅผ ๋ณด๊ด€ํ•˜๊ณ  ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ
  • redux-toolkit์œผ๋กœ ๋ฌธ๋ฒ•์ด ๋” ์‰ฌ์›Œ์ง

๐Ÿ“Œ ์‚ฌ์šฉ๋ฒ•

โœ… ์„ค์น˜

npm install @reduxjs/toolkit react-redux

โœ… ์ดˆ๊ธฐ์„ค์ •

1๏ธโƒฃ state๋ฅผ ๋ณด๊ด€ํ•˜๋Š” .js ํŒŒ์ผ์— ์•„๋ž˜์™€ ๊ฐ™์ด ์ž‘์„ฑ

import { configureStore } from '@reduxjs/toolkit'

export default configureStore({
  reducer: { }
}) 

2๏ธโƒฃ index.js ์—์„œ <Provider>๋กœ <App/> ๊ฐ์‹ธ๊ธฐ

import { Provider } from "react-redux";
import store from './store.js'

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
  <React.StrictMode>
    <Provider store={store}> // ์ด๋ถ€๋ถ„ ์ž‘์„ฑ
      <BrowserRouter>
        <App />
      </BrowserRouter>
    </Provider>
  </React.StrictMode>
); 

โœ… Redux store์— state ๋ณด๊ด€ํ•˜๊ธฐ

1๏ธโƒฃ createSlice()๋กœ state ์ƒ์„ฑ
2๏ธโƒฃ configureStore()์•ˆ์— ๋“ฑ๋ก

import { configureStore, createSlice } from '@reduxjs/toolkit'

let user = createSlice({ // 1๏ธโƒฃ createSlice()๋กœ state ์ƒ์„ฑ
  name : 'user', // state ์ด๋ฆ„
  initialState : 'kim' // state ๊ฐ’
})

export default configureStore({ // 2๏ธโƒฃ configureStore()์•ˆ์— ๋“ฑ๋ก
  reducer: {
    user : user.reducer // { ์ž‘๋ช… : createSlice๋งŒ๋“ ๊ฑฐ.reducer }
  }
}) 

โœ… Redux store์—์„œ state ๊ฐ€์ ธ์˜ค๊ธฐ

  • useSelector((state) => { return state })
  • useSelector((state) => state.user ) ๐Ÿ‘
import { useSelector } from "react-redux"

function Cart(){
  let a = useSelector((state) => { return state } )
  console.log(a)

  return (์ƒ๋žต)
}

โœ… Redux์˜ state ๋ณ€๊ฒฝํ•˜๊ธฐ

1๏ธโƒฃ Redux store ํŒŒ์ผ์—์„œ state ์ˆ˜์ •ํ•จ์ˆ˜ ๋งŒ๋“ค๊ธฐ

let user = createSlice({
  name : 'user',
  initialState : 'kim',
  reducers : { 
    changeName(state){ // ์ž์œ ๋กญ๊ฒŒ ์ž‘๋ช… ๊ฐ€๋Šฅ
      return 'john ' + state // 'kim' โžก๏ธ 'john kim'
    }
  }
}) 

2๏ธโƒฃ Redux store ํŒŒ์ผ์—์„œ export ํ•˜๊ธฐ

export let { changeName } = user.actions 

3๏ธโƒฃ import ํ•ด์„œ ์‚ฌ์šฉ

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

(์ƒ๋žต) 

<button onClick={()=>{
  dispatch(changeName()) // dispatch()๋กœ ๊ฐ์‹ธ์ค˜์•ผํ•จ
}}>๋ฒ„ํŠผ์ž„</button> 
๐Ÿšจ ์ปดํฌ๋„ŒํŠธ์—์„œ state ์ง์ ‘ ์ˆ˜์ •ํ•˜๋ฉด ๋ฒ„๊ทธ ๋ฐœ์ƒ์‹œ ๋ฒ”์ธ์ฐพ์œผ๋ ค ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ ๋’ค์ ธ์•ผํ•จ โžก๏ธ store.js์—์„œ ์ˆ˜์ •ํ•จ์ˆ˜ ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉ

โœ… Redux state๊ฐ€ array/object์ธ ๊ฒฝ์šฐ ๋ณ€๊ฒฝํ•˜๊ธฐ

๋ฐฉ๋ฒ• 1๏ธโƒฃ

let user = createSlice({
  name : 'user',
  initialState : {name : 'kim', age : 20},
  reducers : {
    changeName(state){
      return {name : 'park', age : 20} // ๋ฆฌํ„ด ์˜ค๋ฅธ์ชฝ์—์žˆ๋Š”๊ฑธ๋กœ ๊ฐˆ์•„๋ผ์›€
    }
  }
}) 

๋ฐฉ๋ฒ• 2๏ธโƒฃ

let user = createSlice({
  name : 'user',
  initialState : {name : 'kim', age : 20},
  reducers : {
    changeName(state){
      state.name = 'park' // state ์ง์ ‘ ์ˆ˜์ •๋„ ๊ฐ€๋Šฅ โžก๏ธ immer.js ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ state ์‚ฌ๋ณธ์„ ํ•˜๋‚˜ ๋” ์ƒ์„ฑํ•ด์ค˜์„œ(Redux ์„ค์น˜์‹œ ๋”ธ๋ ค์˜ด)
    }
  }
}) 

๐Ÿšจ ๊ฒฐ๋ก 

  • array/object ์ž๋ฃŒ์˜ state๋ณ€๊ฒฝ์€ ์ง์ ‘ ์ˆ˜์ •๊ฐ€๋Šฅ
  • ์‹ฌ์ง€์–ด ๋” ํŽธํ•˜๋‹ˆ๊น ์ผ๋ถ€๋Ÿฌ array/object๋กœ ๋งŒ๋“ค์ž

โœ… state ๋ณ€๊ฒฝํ•จ์ˆ˜ ์—ฌ๋Ÿฌ๊ฐœ ํ•„์š”ํ• ๋•Œ

  • ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฌธ๋ฒ• ์ด์šฉ๊ฐ€๋Šฅ
let user = createSlice({
  name : 'user',
  initialState : {name : 'kim', age : 20},
  reducers : {
    increase(state, a){
      state.age += a.payload // action. ์œผ๋กœ ์ž‘๋ช… ๋งŽ์ดํ•จ
    } // action.type โžก๏ธ state ๋ณ€๊ฒฝํ•จ์ˆ˜ ์ด๋ฆ„
  } // action.payload โžก๏ธ ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ
}) 

๐Ÿ“š Reference : React ๋ฆฌ์•กํŠธ ๊ธฐ์ดˆ๋ถ€ํ„ฐ ์‡ผํ•‘๋ชฐ ํ”„๋กœ์ ํŠธ๊นŒ์ง€!(๐ŸŽ ์ฝ”๋”ฉ์• ํ”Œ)

0๊ฐœ์˜ ๋Œ“๊ธ€