useEffect(() => {
axios.get('/data')
.then(() => {
setState(data);
})
.catch(() => {
setError(error);
})
})
넥스트가 설치되어있는 front
디렉토리에서 리덕스 설치
npm i redux
Redux의 손쉬운 사용을 위해 redux-wrapper 설치 (Redux와 사용법이 약간 다르다)
npm i next-redux-wrapper
front/store/configureStore.js
파일 생성
import { createWrapper } from 'next-redux-wrapper';
import {createStore} from 'redux';
const configureSotre = () => {
const store = createStore(reducer);
return store;
};
const wrapper = createWrapper(configureSotre, {
debug: process.env.NODE_ENV === 'development,'
});
export default wrapper;
_app.js
파일 수정 import wrapper from '../store/configureStore.js`
.
.
.
export default wrapper.withRedux(Nodebird);
//wrapper로 감싸줘야 프로젝트의 모든 컴포넌트와 페이지에 적용된다
_app.js
의 return 내부를 Provider
로 감싸야했는데 지금은 redux가 알아서 감싸주니 비워두어야한다 (사용자가 감싸면 중복되어 에러 발생) //before
return (
<Provider store={store}>
</Provider>
);
//from redux@6
return (
<>
</>
);
- 앱의 상태를 객체 형식으로 작성한다 state (좌)
- 변경하고 싶은 내용을 action으로 만든다 (우)
- action의 이름을 적는
type
- 변경사항을 적는
data
- action을 dispatch한다
- dispatch된 action을 reducer에 따라 처리한다 (아래)
- reducer는 action 어떻게 처리할지 정의해준다
- 예를 들어
switch
를 값을 변경해주는 것이다case
에 action의type
을 적어준다- 바꾸고싶은 값에
action.data
를 넣어준다
{
name: 'zerocho',
age: '27',
password: 'babo'
}
{
type: 'CHANGE_NICKNAME' // action이름
data: 'boogicho' // 변경될 데이타값
}
{
type: 'CHANGE_AGE'
data: 30,
}
switch (action.type) {
case 'CHANGE_NICKNAME': //action의 type
return { //새로운 객체를 리턴
...state, //유지할 state들은 그대로 사용
name: action.data, //변경할 state를 action.data로 바꿔준다
}
case 'CHANGE_AGE': //또 다른 action 처리를 정의
return {
...state,
age: action.data,
}
}
return { //새로운 객체 반환
...state,
name: action.data,
}
JavaScript에서 참조한 두 객체는 같은데 Redux는 매번 새로운 객체를 만들기 때문에 서로 다른 객체이다
{} === {} //false const a = {}; const b = a; a === b //true
//새로운 객체 만들기
const prev = { name: 'zerocho' }
const next = { name: 'boogicho' }
---
//기존 객체 참조
const next = prev;
next.name = 'bbogicho';
prev.name; // boogicho
return {
...state, // 바뀌지않는 부분은 예전 것 참조
name: action.data,
}
const next = { b: 'c' };
const prev = { a: next };
const next = { ...prev};
prev.a === next.a //true
prev === next //false
a
는 예전 것을 참조했기에 같은 객체로 본다