๋ฐ๋ณต๋๋ useState์ useEffect ๋ฑ์ ํจํด์ ์ปค์คํ Hook์ ๋ง๋ค์ด ์ฌ์ฉํ๋ค.

Hook ํด๋ ๋ด์ useData.js๋ฅผ ์์ฑํ๋ค.
์์ js์ ๊ฒฝ์ฐ์๋ jsx์ผ๋ก ์ํด๋๋จ
import { useEffect, useState } from 'react';
import apiClient from '../utils/api-client';
const useData = (url) => {
const [data, setData] = useState([]);
const [error, setError] = useState('');
useEffect(() => {
apiClient
.get(url)
.then((res) => setData(res.data))
.catch((err) => setError(err.message));
}, []);
return { data, error };
};
export default useData;
์ด ์ปค์คํ Hook์ ์ฌ์ฉํด์ ProductsSidebar.jsx ์์
import "./ProductsSidebar.css";
import LinkWithIcon from "../Navbar/LinkWithIcon";
import useData from "../../Hook/useData";
const ProductsSidebar = () => {
const { data: categories, error } = useData("/category");
return (
<aside className="products_sidebar">
<h2>์นดํ
๊ณ ๋ฆฌ</h2>
<div className="category_links">
{error && <em className="form_error">{error}</em>}
{categories &&
categories.map((category) => (
<LinkWithIcon
key={category._id}
title={category.name}
link={`products?category=${category.name}`}
emoji={`http://localhost:5000/category/${category.image}`}
sidebar={true}
/>
))}
</div>
</aside>
);
};
export default ProductsSidebar;
๋ณ๊ฒฝ ํ ์ ์์ถ๋ ฅ๋๋์ง ํ์ธํ๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก ProductsList.jsx์๋ ์ ์ฉ
import useData from "../../Hook/useData";
import ProductCard from "./ProductCard";
import "./ProductsList.css";
const ProductsList = () => {
//useDate(url)์ด ๋ค์ด๊ฐ์ผํจ
//๊ฒฐ๊ณผ(res)๋ categories์, error์ ๋ด๋๋ค.
const { data, error } = useData("/products");
return (
<section className="products_list_section">
<header className="align_center products_list_header">
<h2>์ํ๋ชฉ๋ก</h2>
<select name="sort" id="" className="products_sorting">
<option value="">์ ๋ ฌ๋ฐฉ๋ฒ</option>
<option value="price desc">๊ฐ๊ฒฉ๋์์</option>
<option value="price asc">๊ฐ๊ฒฉ๋ฎ์์</option>
<option value="rate desc">ํ์ ๋์์</option>
<option value="rate asc">ํ์ ๋ฎ์์</option>
</select>
</header>
<div className="products_list">
{/* ์๋ฌ๊ฐ ์์ ๊ฒฝ์ฐ ์๋ฌ ํ์ */}
{error && <em className="form_error">{error}</em>}
{/* products๊ฐ ์์ ๊ฒฝ์ฐ ๋ฐ๋ณต๋ฌธ์ผ๋ก ์ถ๋ ฅ */}
{data.products &&
data.products.map((product) => (
<ProductCard
key={product._id}
id={product._id}
title={product.title}
image={product.images[0]}
price={product.price}
rating={product.reviews.rate}
ratingCounts={product.reviews.counts}
stock={product.stock}
/>
))}
</div>
</section>
);
};
export default ProductsList;
์๋ฌ์๋์ง ํ์ธํ๋ค.
'FRONTEND > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [myCart] ์นดํ ๊ณ ๋ฆฌ ๋ณ ์ํ ์ถ๋ ฅ (0) | 2023.12.20 |
|---|---|
| [myCart] ๋ฆฌ์กํธ ๋ก๋ฉ ์ค์ผ๋ ํค ์ ์ฉ (0) | 2023.12.20 |
| [myCart] ๋ฆฌ์กํธ ๋ผ์ฐํฐ ์ ์ฉ / axios์ค์น ํ ๋ฐฑ์๋ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ (0) | 2023.12.20 |
| [myCart] ๋ชฝ๊ณ DB /๋ฐฑ์๋ ์คํ (0) | 2023.12.20 |
| [myCart] ํ์๊ฐ์ ํ์ด์ง // ํ๋กํ ์ค์ (0) | 2023.12.19 |