1주차에 보라님이 상수 데이터로 구현했던 nav 바의 카테고리 목록을 2주차에는 백엔드에서 주는 API 데이터로 교체해야하는 상황이 오게 되었다. 보라님의 코드에서 상수데이터를 API 데이터로 교체 + 내가 구현한 카테고리별 쿼리 파라미터 주소를 link 연결하는것이 목표이다.
구현 기능
상수데이터를 API 데이터로 교체 + 내가 구현한 카테고리별 쿼리 파라미터 주소를 link 연결하기 |
⭐Key Point
- API 데이터 분석
- map 메소드 이중으로 사용하여 카테고리 이름 표시
- 개별 링크 연결
Output
Code
🥕 API Data
${BASE_URL}/categories
더보기
{
"results": [
{
"category_id": 1,
"category_name": "샤워",
"sub_categories": [
{
"sub_category_id": 1,
"sub_category_name": "샴푸바"
},
{
"sub_category_id": 2,
"sub_category_name": "솝"
},
{
"sub_category_id": 3,
"sub_category_name": "샤워젤"
},
{
"sub_category_id": 4,
"sub_category_name": "배쓰밤"
},
{
"sub_category_id": 5,
"sub_category_name": "용품"
}
]
},
{
"category_id": 2,
"category_name": "보디",
"sub_categories": [
{
"sub_category_id": 6,
"sub_category_name": "바디 로션"
},
{
"sub_category_id": 7,
"sub_category_name": "바디 미스트"
},
{
"sub_category_id": 8,
"sub_category_name": "바디 오일"
},
{
"sub_category_id": 9,
"sub_category_name": "바디 스크럽"
}
]
},
{
"category_id": 3,
"category_name": "페이스",
"sub_categories": [
{
"sub_category_id": 10,
"sub_category_name": "폼 클렌징"
},
{
"sub_category_id": 11,
"sub_category_name": "팩"
},
{
"sub_category_id": 12,
"sub_category_name": "스킨"
},
{
"sub_category_id": 13,
"sub_category_name": "로션"
}
]
},
{
"category_id": 4,
"category_name": "헤어",
"sub_categories": [
{
"sub_category_id": 14,
"sub_category_name": "헤어 에센스"
},
{
"sub_category_id": 15,
"sub_category_name": "헤어 미스트"
},
{
"sub_category_id": 16,
"sub_category_name": "헤어 스프레이"
},
{
"sub_category_id": 17,
"sub_category_name": "드라이 샴푸"
}
]
}
]
}
🥕 Nav.js
더보기
import React, { Component } from 'react';
import { Link } from 'react-router-dom';
import { HiOutlineSearch } from 'react-icons/hi';
import { HiShoppingCart } from 'react-icons/hi';
import { FaUserCircle } from 'react-icons/fa';
import { API } from '../../config';
import { MENUS } from './NavData';
import '../Nav/Nav.scss';
export default class Nav extends Component {
constructor(props) {
super(props);
this.state = {
visible: false,
category: [],
};
}
onUpdateVisible = isVisible => {
this.setState({ visible: !isVisible });
};
componentDidMount() {
fetch(`${API.categories}`)
.then(res => res.json())
.then(data => {
this.setState({
category: data.results,
});
});
}
render() {
const { visible, category } = this.state;
return (
<nav onMouseLeave={() => this.onUpdateVisible(true)}>
<div className="innerNav">
<h1 className="logo">
<Link to="/productlist?category=1">
<img src="/images/logo.png" alt="wash korea logo" />
</Link>
</h1>
<div className="gnbWrapper">
<ul className="gnb">
{MENUS.map((menu, idx) => {
const isProductMenu = !(menu === '제품');
return (
<li
key={idx}
onMouseEnter={() => {
this.onUpdateVisible(isProductMenu);
}}
>
<Link to="/">{menu}</Link>
</li>
);
})}
</ul>
</div>
<div className="users">
<Link to="/">
<HiOutlineSearch className="icon" />
</Link>
<Link to="/">
<HiShoppingCart className="icon" />
</Link>
<Link to="/login">
<FaUserCircle className="icon" />
</Link>
</div>
</div>
{visible && (
<div className="lnbWrapper">
<div className="lnb">
{category.map(menu => {
return (
<ul className="SubMenu" key={menu.category_id}>
<li key={menu.category_id}>
<Link to={`/productlist?category=${menu.category_id}`}>
{menu.category_name}
</Link>
</li>
{menu.sub_categories.map(subMenu => {
return (
<li key={subMenu.sub_category_id}>
<Link
to={`/productlist?category=1&sub_category=${subMenu.sub_category_id}`}
>
{subMenu.sub_category_name}
</Link>
</li>
);
})}
</ul>
);
})}
</div>
</div>
)}
</nav>
);
}
}
반응형
'Web > React & Next.js' 카테고리의 다른 글
React 초기 세팅, CRA 세팅하기 (Router v6 / styled-component) (0) | 2022.01.05 |
---|---|
React | 카테고리 필터링, 동적 라우팅 기능 (0) | 2021.11.14 |
React | 상수 데이터 / mock data (0) | 2021.11.07 |
React | State & Props & Event (0) | 2021.10.31 |
React | Component 와 생명주기 (0) | 2021.10.26 |