초보 개발자의 일기

redux 원리 본문

카테고리 없음

redux 원리

판다꼬마 2022. 11. 19. 14:35
728x90

redux란?

리덕스는 리액트에서 가장 많이 사용되는 상태 관리 라이브러리이다.

 

 

redux 용어

action

상태에 변환을 일으키기 위한 것.

const changeCompA = (data) => {
  return {
    //action
    type: "CHANGE_COMP_A",
    data,
  };
};

reducer

현재 상태와 액션을 받아 새로운 상태로 반환한다.

const reducer = (prevState, action) => {
  //디스패치 된 액션은 미리 만든 reducer에 걸려서 다음 state를 만듬
  //새로운 state를 만들어준다.
  switch (action.type) {
    case "CHANGE_COMP_A":
      return {
        ...prevState,
        compA: action.data,
      };
    case "CHANGE_COMP_B":
      return {
        ...prevState,
        compB: action.data,
      };
    case "CHANGE_COMP_C":
      return {
        ...prevState,
        compC: action.data,
      };
    default:
      return prevState;
  }
};

store

상태가 들어있다.

const initialState = {
  compA: "a",
  compB: 12,
  compC: null,
};

dispatch

액션을 넘겨주어 상태를 업데이트한다.

store.dispatch(changeCompA("b"));
//디스패치

subscribe

화면을 바꾸어주는 역할, 상태가 업데이트 될 때 호출이 된다.

store.subscribe(() => {
  // react-redux 안에 들어있다.
  console.log("changed"); //화면 바꿔주는 코드 여기서
});

리덕스 상태 변화 흐름

리덕스 공식 문서에 있는 흐름이다.

 

순서

 

1. 처음에 초기 상태를 업데이트 한다.

2. 상태를 바꿔줄 action을 설정한다.

3. 실행시킬 디스패치를 실행한다.

4. 디스패치 된 액션은 미리 만든 reducer에 걸려서 다음 state로  만든다.

5. 변경 완료

 

그림으로 나타내면 이렇게 된다.

 

코드

const { createStore } = require("redux");

const reducer = (prevState, action) => {
  //디스패치 된 액션은 미리 만든 reducer에 걸려서 다음 state를 만듬
  //새로운 state를 만들어준다.
  switch (action.type) {
    case "CHANGE_COMP_A":
      return {
        ...prevState,
        compA: action.data,
      };
    case "CHANGE_COMP_B":
      return {
        ...prevState,
        compB: action.data,
      };
    case "CHANGE_COMP_C":
      return {
        ...prevState,
        compC: action.data,
      };
    default:
      return prevState;
  }
};

const initialState = {
  compA: "a",
  compB: 12,
  compC: null,
};
//처음 상태

const store = createStore(reducer, initialState);

store.subscribe(() => {
  // react-redux 안에 들어있다.
  console.log("changed"); //화면 바꿔주는 코드 여기서
});

console.log("1nd", store.getState());

const changeCompA = (data) => {
  return {
    //action
    type: "CHANGE_COMP_A",
    data,
  };
};
//액션 만들기

//이런 중복을 피하고자 위에 changeCompA라는 함수 설정
// store.dispatch({
//     type:'CHANGE_COMP_A',
//     data:'b',
// })
//
// store.dispatch({
//     type:'CHANGE_COMP_A',
//     data:'c',
// })
//
// store.dispatch({
//     type:'CHANGE_COMP_A',
//     data:'d',
// })

store.dispatch(changeCompA("b"));
//디스패치

console.log("2nd", store.getState());

 

결과

 

728x90