본문 바로가기
Frontend/React

[React] Redux(2) [payload]

by pin9___9 2022. 12. 14.
728x90

Payload란?

이전에 Redux를 이용해 counter를 만들었습니다. 그때는 정해진 숫자만 더하고 빼기만 했었는데 이번에는 임의의 값을 넣어 더하고 빼는 counter를 만들어 보려고 합니다. 이때 임의의 값이라는 목적어가 생기게 되고 그 목적어도 액션객체에 담아 같이 보내줘야 합니다. 이렇게 액션객체에 같이 담아 보내주는 것을 Payload라고 합니다.

 

export const addNumber = (payload) => {
  return {
    type: ADD_NUMBER,
    payload,
  };
};

 

⭐반드시 payload라는 이름을 통해서 보내야 하나요?

리덕스는 굉장히 유연한 라이브러리이기 때문에 많은 것들이 “표준화”되어 있지 않습니다. 때문에 자신만의 방식으로 프로그래밍 할 수 있는 유연성을 제공하죠.

리덕스 공식 문서를 확인해보면 액션은 객체이며 해당 액션이 어떤 기능을 수행해야 하는지 명시하는 type이라는 프로퍼티를 반드시 가져야 한다고 나와 있습니다. 그래서 지금까지는 아래와 같이 액션 객체에 type 프로퍼티를 추가해 어떤 기능을 수행해야 할지 명시해줬습니다.

 

{type: "ADD_NUMBER", num: 10} // ??
{type: "ADD_NUMBER", number: 10} // ??
{type: "ADD_NUMBER", data: 10} // ??
{type: "ADD_NUMBER", myNumber: 10} // ??
{type: "ADD_NUMBER", myNum: 10} // ??


{type: "ADD_NUMBER", payload: 10}

 

위에 작성한 코드는 전부 유효한 코드입니다. 그렇지만 저희가 데이터를 payload 프로퍼티에 담아주는 이유는 커뮤니티에서 이렇게 하면 제일 좋더라 하는 “커뮤니티 best practice”로 공유되면서 많은 개발자가 데이터는 payload라는 프로퍼티에 담아주고 있습니다. 이 얘기를 드리는 이유는 커뮤니티 컨벤션이기 때문에 개발하는 과정에서 얼마든 개발자 취향과 상황에 따라 변경할 수 있음을 알려드리고 싶었습니다.

 

payload를 이용해서 기능 구현하기

 

1. 사용자가 입력한 값을 받을 input 구현하기

// src/App.js


import React from "react";
import { useState } from "react";

const App = () => {
  const [number, setNumber] = useState(0);

  const onChangeHandler = (event) => {
    const { value } = event.target;
		// event.target.value는 문자열 입니다.
		// 이것을 숫자형으로 형변환해주기 위해서 +를 붙여 주었습니다.
    setNumber(+value);
  };

	// 콘솔로 onChangeHandler가 잘 연결되었는지 확인해봅니다.
	// input에 값을 넣을 때마다 콘솔에 그 값이 찍히면 연결 성공!
  console.log(number);

  return (
    <div>
      <input type="number" onChange={onChangeHandler} />
      <button>더하기</button>
      <button>빼기</button>
    </div>
  );
};

export default App;

 

2. counter.js 모듈 작성 

 

지금까지 작성한 Action Creator와 조금 차이가 있습니다. payload가 필요한 Action Creator에서는 함수를 선언할 때 매개변수 자리에 paylaod를 넣어줘야 합니다. 왜냐하면 Action Creator를 사용하는 컴포넌트에서 리듀서로 보내고자 하는 payload를 인자로 넣어줘야 하기 때문입니다. 

//src/redux/modules/counter.js

// action value
const ADD_NUMBER = "ADD_NUMBER";
const REMOVE_NUMBER = "REMOVE_NUMBER";
// action creator
export const addNumber = (payload) => {
  return {
    type: ADD_NUMBER,
    payload,
  };
};
export const removeNumber = (payload) => {
  return {
    type: REMOVE_NUMBER,
    payload,
  };
};
// initial state
const initialState = {
  number: 0,
};
// reducer
const counter = (state = initialState, action) => {
  switch (action.type) {
    case ADD_NUMBER:
      return {
        number: state.number + action.payload,
      };
    case REMOVE_NUMBER:
      return {
        number: state.number - action.payload,
      };
    default:
      return state;
  }
};
//export default reducer
export default counter;

 

3. 구현된 기능 테스트하기

// src/App.js

import React, { useState } from "react";
import { useSelector, useDispatch } from "react-redux";

// 4. Action Creator를 import 합니다.
import { addNumber, removeNumber } from "./redux/modules/counter";

const App = () => {
  const [number, setNumber] = useState(0);
  const globalNumber = useSelector((state) => state.counter.number);
  
  // 1. dispatch를 사용하기 위해 선언해줍니다.
  const dispatch = useDispatch();
  const onChangeHandler = (event) => {
    const { value } = event.target;
    setNumber(+value);
  };
  
  // 2. 더하기, 빼기 버튼을 눌렀을 때 실행할 이벤트핸들러를 만들어줍니다.
  const onClickAddNumberHandler = () => {
  
  // 5. Action creator를 dispatch 해주고, 그때 Action creator의 인자에 number를 넣어줍니다.
    dispatch(addNumber(number));
  };
  const onClickRemoveNumberHandler = () => {
  
  // 5. Action creator를 dispatch 해주고, 그때 Action creator의 인자에 number를 넣어줍니다.
    dispatch(removeNumber(number));
  };
  console.log(number);
  return (
    <div>
      {globalNumber}
      <input type="number" onChange={onChangeHandler} />
      
      {/* 3. 더하기, 빼기 버튼 이벤트핸들러를 연결해줍니다. */}
      <button onClick={onClickAddNumberHandler}>더하기</button>
      <button onClick={onClickRemoveNumberHandler}>빼기</button>
    </div>
  );
};

export default App;

 

 

728x90

'Frontend > React' 카테고리의 다른 글

[React] Redux(3) [Redux Toolkit]  (0) 2022.12.20
[React] React-Router-Dom  (0) 2022.12.15
[React] Redux(1) [count 만들기]  (0) 2022.12.13
[React] 절대 경로 (Absolute Imports)  (0) 2022.08.19
[React] React useState 공부하기!  (0) 2022.08.18

댓글