
Root 컴포넌트에는 something 이라는 상태 값이 있고, onDoSomething 이라는 함수가 something 값에 변화를 준다.
onDoSomething 은 Root -> B -> H 로 전달되고, H 에서 이벤트가 발생하여 이 함수가 호출되면 something 이 Root -> A -> E -> F 로 전달된다.
props 가 필요한 곳으로 제대로 전달되게 하기 위하여, 실제로는 해당 props 를 사용하지 않는 컴포넌트를 거쳐가야 한다는 것은 리렌더링 하게 될 때 비효율적이기도하고, 굉장히 귀찮은 작업
리덕스가 있다면, 다음과 같은 구조로 작업을 진행 할 수 있게 됩니다.

앱이 지나고 있는 상태와 상태변화 로직이 들어있는 Store를 통하여 우리가 원하는 컴포넌트에 원하는 상태값과 함수를 직접 주입해줄 수 있게 된다.
{
type: "TOGGLE_VALUE"
}
function addTodo(data) {
return {
type: "ADD_TODO",
data
};
}
// 화살표 함수로도 만들 수 있습니다.
const changeInput = text => ({
type: "CHANGE_INPUT",
text
});

export const numberReducer = (state = initialState, action) => {
switch (action.type) {
// type에 따라 로직 구분
case "INCREASE":
//설정한 state를 수정 (store state 변경) 하고 결과를 바로 return한다.
return {
...state,
number: state.number + 1,
};
case "DECREASE":
return (state = {
...state,
number: state.number - 1,
});
case "INCREASE_FIVE":
return (state = {
...state,
number: state.number + action.data,
});
//그냥 값 호출
default:
return state;
}
};
리듀서는, 현재의 상태와, 전달 받은 액션을 참고하여 새로운 상태를 만들어서 반환합니다.


그렇게 호출을 하면, 스토어는 리듀서 함수를 실행시켜서 해당 액션을 처리하는 로직이 있다면 액션을 참고하여 새로운 상태를 만들어줍니다.
ex)
<button onClick={() => dispatch(increaseAction())}>증가하기</button>
<button onClick={() => dispatch(decreaseAction())}>감소하기</button>
<button onClick={() => dispatch(increaseOtherAction(5))}>5 더하기</button>
구독 또한 스토어의 내장함수 중 하나입니다. subscribe 함수는, 함수 형태의 값을 파라미터로 받아옵니다. subscribe 함수에 특정 함수를 전달해주면, 액션이 디스패치 되었을 때 마다 전달해준 함수가 호출됩니다.

1. submit을 눌렀을 때, 객체 하나를 전송한다. 이때 이 객체를 action이라고 한다.
2. 이 action은 dispatch에 전달된다.
3. dispatch는 2가지 일을 한다.
핵심은 state!!
state를 기반으로 화면을 그려준다는 것이고
state값에 직접 접근하면 안되기때문에 getState를 통해 값을 가져오고,
dispatch를 통해 값을 변경시키고
subscribe를 이용해서 값이 변동됬을때 구동될 함수들을 등록해준다는 것입니다.
reducer를 state값을 변경한다