-
[Redux기초]Redux 사용하기React 2023. 4. 17. 21:37
유데미 강좌를 통해 작성하였습니다.
간단한 counter증가 예제를 통해 리덕스의 흐름을 복습.
리덕스를 사용하기 위해 라이브러리를 설치해준다.
npm install redux react-redux
1.Store 생성하기
Store는 전역 상태를 저장하는 공간이다. 리덕스에서 Store는 하나만 존재해야 한다.
여러개의 스토어를 사용할 수는 있지만, 그럼 개발 도구를 활용해 상태를 추적할 수 없게 된다.
store는 reducer를 인자로 받는다. 현재 createStore를 사용하면 취소선이 그어지는데,
리덕스에서 리덕스 툴킷의 configureStore를 쓰길 권장하고 있기 때문이다.
기능상의 문제는 전혀 없으니 사용해도 괜찮지만, 취소선을 없애고 싶다면..
-RTX configureStore를 사용한다.
-as를 통해 이름을 바꿔서 사용한다.
2.reducer 생성하기
리듀서는 저장소의 변화를 주는 순수한 함수이다. 저장소(store)에 접근해 action객체를 전달한다.
이전 상태를 절대 변화시키지않고 새로운 상태를 반환해야한다.
state와 action을 매개변수로 받는다.
const initialState ={ counter:0, } const counterReducer = (state = initialState,action){ switch(action.type){ case 'increase': return{ counter:state.counter+1 } case 'decrease': return{ counter:state.counter-1 } } }
reducer를 store에 넣어주고 export해준다.
const store = createStore(counterReducer); export default store;
3.Store를 제공하기
store를 만들고 모든 컴포넌트에 접근 할 수 있도록 컴포넌트의 최상단 index.js로 이동해준다.
Provider를 react-redux로부터 import해준다.
context에서 Provider로 감싸준것과 비슷하게 Redux도 컴포넌트들이 Store에 접근할 수 있도록 Provider를 사용한다.
4.Store 구독하기
store를 가져와서 상태를 불러오기 위해 useSelector를 사용할 수 있다.
이 hook은 매개변수로 함수를 받고 상태 객체 전체에서 일부분만 쉽게 잘라내서 가져올 수 있다.
const counter = useSelector(state =>state.counter);
store를 가져오기 위한 방법
- useStore : Redux스토어에 대한 완전한 엑세스를 제공한다.
- useSelector : 스토어의 특정 부분의 상태만 가져올 수 있는 간단한 방법을 제공한다.
- connect : 클래스형 함수에서는 hook을 사용할 수 없으므로 connect를 사용한다.
5.action 전달하기
상태에 어떠한 변화를 줘야한다면 리듀서에 action 을 전달해서 바꿀 수 있다.
액션 객체는 type을 필수적으로 갖는다.액션을 전달할 때는 useDispatch를 호출하여 전달할 수 있다.
const dispatch = useDispatch(); const incrementHandler = () => { dispatch({ type: "increment" }); };
💡액션 생성자 함수
액션 생성자 함수는 액션 객체를 생성하는 함수이다. 이것을 이용하면 코드가 간결해지며 객체의 구조를 일관되게 유지할 수 있다.
// action creator const INCREASE = 'INCREASE'; const DECREASE = 'DECREASE'; const increment = (amount) => { return {type: INCREMENT}; }; const decrement = ()=>{ return {type : DECREASE} } //reducer function reducer(state = initialState, action) { switch (action.type) { case INCREASE: return { counter: state.counter + 1 }; case DECREASE: return { counter: state.counter - 1 }; default: return state; } } //counter.js const incrementHandler = () => { dispatch(increment()); }; const decrementHandler = () => { dispatch(decrement()); };
💡액션의 payload
액션 객체는 반드시 type속성을 갖는다고 했다. 그 외 추가 정보를 주기 위해 payload라는 속성을 사용 할 수 있다.
//counter.js const increaseHandler =()=>{ dispatch({type:'increase',value:5}) } //reducer const counterReducer = (state = initialState,action){ switch(action.type){ case 'increase': return{ counter:state.counter+action.value } } } //생성자 함수의 payload const increment = (amount) => { return { type: 'INCREMENT', payload: { amount } }; //dispatch하기 dispatch(increment(5));
'React' 카테고리의 다른 글
[Hooks]useReducer (0) 2023.06.19 [Hooks]useEffect (0) 2023.06.19 [Redux기초]리덕스 기초 개념 (0) 2023.04.13 [리액트 기초]context 사용법 (0) 2023.04.01 [리액트]portal (0) 2023.03.31