{
type: "ADD_TODO"
data: {
id:0,
text: "리덕스 배우기"
}
}
export function addTodo(data){
return {
type: "ADD_TODO"
data
};
}
function reducer(state, action){
// 상태 업데이트 로직
return alteredState;
}
1. 1 애플리케이션 1 스토어
2. 상태는 read only!
3. 변화를 일으키는 함수, 리듀서는 순수한 함수!
npm install redux --save
npm install react-redux --save
npm install @reduxjs/toolkit react-redux
먼저 리액트 프로젝트에 위 명령어로 모듈을 설치해준다
// react-redux 관련 모듈 import
import { Provider } from "react-redux";
import { legacy_createStore as createStore } from "redux";
설치해준 모듈을 import해주고 아래 코드를 포함하였다.
// currentState는 리듀서에서 관리된다
const currentState = {count:10, age:21};
// 리듀서 선언 부분
function reducer(state = currentState, action) {
if(currentState == undefined) {
return {count:10};
}
if(action.type == "changeCnt") {
state.count = action.count;
}
if(action.type == "changeAge") {
state.age = action.age;
}
if(action.type == "conunt증가") {
state.count++;
}
if(action.type == "conunt감소") {
state.count--;
}
if(action.type == "age증가") {
state.age++;
}
if(action.type == "age감소") {
state.age--;
}
// 리액트의 불변성을 유지한다 !
const newState = {...state};
return newState;
}
// 스토어 생성
let store = createStore(reducer);
useSelector - 리덕스 스토어의 state를 조회하는 Hook
useDispatch - 리덕스 스토어의 dispatch를 함수에서 사용할 수 있게 해주는 Hook
import { useDispatch, useSelector } from 'react-redux';
function CntCtrl(props) {
// dispatch 선언
const dispatch = useDispatch();
const count = useSelector((state)=>{
return state.count;
})
return (
<>
<fieldset>
<h3>count Controller</h3>
<p>
<input type="text" value={count} onChange={(e)=>{
// 액션을 디스패치
dispatch({
type:"changeCnt",
count:e.target.value
});
}} />
</p>
<button onClick={()=>{
dispatch({
type:"conunt증가"
});
}}>증가</button>
<button onClick={()=>{
dispatch({
type:"conunt감소"
});
}}>감소</button>
</fieldset>
</>
)
}
export default CntCtrl;