Global State
를 특정 장소에서 저장해놓고 쉽게 불러 쓴다면 어떨까? 라는 생각에서 시작했다.프로젝트의 규모가 큰가?
Yes: 리덕스
No: Context API
2.비동기 작업을 자주 하게 되는가?
Yes: 리덕스
No: Context API
3.리덕스를 배워보니까 사용하는게 편한가?
Yes: 리덕스
No: Context API 또는 MobX
{
type: "TODDLE_VALUE"
}
{
type: "ADD_TODO",
data:{
id: 0,
text: '리덕스 배우기'
}
}
//actionTypes에 type들을 정의해놓고 import 해서 사용
import { ADD_TODO, REMOVE_TODO } from '../actionTypes'
export function addTodo(data) {
return {
type: 'ADD_TODO',
data
}
}
//화살표 함수
export const changeInput = text => ({
type: 'CHANGE_INPUT',
text
});
//addTodo를 담고 reducer로 향하는 dispatch열차
dispatch(addTodo(text))
const boundAddTodo = text => dispatch(addTodo(text))
boundAddTodo(text)
//기본로직
//현재의 상태와, 전달받은 액션을 참고하여 새로운 상태를 만들어 반환한다
//(이 리듀서는 useReducer를 사용할때 작성하는 리듀서와 똑같은 형태를 가지고 있다.
function reducer(state, action){
//상태 업데이트 로직
return alteredState;
}
----------------------------------
// state가 들어오지 않았을때 state에 initialState를 넣어주는 reducer
const initialState = {
todos: []
}
function todoApp(state, action) {
if (typeof state === 'undefined') {
return initialState
}
return state
}
//refactoring
function todoApp(state = initialState, action) {
return state
}
-------------------------
//카운터를 위한 리듀서 작성
function counter(state, action) {
switch (action.type) {
case 'INCREASE':
return state + 1;
case 'DECREASE':
return state - 1;
default:
return state;
}
}
👇 type이 여러 케이스 일 때
// todos자체가 reducer가 된다
function todos(state = [], action) {
switch (action.type) {
case ADD_TODO:
return [
...state,
{
text: action.text,
completed: false
}
]
case TOGGLE_TODO:
return state.map((todo, index) => {
if (index === action.index) {
return Object.assign({}, todo, {
completed: !todo.completed
})
}
return todo
})
default:
return state
}
}
const todoApp = combineReducers({
user,
todos
})
import { createStore } from 'redux'
import todoApp from './reducers'
const store = createStore(todoApp)
//createStore는 파라미터로 Reducer를 받는다
import {
addTodo,
toggleTodo,
setVisibilityFilter,
VisibilityFilters
} from './actions'
// Log the initial state
console.log(store.getState())
// Every time the state changes, log it
// Note that subscribe() returns a function for unregistering the listener
const unsubscribe = store.subscribe(() => console.log(store.getState()))
// Dispatch some actions
store.dispatch(addTodo('Learn about actions'))
store.dispatch(addTodo('Learn about reducers'))
store.dispatch(addTodo('Learn about store'))
store.dispatch(toggleTodo(0))
store.dispatch(toggleTodo(1))
store.dispatch(setVisibilityFilter(VisibilityFilters.SHOW_COMPLETED))
// Stop listening to state updates
unsubscribe()