양방향 데이터 흐름
Model
에 데이터 정의, Controller
로 Model 데이터 CRUD, 변경된 데이터는 View
에 출력
대규모 프로젝트에서 데이터 변경 사항을 신속하게 전파하기 어려움 🙁
단방향 데이터 흐름
Action
- state를 변경할 수 있는 명령어와 같다.
- 새로 발생한 액션의 type
과 데이터 payload
로 구성됨
{type: "UPDATE_MATH", payload: ["A", "75"]}
- Dispatcher로 전달된다.
Dispatcher
- action 객체를 감지하는 순간 콜백함수로 Store에 전달된다.
Store (Model)
- state
와 state를 변경할 수 있는 method
를 가지고 있다.
- action type에 따라 무엇을 할지 결정하고, 상태를 변경한다.
View
- 컨트롤러 뷰: 스토어에서 변경된 데이터를 가져와 모든 자식 뷰에게 데이터를 분배한다.
- 데이터를 넘겨받은 뷰는 화면을 새로 렌더링한다.
View
에서 이벤트 발생action
생성 ➡ dispatch
함수의 인자로 전달됨Dispatch
는 action을 store
로 전달middleware
에서 처리하고 결과값을 reducer
로 dispatch 시킨다.view
로 전달되어 화면에 나타난다.상태를 수정하는 유일한 방법은 dispatch()
에 Action 객체를 담아 호출하는 것 뿐이다.
Action 객체는 plain 자바스크립트 객체!
ex. { type: "ADD_TODO", payload: { title: "do study", content: "react" } }
📕 상탯값 수정이라는 하나의 목적만 놓고 보면 불변 객체를 사용하는 것보다는 상탯값을 직접 수정하는 게 더 빠르다. 하지만 이전 상탯값과 이후 상탯값을 비교해서 변경 여부를 파악할 때는 불변 객체가 훨씬 유리하다. 상탯값 변경을 빠르게 확인할 수 있으면 메모이제이션과 같은 기능을 활용하기 좋고, 리액트의 렌더링 성능을 올리는 데도 유리하다. - 이재승, <실전 리액트 프로그래밍>, 251p
상태를 업데이트 할 때는 불변성을 지켜야 한다. 기존의 state를 기반으로 새로운 state를 생성하여 덮어 쓰는 방식(ex. Object.assign
or spread operator
)으로 복사본을 만들어 업데이트해야 한다.
setState([...state, newItem]);
순수함수란?
Side effect : 함수 외부의 state 혹은 behavior에 변화를 주는 것
Reducer
에서 action을 디스패치에서 받아와서 업데이트하기 전에 추가적인 작업을 할 수 있다.Context API
로도 충분!