더북(TheBook)

코드를 저장한 뒤 NewsList 컴포넌트에서 usePromise를 사용해 보세요.

components/NewsList.js

import React from 'react';
import styled from 'styled-components';
import NewsItem from './NewsItem';
import axios from 'axios';
import usePromise from '../lib/usePromise';
 
const NewsListBlock = styled.div`
  (...)
`;
 
const NewsList = ({ category }) => {
  const [loading, response, error] = usePromise(() => {
    const query = category === 'all' ? '' : `&category=${category}`;
    return axios.get(
      `https://newsapi.org/v2/top-headlines?country=kr${query}&apiKey=0a8c4202385d4ec1bb93b7e277b3c51f`,
    );
  }, [category]);
 
  // 대기 중일 
  if (loading) {
    return <NewsListBlock>대기 ...</NewsListBlock>;
  }
 
  // 아직 response 값이 설정되지 않았을 
  if (!response) {
    return null;
  }
  // 에러가 발생했을 
  if (error) {
    return <NewsListBlock>에러 발생!</NewsListBlock>;
  }
 
  // response 값이 유효할 
  const { articles } = response.data;
  return (
    <NewsListBlock>
      {articles.map(article => (
        <NewsItem key={article.url} article={article} />
      ))}
    </NewsListBlock>
  );
};
 
export default NewsList;

 

usePromise를 사용하면 NewsList에서 대기 중 상태 관리와 useEffect 설정을 직접 하지 않아도 되므로 코드가 훨씬 간결해집니다. 요청 상태를 관리할 때 무조건 커스텀 Hook을 만들어서 사용해야 하는 것은 아니지만, 상황에 따라 적절히 사용하면 좋은 코드를 만들어 갈 수 있습니다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.