// src/App.js
import React from 'react';
import { useSelector, useDispatch } from 'react-redux'; // import 해주세요.
const App = () => {
const dispatch = useDispatch();
const number = useSelector((state) => state.counter.number);
return (
<div>
<button
onClick={() => {
dispatch({ type: 'PLUS_ONE' });
}}
>
+1
</button>
<button
onClick={() => {
dispatch({ type: 'MINUS_ONE' });
}}
>
-1
</button>
<p>{number}</p>
</div>
);
};
export default App;
useDispatch()로 만들어진 dispatch는 함수로써 사용된다.
버튼에 화살표함수로 클릭시 dispatch({type: 'PLUS_ONE'})를 실행하게 하는데, dispatch는 인자값을 리듀서로 보낸다.
// src/modules/counter.js
// 초기 상태값
const initialState = {
number: 0,
};
// 리듀서
const counter = (state = initialState, action) => {
switch (action.type) {
case 'PLUS_ONE':
return { number: state.number + 1 };
case 'MINUS_ONE':
return { number: state.number - 1 };
default:
return state;
}
};
// 모듈파일에서는 리듀서를 export default 한다.
export default counter;
리듀서에 action형태로 인자값이 들어오는데, switch(action.type)으로 작성했던 PLUS_ONE이나 MINUS_ONE이 들어온다.
해당 값에 따라 case가 달라져 return 값이 달라진다.
여기서 number: state.number+1으로 1을 더한 값을 상태값에 저장하거나 뺀 값을 상태값에 저장한다.
그리고 그것을 App.js에서 useSelector으로 가져온 number변수로 화면에 보여준다.
// src/modules/counter.js
// 추가된 코드 👇 - 액션 value를 상수들로 만들어 줍니다. 보통 이렇게 한곳에 모여있습니다.
const PLUS_ONE = 'PLUS_ONE';
const MINUS_ONE = 'MINUS_ONE';
// 추가된 코드 👇 - Action Creator를 만들어 줍니다.
export const plusOne = () => {
return {
type: PLUS_ONE,
};
};
export const minusOne = () => {
return {
type: MINUS_ONE,
};
};
// 초기 상태값
const initialState = {
number: 0,
};
// 리듀서
const counter = (state = initialState, action) => {
switch (action.type) {
case PLUS_ONE: // case에서도 문자열이 아닌, 위에서 선언한 상수를 넣어줍니다.
return {
number: state.number + 1,
};
case MINUS_ONE: // case에서도 문자열이 아닌, 위에서 선언한 상수를 넣어줍니다.
return {
number: state.number - 1,
};
default:
return state;
}
};
export default counter;
// src/App.js
import React from 'react';
import { useSelector, useDispatch } from 'react-redux';
// 추가된 코드 👇 export한 action Creator를 import하기
import { minusOne, plusOne } from './redux/modules/counter';
const App = () => {
const dispatch = useDispatch();
const number = useSelector((state) => state.counter.number);
return (
<div>
<button
onClick={() => {
// 변경된 코드 👇 export한 action Creator를 함수형태로 사용
dispatch(plusOne());
}}
>
+1
</button>
<button
onClick={() => {
// 변경된 코드 👇 export한 action Creator를 함수형태로 사용
dispatch(minusOne());
}}
>
-1
</button>
<p>{number}</p>
</div>
);
};
export default App;
굳이 사용해야하는가?
사용해야할 필요가 있다.
- 1. action Creator을 미리 만들어두면, 리듀서에서 사용할 때 자동완성 기능이 제공되기 때문에, 휴먼에러를 방지할 수 있다.
- 코드의 유지보수가 쉬워진다.
- action Creator에서 type만 변경하면 원하는 기능으로 바꿀 수 있어 유지보수에 도움을 준다.
- 코드 가독성이 높아진다.
- action Creator을 작성해두면 타인이 볼 때에 해당 모듈이 가진 action이 어떤 것들이 있는지 module상에서 파악이 쉬워진다.
자세한 내용은 redux공식문서 확인
'2차 공부 > TIL' 카테고리의 다른 글
24.07.03 TodoList페이지에 redux 사용하기 (0) | 2024.07.03 |
---|---|
24.07.02 redux로 counter기능 구현하기 (0) | 2024.07.02 |
24.06.28 리액트에 리덕스 연결하기 (0) | 2024.06.28 |
24.06.24 리액트의 Batching이란 무엇인가 (0) | 2024.06.24 |
24.06.21 TodoList 페이지 기능추가하기 (0) | 2024.06.21 |