리액트를 사용할 때 올바른 방향으로 하고있는지 더 나은 방법은 없는지
의구심이 들었는데 예전에 읽으려고 했던 공문을 발견했다.
왜 이제야 봤는지 조금 후회가 됐지만.. 앞으로 개발하면서 참고하기 위해 요약해보았다!

[
{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"}
];단일 책임 원칙(SRP: Single Responsibility Principle)

FilterableProductTable(노란색) : 전체를 포괄한다.SearchBar(파란색) : 모든 유저의 입력을 받는다.ProductTable(연두색) : 유저의 입력을 기반으로 데이터 콜렉션을 필터링 해서 보여준다.ProductCategoryRow(하늘색) : 각 카테고리의 헤더를 보여준다.ProductRow(빨강색) : 각각의 제품에 해당하는 행을 보여준다.ProductTable 을 보면 테이블 헤더만을 가진 컴포넌트는 없다.ProductTableHeader 컴포넌트를 만드는 것이 더 합리적이다.
- FilterableProductTable
- SearchBar
- ProductTable
- ProductCategoryRow
- ProductRow
FilterableProductTable) 부터 만들거나 하층부에 있는 컴포넌트(ProductRow) 부터 만들 수 있다.React’s one-way data flow (단방향 데이터 흐름)
render() 메서드만 가지고 있다.FilterableProductTable)는 prop으로 데이터 모델을 받는다.ReactDOM.render()를 다시 호출해서 UI가 업데이트 된다.중복배제원칙(Don't repeat yourself)
애플리케이션에서 필요로 하는 가장 최소한의 state를 찾고 이를 통해 나머지 모든 것들이 필요에 따라 그때그때 계산되도록 만든다. 예를 들어 TODO 리스트를 만든다면, TODO 아이템을 저장하는 배열만 유지하고 TODO 아이템의 개수를 표현하는 state를 별도로 만들지 않는다. (배열의 길이를 가져오면 되기 때문)
예시 애플리케이션은 다음과 같은 데이터를 가지고 있다.
- 제품의 원복 목록
- 유저가 입력한 검색어
- 체크박스의 값
- 필터링 된 제품들의 목록
아래 세 가지 중 하나에 해당되면 state가 아니다.
- 부로로부터 props를 통해 전달되는 경우
- 시간이 지나도 변하지 않는 경우
- 컴포넌트 안의 다른 state나 props를 가지고 계산이 가능한 경우
예시 애플리케이션의 state는 다음과 같다.
- 유저가 입력한 검색어
- 체크박스의 값
제품의 원본 목록은 props를 통해 전달되며 필터링 된 목록은 다른 것들로부터 계산될 수 있기 때문에 state가 아니다.
ProductTable 은 state에 의존한 상품 리스트의 필터링해야 하고 SerarchBar 는 검색어와 체크박스 상태를 표시해야 한다.FilterableProductTable 이며 검색어와 체크 여부 state를 가지는 것이 타당하다.this.state = {filterText: '', inStockOnly: false} 를 FilterableProductTable의 constructor에 추가하여 초기 상태를 반영한다.filterText와 inStockOnly를 ProductTable와 SearchBar에 prop으로 전달한다.ProductTable의 행을 정렬하고 SearchBar의 폼 필드 값을 설정한다.FilterableProductTable 의 state를 업데이트할 수 있어야 한다.input 태그의 value 속성이 항상 props와 동일하도록 설정했기 때문에 체크하거나 타이핑할 경우 입력이 무시된다.FilterableProductTable는 SearchBar 에 콜백을 넘겨서 state가 업데이트되어야 할 때마다 호출되도록 한다.
👍