리덕스 라이브러리가 어떤 방식으로 작동하는지 알아보자.
데이터들을 저장해놓는 공간으로 한 애플리케이션 당 하나의 스토어만 가진다. 스토어 안에는 현재 앱 상태인 state와 reducer 외 내장 함수들이 존재한다.
import구문을 이용해 리덕스에서 해당 함수를 불러올 수 있고, 함수의 파라미터에는 리듀스 함수가 필요하다.
단방향을 유지하기 위한 장치, state에 변화가 필요할 때 객체의 형태로 액션을 발생시킨다. 액션객체는 type필드를 반드시 가지고 있어야 하고 이 값은 액션의 이름이다. 액션의 이름은 주로 대문자로 작성하고 고유해야 한다.
스토어의 내장함수 중 하나로 액션을 발생시키는 역할을 한다.
dispatch(action)
-> 함수 안에 액션을 파라미터로 전달한다.
새로운 객체를 만들어서 store의 기존 state가 새로운 객체로 대체된다.
액션을 만들어서 발생시키면 리듀서는 현재 상태와 전달받은 액션 객체를 파라미터로 받아와서 새로운 상태를 반환해준다.
*액션과 리듀서는 짝꿍
//스토어 생성
const { createStore } from 'redux';
const store = createStore(reducer);
//리듀서 함수-액션 타입에 따라 다른 일을 처리
const reducer = (prevState, action) => {
switch (action.type) {
case "LOG_IN":
return {
...prevState,
user: action.data,
};
case "LOG_OUT":
return {
...prevState,
user: null,
posts: [],
};
case "ADD_POST":
return {
...prevState,
posts: [...prevState.posts, action.data],
};
default:
return prevState;
}
};
// 로그인 전, 게시글도 없는 초기상태 정의
const initialState = {
user: null,
posts: [],
};
const nextState = {
...initialState,
post: [action.data],
};
//게시물이 추가적으로 들어오는 경우
// const nextState = {
// ...initialState,
// post: [{ id: 1 }, { id: 2 }],
// }; =
const nextState = {
...initialState,
post: [...initialState.posts, action.data],
// 기존데이터 , 새로운 데이터
};
const store = createStore(Reducer, initialState);
// action함수 정의 - type은 액션의 이름
const login = (data) => {
return {
type: "LOG_IN",
data,
};
};
const logout = () => {
return {
type: "LOG_OUT",
};
};
const addPost = (data) => {
return {
type: "ADD_POST",
data,
};
};
store.dispatch(login({ id: 1, name: "mong", admin: true }));
store.dispatch(addPost({ userId: jyj, id: 1, content: "HI,there." }));
store.dispatch(addPost({ userId: jyj, id: 2, content: "nice" }));
store.dispatch(logout());
{ user:{id: 1, name: "mong", admin: true}, posts:[{ userId: jyj, id: 1, content: "HI,there." },{ userId: jyj, id: 2, content: "nice" } ] }
{user:null, posts:[]}
console.log 순서
//1. 로그인 하기 전
{user:null, posts:[]}
//2. 로그인 후
{ user:{id: 1, name: "mong", admin: true}, posts:[] }
//3. 게시물 1개 올렸을 때
{ user:{id: 1, name: "mong", admin: true},
posts:[{ userId: jyj, id: 1, content: "HI,there." } ] }
//4. 게시물 연속 올렸을 때
{ user:{id: 1, name: "mong", admin: true},
posts:[{ userId: jyj, id: 1, content: "HI,there." },
{ userId: jyj, id: 2, content: "nice" } ] }
//5. 로그아웃
{user:null, posts:[]}
리덕스 흐름: 기본값(state)에서 출발해서, state를 무엇으로 바꿀 것인지 정의해주는 action을 만들고, dispatch함수로 액션을 발생시키고 action을 받아서 reducer가 state를 새로운 객체로 만들어준다.