Redux에서 정의되지 않은 state를 추가 할 수 있을까

2019. 11. 5. 16:28·React

기존 리액트 코드에서 state 객체 안에 input의 값을 추가 할 때 onChange를 통해 값이 생성되면 state안에 키값과 밸류값을 넣도록 만들어 두었었다.



// ex
const inputHandler = e => {
    const { name, value } = e.target;
    setState(...state, ...{ [name]: value });
  };


이런 상황에서 리덕스를 사용할 경우 정의되지 않은 state의 키와 밸류를 추가 할 수 있을지와  의문이 들었다.

문제는 리듀서에서 발생을 했다. 리듀서는 action과 state만을 인자로 받기 때문에 [name]의 값을 가져올 수 없었다.

이를 해결하려면 action자체를 스프레드(...)하면 되지만 이경우에 action안에 있는 type의 값까지 같이 state에 반영이 된다.

돌아는 가겠지만 안티패턴이란느 생각을 지울 수 없었다.



const CHANGE_INPUT = "carInfo/CHANGE_INPUT";

export const changeInput = (name, value) => ({
  type: CHANGE_INPUT,
  [name]: value
});

const initialState = {
  car_num: "",
  car_own_name: ""
};

export default function carInfo(state = initialState, action) {
  switch (action.type) {
    case CHANGE_INPUT:
      console.log(action);
      console.log(state);
      return {
        ...state,
        ...action
    default:
      return state;
  }
}


그에 따라  각 input마다 함수를 생성하는 것은 너무 비효율 적이므로 state를 정의하고 action에 값이 없으면 state의 값을 넣음으로써 상태관리를 하는 것으로 결정했다.



const CHANGE_INPUT = "carInfo/CHANGE_INPUT";

export const changeInput = (name, value) => ({
  type: CHANGE_INPUT,
  [name]: value
});

const initialState = {
  car_num: "",
  car_own_name: ""
};

export default function carInfo(state = initialState, action) {
  switch (action.type) {
    case CHANGE_INPUT:
      return {
        ...state,
        ...{
          car_num: action.car_num || state.car_num,
          car_own_name: action.car_own_name || state.car_own_name
        }
      };
    default:
      return state;
  }
}


아래는 react 코드이다



import React, { useEffect } from "react";
import { changeInput } from "../store/modules/carInfo";
import { connect } from "react-redux";

const CarInfo = ({ car_num, car_own_name, changeInput }) => {
  const inputHandler = e => {
    const { name, value } = e.target;
    changeInput(name, value);
  };

  return (
    <div>
      <div>
        <p className="input_title">차량번호</p>
        <input
          type="text"
          name="car_num"
          value={car_num}
          onChange={inputHandler}
        />
      </div>
      <div className="input_wrap">
        <p className="input_title">소유주이름</p>
        <input
          type="text"
          name="car_own_name"
          value={car_own_name}
          onChange={inputHandler}
        />
      </div>
    </div>
  );
};

const mapStateToProps = state => {
  return {
    car_num: state.carInfo.car_num,
    car_own_name: state.carInfo.car_own_name
  };
};

const mapDispatchToProps = dispatch => {
  return {
    changeInput: (name, value) => dispatch(changeInput(name, value))
  };
};

const CarInfoContainer = connect(
  mapStateToProps,
  mapDispatchToProps
)(CarInfo);

export default CarInfoContainer;


반응형
저작자표시 (새창열림)

'React' 카테고리의 다른 글

redux 강의 기본 핵심 튜토리얼 1탄 - redux란 무엇일까?  (0) 2020.10.29
react hooks에서 useContext(context API), useReducer로 상태관리 하기  (0) 2020.10.29
apache에서 react-router-dom 설정  (0) 2019.10.29
react ie 11 적용하기 ( feat.polyfill )  (0) 2019.09.29
하위 태그에 클릭 이벤트 해제 - currentTarget  (0) 2019.09.02
'React' 카테고리의 다른 글
  • redux 강의 기본 핵심 튜토리얼 1탄 - redux란 무엇일까?
  • react hooks에서 useContext(context API), useReducer로 상태관리 하기
  • apache에서 react-router-dom 설정
  • react ie 11 적용하기 ( feat.polyfill )
vitnal
vitnal
4년차 프론트엔드 개발자 입니다. 이 블로그는 기록하고 싶은 내용을 저장하기 위해 사용하고 있습니다. 정제되지 않은 내용이 있을 수 있는 점 양해 부탁드립니다.
  • vitnal
    vitnal 아카이브
    vitnal
  • 전체
    오늘
    어제
    • 분류 전체보기 (154)
      • What I Read (2)
      • AI (5)
      • WEB (8)
      • React (21)
      • Nextjs (17)
      • JavaScript (16)
      • React Native (5)
      • Git (15)
      • Dev Tools (23)
      • Deploy (12)
      • Tech Memo (22)
      • Retrospect (7)
  • 반응형
  • hELLO· Designed By정상우.v4.10.5
vitnal
Redux에서 정의되지 않은 state를 추가 할 수 있을까
상단으로

티스토리툴바