아래 문서는 Redux 공식문서를 바탕으로 공부한 내용을 정리한 것이다.
//Action 예시
{ type: 'ADD_TODO', text: 'Go to swimming pool' }
{ type: 'TOGGLE_TODO', index: 1 }
{ type: 'SET_VISIBILITY_FILTER', filter: 'SHOW_ALL' }
모든 State는 하나의 Store 안에 하나의 객체 트리 구조로 저장된다.
State를 변화시키는 유일한 방법은 무슨 일이 벌어지는지를 묘사하는 Action을 전달하는 방법 뿐이다.
Action에 의해 State 트리가 어떻게 변화하는 지를 지정하기 위해 순수 Reducer를 작성해야한다.
Action은 애플리케이션에서 스토어로 보내는 데이터 묶음.
store.dispatch()
메소드로 보낼 수 있다.
const ADD_TODO = 'ADD_TODO'
//type 속성의 value 값으로 문자열 상수를 주고 있다.
{
type: ADD_TODO,
text: 'Build my first Redux app'
}
type
속성을 필수적으로 가져야 한다. 일반적으로 문자열 상수로 정의된다.type
외의 Action 객체 구조는 사용자 정의에 따른다.액션 생산자는(Action Creators)는 Action을 생성하여 반환하는 함수
//액션 생성자(Action Creators)의 기본적인 모습
//Action을 만들어 반환하는 함수이다.
function addTodo(text) {
return {
type: ADD_TODO,
text
}
}
//실제로 액션을 보내기 위해서는 store.dispatch()메소드를 사용한다.
dispatch(addTodo(text))
dispatch(completeTodo(index))
//액션을 생성한 뒤 자동으로 보내주는 "바인드된 액션 생성자"를 사용할 수도 있다.
const boundAddTodo = text => dispatch(addTodo(text))
const boundCompleteTodo = index => dispatch(completeTodo(index))
Action은 무엇이 변화되었다는 사실만을 알려줄 뿐, Action만으로 애플리케이션의 상태가 변화하지는 않는다.
Prev State와 Action을 인자로 받아 애플리케이션의 상태를 변화시키는 순수 함수가 Reducer이다.
//가장 먼저 State 구조를 설계하고 시작하자.
{
visibilityFilter: 'SHOW_ALL',
todos: [{
text: 'Consider using Redux',
completed: true,
}, {
text: 'Keep all state in a single tree',
completed: false
}]
}
//전체적으로 이런 State구조를 만들겠다!! 하는 설계가 시작이다.
{
visibilityFilter:"String"
todos:[]
}
//Reducer의 기본형태
const reducer = (previousState, action) => newState
//이런 형태의 Reducer 함수를
//Array.prototype.reduce(reducer, initialValue)의 콜백함수로 넘길 것이기에
//Reducer라고 부른다.
Date.now()
나 Math.random()
과 같이 순수하지 않은 함수를 호출하기.//초기 State 구조
const initialState = {
visibilityFilter: "SHOW_ALL",
todos: []
}
//visibilityFilter 속성을 변경하는 Reducer
//이전 state와 action을 인자로 받고 있다.
//Object.assign()메소드를 이용해 새로운 State를 만든 다음 반환한다.
function todoApp(state = initialState, action) {
switch (action.type) {
case SET_VISIBILITY_FILTER:
return Object.assign({}, state, {
visibilityFilter: action.filter
})
default:
return state
}
}
state
는 변경하지 않았다. Object.assign()
을 통해 복사본을 만들었을 뿐이다.default
케이스에 대해 이전의 state
를 반환했다.