Main
ProductDetail
- 진행기간 : 10/04 ~ 10/07
- 과제주관 : (주)비트바이트
- 참여명단 : 김민욱, 소재현, 손소희, 유광현, 정훈조, 조민재
- DEMO : DEMO
MISSION 1
- 저희 팀은 레이아웃을 구현하기 위해 Atomic Design 패턴의 Template 개념을 활용했습니다. Template는 안에 들어갈 내용, 데이터를 포함한 자식컴포넌트에 따라 크기와 모양에 영향을 받지 않습니다. 한마디로 내용이 없는 뼈대이며 자식 컴포넌트가 변형되거나 사라지더라도 레이아웃 그 형태는 유지 되어야 합니다.
function MainTemplate({
headerComponent,
descriptionComponent,
categoryTabComponent,
productListComponent,
footerComponent,
}) {
return (
<>
<HeaderContainer>{headerComponent}</HeaderContainer>
<Container>
<DescriptionWrapper>{descriptionComponent}</DescriptionWrapper>
<CategoryWrapper>{categoryTabComponent}</CategoryWrapper>
<ProductListWrapper>{productListComponent}</ProductListWrapper>
</Container>
<FooterContainer>{footerComponent}</FooterContainer>
</>
);
}
- 개발환경에서는 개발자가 개발의도에 맞게 UI를 테스트해보기 때문에 UI가 비정상적으로 작동하기 힘듭니다. 서비스를 배포하고 사용자의 예상하지 못한 사용에 에러가 나기 때문에 정상작동을 무조건 보장하기 위한 코드보다는 에러가능성을 줄이거나 즉시 유지보수가 가능한 코드를 작성하기 위해 노력했습니다.
//잘못된 state의 활용
const [isModal, setIsModal] = useState(false);
//이전 코드
const modalToggleFuntion = () => {
setIsModal(!isModal);
};
//수정 코드
const modalToggleFuntion = () => {
setIsModal((prev) => !prev);
};
function useFetchProductList(category) {
const [themeData, setThemeData] = useState([]);
useEffect(() => {
fetch(`https://api.plkey.app/theme?category=${category}`, {
method: 'GET',
})
.then((res) => res.json())
.then((data) => {
setThemeData(data);
});
}, [category]);
return themeData;
}
export default useFetchProductList;
- 반응형 웹디자인을 구현하기 위해 미디어쿼리를 사용했으며 Styled Component에서 제공하는 ThemeProvider 메소드를 통해 디바이스 규격을 통일했습니다.
//theme.js
...
const device = {
mobileS: `only screen and (max-width: 290px)`,
mobile: `only screen and (max-width: 450px)`,
tablet: `only screen and (max-width: 768px)`,
tabletL: `only screen and (max-width: 1024px)`,
};
//사용 예시
const Container = styled.div`
@media ${({ theme }) => theme.device.tabletL} {...
}
@media ${({ theme }) => theme.device.mobile} {...
}
@media ${({ theme }) => theme.device.mobileS} {...
}
MISSION 2
- 체험 종료 시 언마운트로 화면 깜빡임 발생하여 불쾌한 경험을 맞이할것으로 예상되어 점진적 언마운트
//Keyboard.organism.js
return (
<Overlay>
<Wapper toggle={state ? 'fadeIn' : 'fadeOut'} />
</Overlay>
);
const Wapper = styled.div`
...
animation: ${(props) => props.toggle} 0.9s;
`;