반복되는 구조
레이아웃 형식은 그대로에 데이터만 바뀜
⇒ 컴포넌트로 구분
⇒ 레이아웃 및 스타일 (header, button)만 공통 style.js에서 관리하기
레이아웃 형식 그대로, 데이터도 바뀌지 않고 기능도 그대로
⇒ index.jsx에서 공통 스타일로 관리

만약, 페이지가 늘어나던가 줄어들면 어떻게하지?
⇒ 페이지별 반복되는 로직을 추상화화여 관리하기
# 페이지 구조
.
├── EssentialInfo.stories.jsx
├── EssentialInfo.style.js
├── SubPages
│ ├── BelongTeam.jsx
│ ├── EssentailCallback.jsx
│ ├── Introduction.jsx
│ ├── Nickname.jsx
│ ├── Portfolio.jsx
│ ├── ProfileImage.jsx
│ ├── SessionJob.jsx
│ ├── Skills.jsx
│ └── Slogan.jsx
└── index.jsx
바뀌는 컨텐츠는 react-router-dom의 nested router과 outlet을 활용했다.
// index.jsx
import React from 'react';
import { Outlet } from 'react-router-dom';
import Button from 'components/Common/Button';
import WithProvider from 'hoc/withProvider';
import EssentialFormProvider, {
useEssentialFormsAction,
} from 'contexts/EssentialForm/EssentialForm.Provider';
import * as S from './EssentialInfo.style';
export default WithProvider({ Provider: EssentialFormProvider, Component: EssentialInfo });
function EssentialInfo() {
const { handleClickNextButton, handleClickPrevButton } = useEssentialFormsAction();
return (
<S.Layout>
<S.DialogContainer>
<Button theme="none" customStyle={S.CloseButton}>
<S.CloseLarge />
</Button>
<S.AngleContainer>
<Button theme="none" customStyle={S.AngleButton} onClick={handleClickPrevButton}>
<S.LeftAngle />
</Button>
<Button theme="none" customStyle={S.AngleButton} onClick={handleClickNextButton}>
<S.RightAngle />
</Button>
</S.AngleContainer>
{/* Outlet === subPage */}
<Outlet />
</S.DialogContainer>
</S.Layout>
);
}
useEssentialForm.js에서 로직을 관리한다..
└── EssentialForm
├── EssentialForm.Provider.jsx
└── useEssentialForm.js
const essentailSubPagesRouteOrder = [
ESSENTIAL_INFO.NICKNAME,
ESSENTIAL_INFO.SKILL,
ESSENTIAL_INFO.PROFILE_IMAGE,
ESSENTIAL_INFO.SESSION_JOB,
ESSENTIAL_INFO.SLOGAN,
ESSENTIAL_INFO.BELONG_TEAM,
ESSENTIAL_INFO.CONTENT,
ESSENTIAL_INFO.PROTFOLIO,
ESSENTIAL_INFO.CALLBACK,
];
└── Common
├── SelectInput
├── TextArea
└── TextInput