ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • ๋ฆฌ๋•์Šค ํˆดํ‚ท
    react 2023. 11. 9. 14:46

    ๐Ÿคท‍โ™€๏ธ ๋ฆฌ๋•์Šค๋ž€?

    Javascript ์ƒํƒœ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค
    ์ปดํฌ๋„ŒํŠธ๋“ค์ด props์—†์ด state ๊ณต์œ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ค€๋‹ค!!

    ์ƒํƒœ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ์ด์œ ๋Š” ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ๊ฐ€ ์ปค์ง€๋ฉด์„œ ์ƒํƒœ ๋ฐ์ดํ„ฐ์˜ ์ „๋‹ฌ๊ณผ ์—…๋ฐ์ดํŠธ๊ฐ€ ๋ณต์žกํ•ด์ง€๊ณ , ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์–ด๋ ค์›Œ์ง€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. Props๋ฅผ ํ†ตํ•ด ์ƒํƒœ๋ฅผ ์ „๋‹ฌํ•˜๊ฒŒ ๋˜๋ฉด ์ฝ”๋“œ๊ฐ€ ๋ณต์žกํ•ด์ง€๊ณ , ์ƒํƒœ ๋ณ€๊ฒฝ ์‹œ ๋ถˆํ•„์š”ํ•œ ์ปดํฌ๋„ŒํŠธ ๋ฆฌ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

    => Redux๋Š” ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค

    ๐Ÿ‘พ Redux๋Š” store.js ํ•œ๊ณณ์— state๋“ค์„ ์ €์žฅํ•ด๋‘์–ด ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๋“ค์ด ์ง์ ‘ ๊ฐ€์ ธ๋‹ค ์“ธ์ˆ˜์žˆ๋‹ค!!

    (์ฆ‰, ์ƒํƒœ๊ด€๋ฆฌ๋ฅผ ์ปดํฌ๋„ŒํŠธ์˜ ๋ฐ”๊นฅ์—์„œ ํ•˜๋Š” ๊ฒƒ์ž„)

    ๐Ÿคท‍โ™€๏ธ ๋ฆฌ๋•์Šค ํˆดํ‚ท(Redux-Toolkit) ์ด๋ž€?

    ํšจ์œจ์ ์ธ Redux ๊ฐœ๋ฐœ์„ ์œ„ํ•œ ์ €ํฌ์˜ ๊ฒฌํ•ด๋ฅผ ๋ฐ˜์˜ํ•œ, ์ด๊ฒƒ๋งŒ์œผ๋กœ๋„ ์ž‘๋™ํ•˜๋Š” ๋„๊ตฌ ๋ชจ์Œ, Redux Toolkit์€ Redux ๋กœ์ง์„ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•œ ํ‘œ์ค€ ๋ฐฉ์‹์ด ๋˜๋„๋ก ๋งŒ๋“ค์–ด์กŒ๊ณ , ์‚ฌ์šฉํ•˜๊ธฐ๋ฅผ ๊ฐ•๋ ฅํžˆ ์ถ”์ฒœํ•œ๋‹ค๊ณ  ํ•จ

    ๐Ÿคท‍โ™€๏ธ Redux ์‚ฌ์šฉํ•˜๊ธฐ

    ๋ฆฌ๋•์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜

    ํ„ฐ๋ฏธ๋„์— ์ž…๋ ฅ

    npm install redux
    npm install react-redux (๋ฆฌ์•กํŠธ์™€ ์‚ฌ์šฉ์‹œ)
    npm install @reduxjs/toolkit react-redux (๋ฆฌ๋•์Šค ํˆดํ‚ท ์‚ฌ์šฉ์‹œ)

     

    state slice

    ๐Ÿ“ข Action

    action์€ redux์—์„œ ํ•จ์ˆ˜๋ฅผ ๋ถ€๋ฅผ ๋•Œ ์“ฐ๋Š” ๋‘๋ฒˆ์งธ parameter ํ˜น์€ argument์ž„
    ์ฆ‰, store ์ƒํƒœ์— ๋ณ€ํ™”๋ฅผ ์ผ์œผํ‚ค๋Š” ๊ฒƒ์„ ์•ก์…˜์ด๋ผ๊ณ  ํ•œ๋‹ค
    const reducer =(count=0, action)=>{
      return count;
    }
    • action์€ ๋ฐ˜๋“œ์‹œ object ์—ฌ์•ผ ํ•จ! string์ด ๋  ์ˆ˜ ์—†๋‹ค!
    • action์€ ๋ฌด์กฐ๊ฑด type์ด ์žˆ์–ด์•ผ ํ•จ! {type : "ADD"}
    • modifier์™€ communicateํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค~

    ๐Ÿ“ข Reducer

    state(ํ˜„์žฌ์ƒํƒœ)์™€ action(type)๋ฅผ ๋ฐ›์•„ ์ƒˆ๋กœ์šด ์ƒํƒœ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค

     

    const reducer = (state, action) => { 
    }

     

    reducer๋Š” function(ํ•จ์ˆ˜)์•ผ!

    ๋„ˆ์˜ data๋ฅผ modify(์ˆ˜์ •)ํ•˜๋Š”!

    const reducer = (count = 0, action) => {
      if (action.type ==="ADD"){
        return count + 1;
      } else if (action.type ==="MINUS"){
        return count - 1;
      } else {
        return count;
      }
    };

    => ์—ฌ๊ธฐ์—์„  state๋ฅผ (count=0)์œผ๋กœ ๋ฐ›์•„์ฃผ์—ˆ๋‹ค

     

    ๐Ÿ“ข Store

    Store๋Š” ์ปดํฌ๋„ŒํŠธ ์™ธ๋ถ€์— ์žˆ๋Š” ์ƒํƒœ ์ €์žฅ์†Œ์ž„
    Store์•ˆ์—๋Š” state(ํ˜„์žฌ ์ƒํƒœ)๋“ค, reducer, ๊ทธ๋ฆฌ๊ณ  ๋ช‡ ๊ฐ€์ง€์˜ ๋‚ด์žฅ ํ•จ์ˆ˜๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ์Œ (dispatch, Subscribe ๋“ฑ๋“ฑ...)

     

    Redux ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ–ˆ์œผ๋ฉด,
    ๋จผ์ € store.js ํŒŒ์ผ์„ ์ƒ์„ฑํ•œ๋‹ค

    import {createStore} from 'redux';
    
    const reducer = (count = 0, action) => {
      console.log(count, action)
    };
    const store = createStore(reducer);

    createStore๋กœ ์ €์žฅ์†Œ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค
    ๊ทธ๋Ÿฐ ๋‹ค์Œ reducer๋ฅผ ๋‹ด์•„ store์— ์ €์žฅํ•œ๋‹ค

     

    ๐Ÿ“ข Dispatch

    Store์˜ ๋‚ด์žฅํ•จ์ˆ˜
    dispatch๋ฅผ ์ด์šฉํ•ด์„œ ์šฐ๋ฆฌ๋Š” action์„ ๊ฐ์ฒด ํ˜•ํƒœ๋กœ ๋ณด๋‚ด์ค€๋‹ค
    (=์•ก์…˜์„ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ์—ญํ• )
    store.dispatch(action)
    ex) store.dispatch({type:"ADD"})

    ์Šคํ† ์–ด์˜ ์ƒํƒœ ๋ณ€ํ™”๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด?

    => dispatch๊ฐ€ ์•ก์…˜(๊ฐ์ฒด ํ˜•ํƒœ, ex) {type:ADD})์ด๋ผ๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ์ „๋‹ฌํ•ด์„œ ์Šคํ† ์–ด์— ์•Œ๋ ค ์คŒ!

     

    ๐Ÿ‘พ ์šฐ๋ฆฌ๋Š” dispatch๋ฅผ ํ†ตํ•ด์„œ ๋‚˜ ๋ฐ”๊ฟ€๊ฑฐ์•ผ!๋ผ๊ณ  reducer์— ์š”์ฒญ ๊ฐ€๋Šฅ!
    type ๋’ค์— ์˜ค๋Š” ๊ฒƒ์ด ์š”์ฒญ ๋ฉ”์‹œ์ง€!!๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค!

     

    ๐Ÿ“ข Subscribe

    Store์˜ ๋‚ด์žฅํ•จ์ˆ˜
    ํŠน์ • ํ•จ์ˆ˜ ํ˜•ํƒœ์˜ ๊ฐ’์„ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›์•„์˜ด
    ์Šคํ† ์–ด์˜ ์ƒํƒœ๊ฐ€ ์—…๋ฐ์ดํŠธ๋  ๋•Œ๋งˆ๋‹ค ํŠน์ • ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค

     

    ์šฐ๋ฆฌ๊ฐ€ ์–ธ๋ก ์‚ฌ(store)์„ ๊ตฌ๋…ํ•˜๋ฉด ๋‰ด์Šค(state)๊ฐ€ ์—…๋ฐ์ดํŠธ ๋  ๋•Œ๋งˆ๋‹ค
    ์•Œ๋žŒ(ํŠน์ •ํ•จ์ˆ˜ ex) onChange)์ด ํ˜ธ์ถœ๋œ๋‹ค! ๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋จ

    store.subscribe(ํŠน์ •ํ•จ์ˆ˜);
    ex)store.subscribe(onChange);

     

    โ“ ๋งŒ์•ฝ์— ๋„ค๊ฐ€ change๋ฅผ ๋„ˆ์˜ store์—์„œ ๊ฐ์ง€ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด,

    ⇒ ๊ทธ change๋ฅผ subscibe(๊ตฌ๋…)ํ•˜๋ฉด ๋จ!!

    const onChange()=>{
    number.innerText = store.getState();
    console.log('changed')
    }
    store.subscibe(onChange);

    => ์ƒํƒœ๋ณ€ํ™”๋ฅผ ๊ฐ์ง€ํ•  ๋•Œ๋งˆ๋‹ค store.getState();์— ์˜ํ•ด ํ˜„์žฌ์˜ ์ƒํƒœ์™€ ํ•จ๊ป˜ console.log('changed')๊ฐ€ ๋‚˜ํƒ€๋‚˜๋Š” ๋ชจ์Šต

     

    ์ถ”๊ฐ€๋กœ...

    if else๋ฌธ ๋Œ€์‹  case๋ฌธ ์‚ฌ์šฉํ•˜๊ธฐ

     

    if else๋ฌธ ์‚ฌ์šฉ

    const reducer = (count = 0, action) => {
      if (action.type ==="ADD"){
        return count + 1;
      } else if (action.type ==="MINUS"){
        return count - 1;
      } else {
        return count;
      }
    };

    case๋ฌธ ์‚ฌ์šฉ

    const reducer = (count = 0, action) => {
      switch (action.type) {
        case "ADD":
          return count + 1;
        case "MINUS":
          return count - 1;
        default:
          return count;
      }
    };

     

    if else๋ฌธ๋ณด๋‹ค case๋ฌธ์„ ์‚ฌ์šฉํ–ˆ์„๋•Œ ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์ด ๋” ๋†’์Œ

    (์–ด๋Š ๊ฒƒ์„ ์“ฐ๋“  ์ƒ๊ด€์€ ์—†์Œ ๊ฐœ์ธ ์ทจํ–ฅ์— ๋”ฐ๋ผ ์‚ฌ์šฉํ•˜๊ธฐ~)

     

    ๋ณ€์ˆ˜์— ๋‹ด์•„ ์‚ฌ์šฉํ•ด์„œ action ๊ฐ์ฒด๋ณด๋‚ด์ฃผ๊ธฐ

     

    ๋ณ€์ˆ˜ ์‚ฌ์šฉ

    const ADD ="ADD";
    const MINUS ="MINUS";
    
    const handleAdd = () => {
      store.dispatch({ type: ADDD })
    }

     

     

    ๋ณ€์ˆ˜์— ๋‹ด์•„์ฃผ์–ด javaScipt๊ฐ€ ๋ญ”๊ฐ€ ์ž˜๋ชป๋˜์—ˆ๋‹ค๊ณ  ๋ง์„ ํ•ด์คŒ, string์„ ์“ฐ๊ฒŒ ๋˜๋ฉด type: "ADDD" ์˜ค๋ฅ˜๊ฐ€ ๋œจ์ง€์•Š์Œ
    => ์˜ค๋ฅ˜๋ฅผ ๋นจ๋ฆฌ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค

     

    ๐Ÿคท‍โ™€๏ธ ์ •๋ฆฌํ•˜๊ธฐ

    Action ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ผ์–ด๋‚˜๋Š” ์‚ฌ๊ฑด์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ์ฒด
    Reducer ์•ก์…˜์— ๋”ฐ๋ผ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ํ•จ์ˆ˜๋กœ, ํ˜„์žฌ ์ƒํƒœ์™€ ์•ก์…˜์„ ๋ฐ›์•„ ์ƒˆ๋กœ์šด ์ƒํƒœ๋ฅผ ๋ฐ˜ํ™˜ํ•จ
    Store ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๋Š” ์ค‘์•™ ์ €์žฅ์†Œ๋กœ, ์ƒํƒœ ๋ณ€๊ฒฝ๊ณผ ๊ด€๋ จ๋œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•จ
    Dispatch ์•ก์…˜(๊ฐ์ฒด ํ˜•ํƒœ)์„ ์Šคํ† ์–ด์— ๋ณด๋‚ด ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝ์‹œ์ผœ์ค˜๋ผ๊ณ  ์•Œ๋ฆผ
    Subscribe ์Šคํ† ์–ด์˜ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ํŠน์ • ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์ƒํƒœ ๋ณ€ํ™”๋ฅผ ๊ฐ์ง€

     

    ๐Ÿคท‍โ™€๏ธ ํ•œ๋ˆˆ์— ์ •๋ฆฌํ•˜๊ธฐ

     

    ๋ฆฌ๋•์Šค ์‚ฌ์šฉ ํ๋ฆ„ ์ •๋ฆฌ

     

    3๊ฐ€์ง€ ์ธ์ž

    initialState ์ดˆ๊ธฐ๊ฐ’ ์„ค์ •

    name์„ค์ •

    reducers์„ค์ •

     

    1. slice ์ƒ์„ฑํ•˜๊ธฐ

    index.js

    import { createSlice } from '@reduxjs/toolkit'
    
    const projectstate = createSlice({
        name: 'project',
    
        initialState: {
            title: '์„ธ๋ฏธ๋‚˜',
            desc: '์•ˆ๋‡ฝ',
            cnt: 0
        },
    
        reducers: {
            changeTitle: (state, action) => {
                state.title = action.payload
            },
            changeDesc: (state, action) => {
                state.desc = action.payload
            }
        }
    
    })
    
    export const { changeTitle, changeDesc } = projectstate.actions;
    
    export default projectstate.reducer;

     

    2. reducer ๋“ฑ๋กํ•˜๊ธฐ

    store.js

    import { configureStore } from '@reduxjs/toolkit';
    import projectReducer from './index'
    
    export const store = configureStore({
        reducer: {
            project: projectReducer
        }
    })
    
    export default store

     

    3. Provider๋ฅผ  ์จ์ค€๋’ค store(์ €์žฅ์†Œ) ๊ณต์œ ํ•˜๊ธฐ

    App.js

    import store from './store/store'
    
    root.render(
        <Provider store={store}>
            <BrowserRouter>
                <App />
            </BrowserRouter>
        </Provider>
    
    );

     

    4. useSelector๋ฅผ ํ†ตํ•ด ๊ณต์œ ์ €์žฅ์†Œ๋ฅผ ๋ง˜๋Œ€๋กœ ๊ฐ€์ ธ๋‹ค ์“ธ์ˆ˜์žˆ๋‹ค~

    let state = useSelector((state)=>{return state})

     

    header.jsx

    import { useDispatch, useSelector } from 'react-redux';
    
    
    const HeaderNav = (props) => {
        const dispatch = useDispatch();
        const { project = useSelector(state => state.project);

     

     

Designed by Tistory.