2016-09-07 6 views
9

한 페이지를로드하는 많은 API 요청에 따라 상당히 복잡한 앱으로 redux +를 구현하는 데 더 많은 시간이 소요됨에 따라 단일 컨테이너 구성 요소를 포함하는 것이 더 나은지 여부를 결정하는 데 문제가 있습니다. 모든 비동기 물건을 처리하고 벙어리 구성 요소로 소품을 전달하는 페이지, 필요로하는 데이터에만 관심을 갖고 필요한 데이터를 가져 오는 여러 컨테이너 구성 요소가 있습니다. 내가 앞뒤로 두 패턴 사이 사라하고 각각의 장점/단점이 있음을 발견했습니다리액턴스 Redux : 추가 컨테이너 v.s. 적은 컨테이너

  • 프로 : 나는 상단에 하나의 컨테이너 요소 넣으면

    모든 isFetching 소품 및 fetchSomeDependency() 작업을 한 곳에서 처리 할 수 ​​있습니다.

  • con : 정말 안좋은 단점은 여러 구성 요소를 통해 소품과 콜백을 전달해야한다는 것입니다. 트리 중간에있는 특정 구성 요소가이 부분에 묶여 있습니다. 여기

을 보여줍니다 문제를 시각적으로 예입니다 관계에 필요한 소품이 많다는 :

당신이 볼 수 있듯이, <MyModal /><MyModalContent /> 지금과는 아무 상관이없는 소품에 관심을해야
<MyContainer 
    data={this.props.data} 
    isFetchingData={this.props.isFetchingData} 
    fetchData={this.props.fetchData} 
> 
    {!isFetchingData && 
    <MyModal 
     someData={props.data} 
     fetchData={props.fetchData} 
     > 
     <MyModalContent 
     someData={props.data} 
     fetchData={props.fetchData} 
     > 
      <SomethingThatDependsOnData someData={props.someData} /> 
      <SomeButtonThatFetchesData onClick={props.fetchData} /> 
     </MyModalContent> 
     </MyModal> 
    } 
</MyContainer> 

그것은 모달로 보는 것은 재사용 될 수 있어야하고 오직 모달의 문체 적 자질에만 관심을 가져야한다.

처음에는 위의 것처럼 보였지만 일단 100 개가 넘는 구성 요소를 사용하게되면 모든 구성 요소가 매우 복잡하게 느껴지고 이러한 최상위 컨테이너 구성 요소의 복잡성이 너무 좋아서 너무 많아서 대부분의 것으로 보지 못했습니다. 내가 작업하고있는 앱에서) 3 개 이상의 API 요청에 대한 응답에 의존합니다.

  • 프로 :가 완전히 소품을 전달하는 필요성을 제거

    그런 다음 여러 개의 컨테이너를 사용하기로 결정했습니다. 그것은 어떤 경우에는 그것을하는 것이 여전히 이치에 맞지만, 훨씬 더 유연합니다.
  • 프로 : 리팩터링하기 쉬운 방법. 나는 두드러지게 움직이고 리팩토링하는 구성 요소가 무엇이든 파손될 수 있다는 것에 놀랐습니다. 반면에 다른 패턴에서는 많은 것들이 무너졌습니다.
  • pro : 각 컨테이너 구성 요소의 복잡성은 훨씬 적습니다. . 비동기 물건에 따라 모든 구성 요소는 항상 자체 isFetching 상태를 처리 할 필요가 : 내 mapStateToPropsmapDispatchToProps은에
  • 죄수의 구성 요소의 목적에 더 구체적이다. 이는 단일 컨테이너 구성 요소에서 처리되는 패턴에서 필요하지 않은 복잡성을 추가합니다.

그래서 주요 딜레마는 내가 하나의 컨테이너를 사용하는 경우, 내가 루트 컨테이너와 잎 구성 요소 사이의 부품이 취소 필요한 복잡성을 얻을 수 있다는 것입니다. 여러 컨테이너을 사용하는 경우 리프 구성 요소가 더 복잡해지고 단추가 걱정되지 않아도 isFetching에 대해 걱정할 필요가있는 단추가 생깁니다.

누구나 죄수를 피할 수있는 방법을 찾았습니까? 그렇다면이를 피하기 위해 따르는 "엄지 손가락 규칙"은 무엇입니까?

