redux는 크게 action, store, reducer로 구분된다.
store를 중심으로 돌아간다고 생각하면 쉽다.
npm i redux 명령어로 redux를 설치한 뒤
먼저 store 모듈부터 만들자.
const { createStore } = require('redux');
const reducer = require('./reducer');
const store = createStore(reducer);
module.exports = store;
// store.js로 저장
store를 만들 때 reducer라는 함수를 넣는 것을 볼 수 있다.
store에 저장된 값인 state를 변경할 때 이 함수를 사용하기 때문이다.
이를 위해 reducer 모듈도 만들자.
let lastId = 0; // id 값을 위한 변수
function reducer(state = [], action) { // 'state = []'는 state의 초기값
if(action.type === 'add') {
return [
...state,
{
id: lastId++,
description: action.description
}
];
} else {
return state;
}
}
module.exports = reducer;
// reducer.js로 저장
store에 저장된 값을 변경하려면 아래처럼 dispatch 메소드에
action인 객체를 넣어준다.
store.dispatch({
type: 'add',
description: 'first'
});
그러면 reducer 메소드가 실행되고
이 action의 type에 따라 store의 state에
새로운 배열이 저장된다.
여기서의 state는 store의 데이터를 담아두는 곳이라고 할 수 있다.
reducer는 pure function이어야 하기 때문에
값을 변경할 때 깊은 복사를 해야 한다.
그래서 아래처럼 복잡한 코드를 리턴한다.
return [
...state, // state 배열의 값을 deep 복사해 넣는다.
{ // 바뀌는 부분만 따로 선언해준다.
id: lastId++,
description: action.description
}
];
이렇게 store 모듈과 reducer 모듈을 마련해 놓고
다음과 같이 redux를 쓸 수 있다.
const store = require('./store');
const unsubscribe = store.subscribe(() => { // store가 변경될 때마다 호출
console.log('store가 변경됐습니다.');
console.log(store.getState()); // store에 저장된 값을 보여준다.
});
store.dispatch({ // add라는 action으로 reducer가 실행된다.
type: 'add', // type은 반드시 들어가야 한다.
description: 'first' // 이 부분부터는 자유롭게 고칠 수 있다.
});
// app.js로 저장
위 코드를 실행하면 다음의 값이 state에 들어간다.
[ { id: 0, description: 'first' } ]
위의 unsubscribe 변수에는 리턴 값으로 함수가 들어가게 되는데
unsubscribe();를 호출하면 그 아래 코드부터는 dispatch를 한다고 해도
store.subscribe 내부의 함수가 실행되지 않는다.
경우에 따라서 값을 보여줄 필요가 없을 때 쓴다.
'Redux' 카테고리의 다른 글
Redux Toolkit State를 리셋하는 방법 (0) | 2021.11.01 |
---|---|
Redux의 코드를 간결하게 해주는 @reduxjs/toolkit (0) | 2020.12.05 |
immutable하게 데이터를 수정하기 위한 라이브러리 - immer 사용법 (0) | 2020.04.25 |