[ React ] Props Children 을 활용한 레이아웃 구조 개선

노도·2022년 4월 10일
0

Project. muzimakzi

목록 보기
5/5
post-thumbnail

정리한 내용을 옮겨서 뭔가 딱딱해 보이지만...ㅎㅎ

무인양품 사이트의 헤더 하단 콘텐츠는 고정된 넓이값 내에 aside 탭과 각 페이지별 콘텐츠를 렌더링 하는 방식 으로 제작되어 있다.

그렇기 때문에 저희 무지막지팀 역시 같은 방식으로 고정된 width값 내에 콘텐츠를 담는 방향으로 기획했다.

그러기 위해서는 aside와 각 페이지의 콘텐츠를 담을 하나의 Container가 필요했고, 해당 Container의 레이아웃을 통해 항상 같은위치에 렌더링할 필요가 있었다.

하지만 각각의 페이지 컴포넌트에 aside를 함께 담아 라우터 컴포넌트에서 라우팅할 경우, 페이지에 상관없이 같은 형태를 지니고 있는 aside가 불필요하게 새롭게 렌더링되어 표현되는 비효율성을 고려해야 했다.

따라서 라우터 컴포넌트내에서 div태그를 사용해 aside 컴포넌트와 각각의 페이지 컴포넌트를 감싸고 common.scss를 통해 레이아웃을 잡아주는 방식으로 진행했다.

const Router = () => {
  return (
    <BrowserRouter>
      <Nav />
      <div className="mainContainer">
        <Aside />
        <Routes>
          <Route path="/cart" element={<Cart />} />
          <Route path="/detail/:id" element={<Detail />} />
          <Route path="products/categories" element={<List />} />
          <Route path="products/categories/:id/types" element={<Gender />} />
          <Route path="/" element={<Landing />} />
        </Routes>
      </div>
    </BrowserRouter>
  );
};

하지만,

라우터 컴포넌트 내에 컴포넌트가 아닌 다른 요소가 들어가고 common.scss로 레이아웃을 잡는 구조가 좋지 못하다고 판단해 children 을 통해 다음과 같이 라우터의 구조를 개선하였다.

const Router = () => {
  return (
    <BrowserRouter>
      <Nav />
      <MainContainer>
        <Aside />
        <ContentsWrapper>
          <Routes>
            <Route path="/cart" element={<Cart />} />
            <Route path="/detail/:id" element={<Detail />} />
            <Route path="products/categories" element={<List />} />
            <Route path="products/categories/:id/types" element={<Gender />} />
            <Route path="/" element={<Landing />} />
          </Routes>
        </ContentsWrapper>
      </MainContainer>
    </BrowserRouter>
  );
};

aside 와 페이지 콘텐츠가 렌더링될 넓이 값 과 레이아웃을 적용할 MainContainer, aside영역을 제외한 영역의 넓이값을 적용할 ContentsWrapper 컴포넌트를 생성해 해당 컴포넌트의 children으로 aside와 각 페이지 컴포넌트를 입력해 주었다.

다음과 같은 구조 변경으로 라우터의 구조를 개선함과 함께 라우터자체에 레이아웃을 적용하지 않고도 컴포넌트를 자유롭게 배치할 수 있었다.


마지막으로 ,,

< 오늘도 개똥이는 성장한다 !  >
profile
유연한 사고로 빠르게 습득하기.

1개의 댓글

comment-user-thumbnail
2022년 4월 10일

너무나 좋은코드네요! 잘보았어요 개똥님~! 다음에는 이러한 중첩라우팅을 위해 v6 에서나온 outlet 기능을 이용한번 해보셔도 좋을꺼같아요!

답글 달기