본문 바로가기
Study Note/React

React #리듀서 함수 생성

by 시뮝 2020. 10. 18.
728x90

리듀서

변화를 일으키는 함수.

 

리듀서 함수 생성

파라미터를 두 개 받는 리듀서를 생성하는 예제소스입니다. 

첫 번째 파라미터는 현재 상태이고,

두 번째 파라미터는 액션 객체입니다. jsbin.com 에서 간단히 실습합니다.

 

html

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS Bin</title>
</head>
<body>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/redux/3.6.0/redux.js">
  </script>
</body>
</html>

 

javascript

//12.2.2 액션과 액션 생성 함수
//액션 : 스토어에서 상태 변화를 일으킬 때 참조하는 객체. type값 필수
//      대문자, 밑줄을 조합하여 만듭니다.
const INCREMENT = 'INCREMENT'; //숫자의 값을 더하는 액션
const DECREMENT = 'DECREMENT'; //숫자의 값을 빼는 액션

const increment = (diff) => ({
  type: INCREMENT,
  diff: diff
});

const decrement = (diff) => ({
  type: DECREMENT,
  diff: diff
});


//console.log(increment(1));
//console.log(decrement(1));
/* --==>
[object Object] {
  diff: 1,
  type: "INCREMENT"
}
[object Object] {
  diff: 1,
  type: "DECREMENT"
}
*/


//12.2.3 변화를 일으키는 함수, 리듀서
const initialState = {
  number: 0,
  foo: 'bar',
  baz: 'qux'
};

// state = initialState : ES6문법, state값이 undefined라면 
// initialState를 기본 값으로 사용한다는 의미입니다.
function counter1(state = initialState, action) {
  switch(action.type) {
    case INCREMENT:
      return { number: state.number + action.diff };
    case DECREMENT:
      return { number: state.number - action.diff };
    default:
      return state;
  }
}

//Object.assign을 이용한 객체 병합.
function counter2(state = initialState, action) {
  switch(action.type) {
    case INCREMENT:
      return Object.assign({}, state, {
        number: state.number + action.diff
      });
    case DECREMENT:
      return Object.assign({}, state, {
        number: state.number - action.diff
      });
    default:
      return state;
  }
}

//ES6 문법의 전개 연산자(...)를 이용한 객체 병함
function counter3(state = initialState, action) {
  switch(action.type) {
    case INCREMENT:
      return {
        ...state,
        number: state.number + action.diff
      }
    case DECREMENT:
      return {
        ...state,
        number: state.number - action.diff
      }
    default:
      return state;
  }
}

console.log('counter1');
console.log(counter1(undefined, increment(1)));
console.log('counter2');
console.log(counter3(undefined, increment(1)));
console.log('counter3');
console.log(counter3(undefined, increment(1)));

 

 


 

728x90

댓글