728x90
반응형
코드의 중복을 피하고 재사용성 높이기 위해 사용하는 함수
훅이란 것을 나타내기 위해 보통 use-로 명명함
컴포넌트와 마찬가지로 내부 훅인 useEffect, useState.. 모두 사용 가능함
일반 훅과는 다르게 리엑트에게 전달해줄 UI를 나타내는 요소들을 반환하지 않고
외부 컴포넌트에 공유할 데이터 정보를 리턴해준다.
✅값의 재사용이 아니라 로직을 재사용하는 개념이기 때문에 고정적인 값이 공유되는게 아님
import React, {useState, useEffect} from 'react';
export default function useProducts({salesOnly}) {
const [isLoading, setIsLoading] = useState(false);
const [error, setError] = useState(undefined);
const [products, setProducts] = useState([]);
useEffect(() =>
{
setIsLoading(true);
fetch(`${salesOnly ? 'data/sale_products.json' : 'data/products.json'}`)
.then((res) => res.json())
.then((data) => setProducts(data))
.catch((err) => setError(err))
.finally(() => setIsLoading(false))
}
,[salesOnly]);
return [isLoading, error, products];
}
import React,{useEffect, useState} from 'react';
import useProducts from '../hooks/use-products';
export default function Products() {
const [checked, setChecked] = useState(false);
const [isLoading, error, products] = useProducts({salesOnly : checked});
const handleChange = () => {
setChecked((prev) => !prev);
};
return (
<>
<input type='checkbox' value={checked} onChange={handleChange}></input>
<label htmlFor="checkbox">show Only Sale🔥</label>
<ul>
{isLoading? '...Loading' : products.map((item) => (
<li key={item.id}>
<article>
<h3>{item.name}</h3>
<p>{item.price}</p>
</article>
</li>
)) }
{error && <p>에러가 발생했음</p>}
</ul>
</>
);
}
728x90
'Frontend > React' 카테고리의 다른 글
[React] 리액트 라우터 (React Router) / 아울렛 (Outlet) (0) | 2023.02.09 |
---|---|
[React] 클래스 컴포넌트 (Class Component) (0) | 2023.02.07 |
[React] Context란? (2) | 2023.02.05 |
[React] 고유한 아이디 부여 라이브러리 (uuid) (1) | 2023.02.04 |
[React] 축약어로 함수 편하게 불러오기 [사용자 코드 조각 구성 설정 (snippets)] (0) | 2023.02.04 |