프론트엔드 성장 과정 HTML : css >> JavaScript >>> DOM API >> XML(비동기통신) >> ajax >> SPA를 위한 angular, Vue, React 등장
JSON API와 목업을 디자이너로부터 받았다고 가정해 봅시다. 목업은 다음과 같을 것입니다.
JSON API는 다음과 같은 데이터를 반환 합니다.
[
{category: "Sporting Goods", price: "$49.99", stocked: true, name: "Football"},
{category: "Sporting Goods", price: "$9.99", stocked: true, name: "Baseball"},
{category: "Sporting Goods", price: "$29.99", stocked: false, name: "Basketball"},
{category: "Electronics", price: "$99.99", stocked: true, name: "iPod Touch"},
{category: "Electronics", price: "$399.99", stocked: false, name: "iPhone 5"},
{category: "Electronics", price: "$199.99", stocked: true, name: "Nexus 7"}
];
어떤식으로 단락을 짤지 먼저 생각을 해봐야 한다.
테크닉 : 단일 책임 원칙 (모든 클래스는 하나의 책임만 가지며, 클래스는 그 책임을 완전히 캡슐화해야 함을 일컫는다)
사용자와 interation 하는 섹션을 빼고 만들면 된다
중복배제원칙
애플리케이션을 올바르게 만들기 위해서는 애플리케이션에서 필요로 하는 변경 가능한 state의 최소 집합을 생각해보아야 합니다. 여기서 핵심은 중복배제원칙입니다. 애플리케이션이 필요로 하는 가장 최소한의 state를 찾고 이를 통해 나머지 모든 것들이 필요에 따라 그때그때 계산되도록 만드세요.
ex) TODO 리스트를 만든다고 하면, TODO 아이템을 저장하는 배열만 유지하고 TODO 아이템의 개수를 표현하는 state를 별도로 만들지 마세요.(이미 배열 안에 담긴 정보임) TODO 갯수를 렌더링해야한다면 TODO 아이템 배열의 길이를 가져오면 됩니다.
예시 : 애플리케이션 내 데이터들을 생각해봅시다. 애플리케이션은 다음과 같은 데이터를 가지고 있습니다.
* 제품의 원본 목록
* 유저가 입력한 검색어
* 체크박스의 값
* 필터링 된 제품들의 목록
각각 살펴보고 어떤 것이 state가 되어야 하는지 살펴 봅시다. 이는 각 데이터에 대해 아래 세 가지 질문을 통해 결정 할 수 있습니다.
앱에서 최소한으로 필요한 state가 뭔지 찾았으면 다음으로 어떤 컴포넌트가 state를 변경하거나 소유할지 찾아야 합니다.
React는 항상 컴포넌트 계층구조를 따라 아래로 내려가는 단방향 데이터 흐름을 따릅니다.어떤 컴포넌트가 어떤 state를 가질지 바로 결정하기 어려울 수 있습니다. 아래 과정을 따라 결정해 보세요.
어플리케이션이 가지는 각각의 state에 대해서
- state를 기반으로 렌더링하는 모든 컴포넌트를 찾으세요.
- 공통 소유 컴포넌트 (common owner component)를 찾으세요. (계층 구조 내에서 특정 state가 있어야 하는 모든 컴포넌트들의 상위에 있는 하나의 컴포넌트).
- 공통 혹은 더 상위에 있는 컴포넌트가 state를 가져야 합니다.
- state를 소유할 적절한 컴포넌트를 찾지 못하였다면, state를 소유하는 컴포넌트를 하나 만들어서 공통 소유 컴포넌트의 상위 계층에 추가하세요.
No.
만약 모든 state가 App에 묶여있으면 가장 아래에서만 쓰이는 state가 변경되어도 모든 컴포넌트가 리렌더링 되는 현상이 일어나서 매우 비효율적입니다. 이런 경우 state를 필요한 위치, 즉 사용되는 컴포넌트에서 관리하는 것이 더 효율적입니다.
최소한의 state를 가지도록 하라 는 React의 베스트 프랙티스를 따르는 것입니다. 필요 이상으로 많은 state를 가지면 애플리케이션의 복잡성이 높아질 뿐만 아니라, 불필요한 렌더링으로 인한 성능 저하를 초래할 수 있습니다.
그러므로 각 컴포넌트는 자신이 직접 관리해야 하는 state만을 가지고 dl
https://codesandbox.io/s/react-sagohagi-forked-wyxmt5?file=/src/App.js
컴포넌트 간의 통신이 필요한 경우, state를 lifting up하는 방식을 사용할 수 있습니다. 이는 상위 컴포넌트가 state를 가지고, state handler 함수를 하위 컴포넌트에 props로 전달하여 공유하는 방식입니다. 이렇게 함으로써 각 컴포넌트는 부모단의 state를 건드릴 수 있고, 상위와 하위 컴포넌트 간에 쉽게 데이터를 공유할 수 있습니다.
Component의 데이터 흐름은 단방향
이다.
출발점
이 되는 컴포넌트에서는 state 사용해 데이터를 관리한다. 이 state는 데이터의 변경을 추적하고, 이에 따라 UI를 업데이트 한다.데이터 흐름과 데이터가 어디서 시작 되는지를 기준으로 state와 props를 사용하면 된다