react axios fetch

Posted by : on

Category : react


axios

axios는 fetch API와 유사한 Promise 기반 HTTP 클라이언트 라이브러리로 데이터를 동적으로 받아올 수 있습니다. fetch API와 달리 third-party 라이브러리로 1) 별도의 설치 후 import 하거나 또는 2) html 파일에 jsDeliver CDN을 이용해 사용 가능합니다.

-----------------
npm install axios
-----------------
import React, { useState, useEffect } from "react";
import axios from "axios";
import { Link } from "react-router-dom";

function News() {
  const [data, setData] = useState([]);

  useEffect(() => {
    const fetchData = async () => {
      const res = await axios.get("https://jsonplaceholder.typicode.com/news");
      return res.data;
    };

    fetchData().then((res) => setData(res));
  }, []);

  return (
    <div>
      {data.map((d) => (
        <Link key={d.id} to={`${d.id}`}>
          {d.title}
        </Link>
      ))}
    </div>
  );
}

axios는 fetch API와 달리 json 객체로 변환해주는 과정을 자동으로 해줍니다. 그리고 위의 코드에서 axios.get 메서드를 활용해 데이터를 비동기적으로 받아올 수 있습니다. 단, 응답 받은 객체에 data key에 접근하여 접근한 값(res.data)을 반환해야 데이터를 활용 가능합니다.


비동기 fetch

const getData = async () => {
  const res = await fetch("url").then((res) => res.json());
};
//api

const getData = async () => {
  const res = await fetch("https://jsonplaceholder.typicode.com/comments").then(
    (res) => res.json()
  );

  const initData = res.slice(0, 20).map((itm) => {
    return {
      author: itm.email,
      content: itm.body,
      emotion: Math.floor(Math.random() * 5) + 1,
      create_date: new Date().getTime,
      id: dataId.current++,
    };
  });
  setData(initData);
};

useEffect(() => {
  getData();
}, []);

이렇게 useEffect에 빈배열을 넣어두면 렌더링 할 때 자동으로 타게된다.


useEffect + Promise 기반 API 호출 메서드 2가지 활용법

useEffect Hook을 활용하여, 컴포넌트가 최초 렌더링 후 mount될 때 한 번만 데이터를 동적으로 받아올 수 있도록 할 수 있습니다. 이 때, fetch 또는 axios를 이요해서 데이터를 받아옵니다.

서버 구축을 통한 데이터를 받아오기 어려운 상황에서, 다음의 사이트에서 fake API를 활용해 화면에 뿌려볼 수 있습니다.

01 fetch

import React, { useState, useEffect } from "react";
import { Link } from "react-router-dom";

function News() {
  const [data, setData] = useState([]);

  useEffect(() => {
    const fetchData = async () => {
      const res = await fetch("https://jsonplaceholder.typicode.com/news");
      const result = res.json();
      return result;
    };

    fetchData().then((res) => setData(res));
  }, []);

  return (
    <div>
      {data.map((d) => (
        <Link key={d.id} to={`${d.id}`}>
          {d.title}
        </Link>
      ))}
    </div>
  );
}

About 유재석
유재석

개발자 유재석 입니다. Web Developer.

Email : jaeseok9405@gmail.com

Website : https://github.com/yoo94