1. 리덕스 툴킷 쓰는 이유
- 스승님께서 그러셨다. 취업하려면 새로운 라이브러리 신기술 이런거 적당히 배우고 리덕스나 하라고..
- 근데 오리지날 리덕스는 문법이 매우 더럽고 리듀서/액션 패턴도 좀 거지같아서 내 프로젝트에는 그나마 나은 툴킷세트를 사용한다.
- 체계적으로 관리는 하고싶은데 문법이라도 깔끔하게 하고싶으면 리덕스 툴킷 쓰자
2. 설치
npm i @reduxjs/toolkit react-redux
(리액트 18.0 이상이어야 한다. 꼰대프로젝트는 못쓴다)
3. 세팅
index.js
import { Provider } from "react-redux";
import store from './store.js'
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
<React.StrictMode>
<Provider store={store}> //이 Provider로 감싸줘야함
<BrowserRouter>
<App />
</BrowserRouter>
</Provider>
</React.StrictMode>
);
- Provider로 감싸주고 store라는 props를 넘겨준다
- 기존 리덕스랑 똑같다.
4. 생성 및 사용하기
store.js
import { configureStore, createSlice } from '@reduxjs/toolkit'
let user = createSlice({ //state 만들기
name : 'user', // name : `state이름`
initialState : 'kim' // initialState : `state 값`
})
export default configureStore({ //state 등록하기
reducer: {
user : user.reducer //작명 : createSlice만든거.reducer
}
})
Header.jsx
import { useSelector } from "react-redux"
const Header = ()=>{
const result = useSelector(state => state) // 이 state에 store의 모든 state들이 남는다.
return(
<div>
{result.user}
</div>
)
}
export default Header ;
5. 수정함수 세팅하기
store.js
import { configureStore, createSlice } from '@reduxjs/toolkit'
const user = createSlice({
name : 'user', //state 이름
initialState : 'kim', //state 값
reducers : {
changeName(state, action){ //파라미터 하나 넣으면 그 값은 기존 state가 됨
return 'state바꾸기 ' + state + action.payload //return 오른쪽 걸로 갈아치워줌
//action.payload : changeName(action) 파라미터 문법으로 전달된 data
//action.type : state변경함수 이름이 출력
},
}
})
const objectExample = createSlice({
name : 'objectExample',
initialState : {obj : 'Victor'},
reducers : {
changeNameByObject(state, action){
state.obj = '오브젝트나 배열이면 리턴없이 일케 바꾸셈' + action.payload // 원래 함수형 업데이트로 불변성을 지켜줘야 하지만 테스트할때는 대충한다.
}
}
})
//export 해줘야됨
export const { changeName } = user.actions
export const { changeNameByObject } = objectExample.actions
//Slice이름.actions 하면 state 변경함수가 전부 그 자리에 출력
//그 중에 changeName을 변수에 담아 export하겠다는 뜻이다.
export default configureStore({ //state 등록하기
reducer: {
user : user.reducer, //작명 : createSlice만든거.reducer
objectExample : objectExample.reducer
}
})
Header.jsx
import { useDispatch, useSelector } from "react-redux"
import { changeName, changeNameByObject } from "./../store.js"
const Header = ()=>{
let dispatch = useDispatch(); //store.js에 요청을 보내줌
const storeReduxChangeTest = ()=>{
dispatch(changeName('이걸루')) //이렇게 사용하면 changeName 함수 호출 가능
}
const storeReduxChangeTestByObject = () =>{
dispatch(changeNameByObject('요걸루'))
}
const result = useSelector(state => state)
return(
<div>
result.user : {result.user} <br/>
result.objectExample.obj : {result.objectExample.obj} <br/>
<button onClick={storeReduxChangeTest}>누르면 전역state 바꿀수 있음</button> <br/>
<button onClick={storeReduxChangeTestByObject}>누르면 오브젝트형태 바꾸는거처럼 바꿈</button>
</div>
)
}
export default Header ;
6. 테스트하기
- 버튼을 누르면
7. 원래는 state는 불변성을 지켜주기 위해 함수형 업데이트 해야함
- 원래는 함수형 업데이트가 좋은거임
- 구글링해서 써보자. 실제 프로젝트 로직에는 함수형 업데이트 쓸거다.
'더이상 하지 않는 망한 프로젝트 > 프로젝트 개발 과정' 카테고리의 다른 글
[앱삼] 6. (frontend) Sign up 페이지 세팅 및 validation (0) | 2023.03.06 |
---|---|
[앱삼] 5. (frontend) React Router 세팅, 페이지 만들어놓기 (0) | 2023.03.03 |
[앱삼] 3. DB연결 구조 개선하기 (0) | 2023.02.27 |
[앱삼] 2. MERN 풀스택 환경 기본세팅 - 4 (0) | 2023.02.26 |
[앱삼] 2. MERN 풀스택 환경 기본세팅 - 3 (0) | 2023.02.26 |
댓글