const lifeFriends = ["유리님", "가람님", "세용님", "영건님", "승호님"]
console.log( `${lifeFriends} 여러분들과 함께해서 즐거웠으며 행복한 2주였습니다. 팀 이름처럼 평생친구로 함께 하길~.` )
- 배운 기본기 및 react state, props 익숙해지기!
- 재활용 가능한 componet 활용하기
- 팀원간 커뮤니케이션 능력 향상시키기 (Front & Front , Front & Back )
유림님:
메인 페이지
,상세 페이지 리뷰
세용님:카테고리 페이지
,상세페이지 제품 상세설명
가람님:로그인 페이지
,회원가입 페이지
,제품 상세페이지 제품 결제 및 제품 장바구니
나:Nav Bar
,footer
,제품 상세페이지 제품 사진 미리보기
- Front-End : HTML,CSS, JavaScript (ES6+) React.js / Sass,
- Back-End : Python, Django,My SQL
- Common: Slack, Trello, GIT, GitHub (프론트엔드 github/백엔드 github)
CRA
초기 세팅 (팀원 다 같이)Nav bar
포함한 Header
, Footer
map
함수 및 backend와 통신하여 카테고리 메뉴 기능 구현localStorage
) token 사용하여 backend에서 로그인 정보(이름, 이메일) 받아 상태표시 기능 구현query String
을 이용한 카테고리 메뉴와 상품 리스트 페이지 Routing
fetch
를 사용한 제품 리스트, 카테고리 메뉴, 제품 Previw API
호출, 응답데이터 화면 구현foundation기간에 검색기능에 대해 시도해보았으나 실제 프로젝트에 적용하면서 더 익숙해지는 계기가 될 수 있었다. 코드는 아래와 같이 작성 하였다.
handleSearchValue
함수 선언하여 input에 입력되는 값을 state값으로 변경 handleSearchValue = e => {
this.setState({
searchValue: e.target.value,
});
};
render
이후에 filter
,include
,toLowerCase
메서드를 활용하여 검색필터사용 하였다. render() {
const filteredList =
this.state.categoryListData &&
this.state.categoryListData.filter(category => {
return (
category.menuName
.toLowerCase()
.includes(this.state.searchValue.toLowerCase()) && category
);
});
const filterLength = filteredList && filteredList.length;
onChange
에 위에서 선언해준 this.handleSearchValue
를 실행시켜주고 map
을 활용하여 searchbox에 나열되도록 하였다. <div className="searchBox">
<input
className="search"
type="text"
placeholder="검색어를 입력해보세요"
onChange={this.handleSearchValue}
/>
<button className="searchButton">
<i className="fas fa-search"></i>
</button>
<ul
className={`searchListContainer ${
this.state.searchValue && filterLength && 'open'
}`}
>
{filterLength > 0 &&
filteredList.map(category => {
return (
<li key={category.menuId}>
<div>
<Link
to={`/categories?menu=${category.menuName}`}
className="categoryName"
>
{category.menuName}
</Link>
Nav bar 가 쉬울거 같다고 생각했다. 그런데 생각보다 nav에는 다양한 기능과 특히 메뉴 더 보기
, 닫기
버튼과 메뉴 더 보여주기 기능 구현에 애를 먹었다. 구글링을 통하여 방법을 찾았고 해냈을때 1주차때 희열은 아직도 생생하다.
boolean
값으로 초기값은 false로 지정export class CategoryList extends React.Component {
constructor(props) {
super(props);
this.state = {
itemsToShow: 10,
expanded: false,
};
}
showMore
함수 선언을 해준다. 여기서 삼항연산자를 사용하여 true 일때 false일때 값을 지정해준다. showMore = () => {
const { eachCategoryList } = this.props;
this.state.itemsToShow === 10
? this.setState({ itemsToShow: eachCategoryList.length, expanded: true })
: this.setState({ itemsToShow: 10, expanded: false });
};
onClick
시 showMore
함수 실행 해준다. 그리고 11번째 부터 카테고리 메뉴들을 보여주는 code 입력해준다 (slice
, map
사용) <button
className="showMoreButton"
onClick={() => {
this.showMore();
}}
>
<span className="ShowMoreLess">
{this.state.expanded ? (
<span>
닫기<i className="fas fa-angle-up"></i>
</span>
) : (
<span>
더 보기<i className="fas fa-angle-down"></i>
</span>
)}
</span>
</button>
</div>
<div className="categoryListNextLine">
{eachCategoryList &&
eachCategoryList.slice(11, this.state.itemsToShow).map(menuObj => {
return (
<div key={menuObj.menuId} className="categoryMenuNextLine">
이번 프로젝트하면서 가장 기분 좋았던 순간은 바로 백에서 유저 정보를 받아왔을때였다. 로그인을 성공하면 localstorage
에 토큰을 저장하고 이를 바탕으로 fetch 를 통하여 user name과 email 정보를 받아 왔다. 그리고 로그아웃버튼 클릭시 localStorage.clear();
하여 로그아웃 기능 구현 하였다.
export class LoginAndLogout extends React.Component {
isAllInputValid = () => {
const tokenValue = localStorage.getItem('AUTHORIZATION');
// fetch('http://10.58.7.181:8000/users/user'
fetch(`${GET_AUTHORIZATION_API}`, {
method: 'GET',
headers: { AUTHORIZATION: tokenValue },
})
.then(res => res.json())
.then(res => {
if (res.message === 'SUCCESS') {
localStorage.setItem('user_name', res.user_info.user_name);
localStorage.setItem('user_email', res.user_info.user_email);
}
if (res.result === 'INVALID_USER') {
return alert('비밀번호 또는 이메일이 잘 못 되었습니다.');
}
});
};
changeLogout = () => {
localStorage.clear();
};
제품 사진 다음보기, 뒤로가기 버튼 구현, 작은 이미지 마우스 오버시 제품 미리보기 사진 변경 기능 구현
goToPreview
, goToNext
, changePicMouseOver
함수 선언하였다. changePicMouseOver
는 마찬가지로 마우스 오버가 되면 index 값을 조정하여 사진을 보여주었다. constructor() {
super();
this.state = {
imgIndex: 0,
};
}
goToPreview = e => {
const { imgIndex } = this.state;
const {
PreviewData: { images },
} = this.props;
const { className } = e.target;
const buttonName = className;
this.setState({
imgIndex:
buttonName === 'previousButton'
? imgIndex === images.length - 1
? 0
: imgIndex - 1
: imgIndex === 0
? images.length - 1
: imgIndex - 1,
});
};
goToNext = e => {
const { imgIndex } = this.state;
const {
PreviewData: { images },
} = this.props;
const { className } = e.target;
const buttonName = className;
this.setState({
imgIndex:
buttonName === 'nextButton'
? imgIndex === 0
? imgIndex + 1
: 0
: imgIndex === images.length - 1
? 0
: imgIndex + 1,
});
};
changePicMouseOver = (e, index) => {
this.setState({
imgIndex: index,
});
};
lifecycle
문제를 해결하면서 lifecycle 에 대한 이해를 한점git add . -> git commmit -> git push -> git pull -> git merge master
를 사용해서 하도록 노력 해야겠다.
special Thanks 도현 맨토님 (저 자리 들어오면 못나감 질문공세로)
평생 친구, 위코드 절친 준현님! 1차 프로젝트 정말 고생 많으셨어요! 준현님과 함께해서 더 즐거웠던 것 같아요!!