감사합니다.

답변

0

내가 항상 보았던 방식은 루트/앱 구성 요소가 아닌 논리적 구성 요소 그룹의 최상위 구성 요소에 컨테이너를 배치하는 것입니다.

그래서 우리는 결과를 표시하고 내가 SearchResults REDUX 인식 컨테이너를 만들 것 구성 요소 heiarchy는

<Root> <- setup the app 
    <App> 
    <Search/> <- search input 
    <Results/> <- results table 
    </App> 
</Root> 

을 가정 할 수있는 간단한 검색 응용 프로그램이있는 경우. 반응 성분은 으로 구성 될 수 있으므로이라고 가정합니다. 디스플레이가 Results 또는 Search 인 다른 구성 요소 나 페이지가있을 수 있습니다. 데이터 가져 오기 및 저장 인식을 루트 또는 앱 구성 요소에 위임하면 구성 요소가 서로/앱에 종속됩니다. 이렇게하면 변경 사항을 적용해야 할 때 줄 바꿈이 어려워 지므로 변경 사항을 사용하는 모든 장소를 변경해야합니다.

예외는 구성 요소간에 실제로 긴밀하게 연결된 논리가있는 경우입니다. 그렇다하더라도 서로 밀접하게 결합 된 구성 요소를 포장하는 컨테이너를 만들어야합니다. 왜냐하면 서로없이 사실적으로 사용될 수 있기 때문입니다.

0

단일 컨테이너 접근법을 사용하지 않을 것입니다. 그것은 거의 redux의 모든 장점을 무효화합니다. 상태가 모두 한 곳에 있고 콜백이 모두 한 곳 (루트 구성 요소)에 있으면 상태 관리 시스템을 가질 필요가 없습니다.

나는 걷는가는 선이 있다고 생각합니다. 나는 약 5 주간 (파트 타임) 앱을 만들고 있는데 지금은 3000 라인이 넘는다. 그것은 3 단계의 뷰 네 스팅, 나 자신을 구현 한 라우팅 메카니즘, 상태를 수정해야하는 10 단계 이상의 네 스팅 깊이의 컴포넌트를 가지고 있습니다. 나는 기본적으로 각각의 대형 스크린을위한 하나의 redux 컨테이너를 가지고 있으며 놀랍도록 작동합니다.

그러나 내 "클라이언트"보기를 클릭하면 내 클라이언트보기가 redux 컨테이너 안에 있고 소품으로 전달 된 클라이언트 목록을 얻으므로 클라이언트 목록이 정상적으로 나타납니다. 그러나 하나의 클라이언트를 클릭하면 개별 클라이언트의 프로파일에 대해 또 다른 redux 컨테이너를 수행하는 것을 주저합니다. 이는 소품을 전달하는 유일한 추가 레벨이기 때문입니다. 그것은 응용 프로그램의 범위에 따라, 당신은 redux 컨테이너 지나서 1-2 레벨까지 소품을 전달하고 그것이 더 이상이라면, 다음 또 다른 redux 컨테이너를 만들 수 있습니다 것 같습니다. 다시 말하면, 더 복잡한 앱이라면, 때로는 redux 컨테이너를 사용하는 것과 다른 것들을 사용하지 않는 다른 시간을 혼합하는 것은 유지 보수성을 위해 더 나쁠 수 있습니다. 요컨대, 필자의 의견으로는 가능한 한 어디서든지 redux 컨테이너를 최소화하려고 노력하고 있지만 복잡한 prop 체인을 희생해서는 안된다. 왜냐하면 그것은 redux를 사용하는 주된 포인트이기 때문이다.

+0

가 읽을 수있는 솔루션을 게시하시기 바랍니다 :

은이 문서를 참조하십시오. – Sachith

2

Redux 작성자 Dan Abramov는 필요할 때 컨테이너 구성 요소를 사용할 것을 제안합니다. 다시 말하면, 당신은 너무 많은 소도구 배선을 위아래로 btw로 갖게됩니다. 구성 요소는 컨테이너를 사용할 때입니다.

그는 이것을 "진행중인 리팩토링 프로세스"라고합니다. https://medium.com/@dan_abramov/smart-and-dumb-components-7ca2f9a7c7d0

관련 문제