리덕스를 이용해 카운터 기능을 구현해보자.
프리젠테이셔널 컴포넌트 만들기
프리젠테이셔널 컴포넌트란 리덕스 스토어에 직접적으로 접근하지 않고 필요한 값이나 함수를 props로만 받아와서 사용하는 컴포넌트를 말한다.
src 디렉터리에 components 디렉터리를 만들고, 그 안에 Counter.js를 생성한 뒤에 다음과 같이 코드를 작성한다.
Counter.js
import React from 'react';
function Counter({ number, diff, onIncrease, onDecrease, onSetDiff }) {
const onChange = e => {
onSetDiff(parseInt(e.target.value, 10));
};
return (
<div>
<h1>{number}</h1>
<div>
<input type="number" value={diff} min="1" onChange={onChange} />
<button onClick={onIncrease}>+</button>
<button onClick={onDecrease}>-</button>
</div>
</div>
)
}
export default Counter;
프리젠테이셔널 컴포넌트에선 주로 UI를 선언하는 것에 집중한다. 필요한 값들이나 함수는 props로 받아와서 사용하는 형태로 구현한다.
컨테이너 컴포넌트 만들기
컨테이너 컴포넌트는 리덕스 스토어의 상태를 조회하거나 액션을 디스패치 할 수 있는 컴포넌트를 말한다.
또한, HTML 태그들을 사용하지 않고 다른 프리젠테이셔널 컴포넌트들을 불러와서 사용한다.
src 디렉터리에 containers 디렉터리를 만들고 CounterContainer.js 파일을 만들어보자.
CounterContainer.js
import React from 'React';
import { useSelector, useDispatch } from 'react-redux';
import Counter from '../components/Counter';
import { increase, decrease, setDiff } from './modules/counter';
function CounterContainer() {
// useSelector는 리덕스 스토어의 상태를 조회하는 Hook이다.
const { number, diff } = useSelector(state => ({
number: state.counter.number,
diff: state.counter.diff
}));
// useDispatch는 리덕스 스토어의 dispatch를 함수에서 사용할 수 있게 해주는 Hook이다.
const dispatch = useDispatch();
const onIncrease = () => dispatch(increase());
const onDecrease = () => dispatch(decrease());
const onSetDiff = diff => dispatch(setDiff(diff));
return (
// 상태와 액션을 디스패치하는 함수들을 props로 넣어준다.
<Counter
number={number}
diff={diff}
onIncrease={onIncrease}
onDecrease={onDecrease}
onSetDiff={onSetDiff}
/>
);
}
export default CounterContainer;
이제 App 컴포넌트에서 CounterContainer를 렌더링 해보자.
App.js
import React from 'react';
import CounterContainer from './containers/CounterContainer';
function App() {
return (
<div>
<CounterContainer />
</div>
);
}
export default App;
결과 화면

입력창에 값을 입력하고 버튼을 클릭하면 해당 값에 대한 덧셈, 뺄셈이 진행되는 것을 확인할 수 있다
참고
벨로퍼트와 함께하는 모던 리액트 https://react.vlpt.us/redux/05-counter.html
'Redux' 카테고리의 다른 글
[Redux] 6. 리덕스로 투두 리스트(TodoList) 구현하기 (0) | 2021.06.29 |
---|---|
[Redux] 5. 리덕스 개발자도구 적용하는 방법 (0) | 2021.06.29 |
[Redux] 3. 리덕스 모듈 만들기 (0) | 2021.06.29 |
[Redux] 2. 리덕스 설치 및 예제 실행 (0) | 2021.06.28 |
[Redux] 1. 리덕스의 정의 및 특징 (0) | 2021.06.28 |