Zoeeey
Stack flows in you
Zoeeey
  • 분류 전체보기 (155)
    • 💡 UXUI (4)
      • UXUI (2)
      • UI (2)
      • UX (0)
    • 🟨 JavaScript (66)
      • 개념 (42)
      • 정리 (2)
      • 문제풀기 (프로그래머스, 코딩애플) (15)
      • 응용하여 자동화or문제해결하기 (2)
      • 기타 (5)
    • ⚛️ React (49)
      • 개념 (27)
      • 개념(Redux) (3)
      • 정리 (4)
      • 문제풀기 (코딩애플: React) (15)
    • 📘 TypeScript (10)
      • 개념 (8)
      • 문제풀기 (코딩애플) (2)
    • 🌐 HTML,CSS (18)
      • 실무에서 자주 발생한 오류들 (10)
      • 뒤늦게 알아서 뼈아픈 유용한 CSS (6)
      • 기타 자주 쓰는 CSS (2)
    • 💻 CS (8)
      • CS (5)
      • 정규표현식 (2)
      • Git,Github (1)

태그

  • TypeScript
  • JavaScript
  • array
  • CS
  • Ajax
  • class
  • json
  • react
  • 코딩애플
  • state
  • CSS
  • redux
  • object
  • Props
  • 프로그래머스
  • 삼항연산자
  • axios
  • UXUI
  • 오류
  • useEffect
전체 방문자
오늘
어제
hELLO · Designed By 정상우.
Zoeeey

Stack flows in you

⚛️ React/개념(Redux)

React : state 공유하는 "Redux" (state 변경함수/파라미터/함수분리)

2023. 6. 21. 17:23

state 변경하는 법

useState()와는 다른 방식을 써야 한다.

  1. state를 수정해주는 함수를 만들고,
  2. 그 함수를 실행해야 할 때 store.js에 요청해야 한다.

store.js에서 state 변경함수 만들기

let user = createSlice({
  name : 'user',
  initialState : 'kim',
  reducers : {
    changeName(){ // state 값 변경함수 1
      return 'Park'
    },
    changeFullname(){ // state 값 변경함수 2
      return 'Kim Noran'
    }
  }
})
export let { changeName, changeFullname } = user.actions // 함수 export
  1. store.js에 변경함수를 만든다.
    변경함수에는 state를 매개변수로 활용할 수 있다.
  2. 변경함수를 export let { 함수 } = slice이름.actions 형태로 export한다.
    export시에 slice이름.actions라고 적으면 state 변경함수가 전부 그 자리에 출력되는데,
    그걸 let으로 변수에 저장했다가 export하는 원리이다.

컴포넌트에서 변경함수 사용하기

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

function Cart(){
  let dispatch = useDispatch()

  return (
    <div>
       <button onClick={()=>{ dispatch(changeName()) }}>+</button>
       ...
  1. react-redux에서 useDispatch를 import한다.
  2. store.js에서 state 변경함수를 import한다.
  3. 변수 dispatch에 useDispatch()를 넣어줬다.
  4. 사용시에는 dispatch(함수) 형태로 dispatch로 함수를 감싸 사용한다.
    그래서 dispatch로 감싼 함수는 그 자리에서 실행되는게 아니라, store.js로 요청을 보내 store.js에서 실행한다.

state값이 object/array일 경우 변경하는 법

let cart = createSlice({
  name : 'cart',
  initialState : [
    {id : 0, name : 'White and Black', count : 2},
    {id : 2, name : 'Grey Yordan', count : 1}
  ] ,
  reducers : {
    changeName(state){
      state[0].name = 'Pink Lemonade'
    },
    changeCount(state){
      state[0].count = state[0].count + 1;
    }
  }
})

변경함수에 파라미터 뚫는 법

비슷한 기능인데 여러개 만들면 귀찮다.

...
changeCount(state, action){
  state[0].count += action.payload;
}
...

파라미터자리에 파라미터를 만든 후  해당 파라미터 뒤에 .payload를 붙여주면 된다.
보통 action으로 작명을 많이 한다.

아래는 컴포넌트에서 사용하는 예시

<button onClick={()=>{ dispatch(changeCount(10)) }}>⬆</button> //10이 a다

변경함수 분리하는 법

변경함수가 길어질 경우 분리해서 다른 파일로 빼서 쓰자

분리된 파일 - cartSlice.js

import { createSlice } from '@reduxjs/toolkit'

let cart = createSlice({
    name : 'cart',
    initialState : [
        {id : 0, name : 'White and Black', count : 2},
        {id : 2, name : 'Grey Yordan', count : 1}
    ] ,
    reducers : {
        changeName(state){
        state[0].name = 'Pink Lemonade'
        },
        changeCount(state, action){
        state[0].count += action.payload;
        }
    }
})

export let { changeName, changeCount } = cart.actions

export default cart

import받는 파일 - store.js

import cart from './store/cartSlice.js'

...

export default configureStore({
  reducer: {
    cart : cart.reducer,
  }
})

import받는 파일 - 컴포넌트.js

import { changeUser } from './../store.js';
import { changeName, changeCount } from './../store/cartSlice.js';

출처 : 코딩애플 https://codingapple.com/

 

저작자표시 비영리 동일조건

'⚛️ React > 개념(Redux)' 카테고리의 다른 글

React : state 공유하는 "Redux" (state 보관/사용)  (0) 2023.06.21
React : state 공유하는 "Redux" (설치)  (0) 2023.06.21
    '⚛️ React/개념(Redux)' 카테고리의 다른 글
    • React : state 공유하는 "Redux" (state 보관/사용)
    • React : state 공유하는 "Redux" (설치)
    Zoeeey
    Zoeeey
    길게 생각하고 짧게 그리기

    티스토리툴바