어플리케이션 상태 값 내장
상태 변화 필요시 액션이 전달되는 곳
상태 변화 일으킬 때 참조하는 객체
상태 변화 요구 스토어에 전달됨
액션을 스토어에 전달
상태 변화시키는 로직 존재 함수
스토어 액션 전달 받으면 상태 변경법 정하고, 액션 처리 후 새 상태 스토어에 저장
스토어 값이 필요한 컴포넌트는 스토어 구독함
스토어 안 상태가 변경되면 스토어를 구독하는 컴포넌트에 바로 전달
리덕스 파일 불러오기
{
type : "INSERT_TODO",
text : "리액트 공부"
}
{
type : "INSERT_TODO",
todo : {
id :1,
text:"리액트 배우기",
done : false
}
}
const INCREMENT="INCREMENT";
const DECREMENT ="DECREMENT";
const increment=(diff)=>({
type : INCREMENT,
diff:diff
});
const decrement=(diff)=>({
type :DECREMENT,
diff:diff
});
console.log(increment(1));
console.log(decrement(1));
액션 객체 기록 결과 :
switch
문 사용해 action.type
에 따라 새로운 상태 만들어 반환initialState
정의 필요함예시 [1] : 새 객체 생성해 그 안 number 키의 값을 0으로 설정하는 코드
state=initialState
:state
값이 undefined인 경우 initialState
을 기본값으로 사용action.type
따른 switch문://1. initialState 정의
const initialState={
number : 0
}
//2. 리듀서 함수 counter : 숫자 빼고 더하는 기능
function counter(state=initialState,action){
switch(action,type){
case INCREMENT:
return {number : state.number + action.diff};
case DECREMENT:
return {number : state.number - action.diff};
default:
return state;
}
}
예시 [2] : state의 값이 여러 개인 경우
Object.assign
실행 : 파라미터로 전달된 객체 순서대로 합쳐줌const initialState={
number :1,
foo:"bar",
baz:"qux"
}
function counter(state=initialState,action){
switch(action.type){
case INCREMENT:
return Object.assign({},state,{
number :state.number+action.diff
});
case DECREMENT:
return Object.assign({},state,{
number :state.number -action.diff
});
default:
return state;
};
}
전체 소스 코드
const INCREMENT="increment";
const DECREMENT="decrement";
const increment = (diff)=>({
type : INCREMENT,
diff : diff
});
const decrement=(diff)=>({
type : DECREMENT,
diff:diff
});
const initialState={
number :1,
foo:"bar",
baz:"qux"
};
function counter(state=initialState,action){
switch(action.type){
case INCREMENT:
return Object.assign({},state,{
number :state.number+action.diff
});
case DECREMENT:
return Object.assign({},state,{
number :state.number -action.diff
});
default:
return state;
};
};
console.log(counter(undefined,increment(1)));
console.log(counter(undefined,decrement(1)));
//원칙적으로는 리덕스 사용하기 때문에 이렇게 직접 리듀서 함수 실행하는 일 없음
액션 객체 기록 결과 :
스토어 생성 함수
import {createStore} from "redux";
/*jsbin에서는 const {createStore}=Redux; 이거 사용*/
const store = createStore(counter);
const unsubscribe =store.subscribe(()=>{
console.log(store.getState())
});
subscribe 함수
unsubscribe 함수
getState 함수
store.dispatch
사용Object.assign
사용시에도 메모리에 객체 누적 없음