※ 강의를 듣고 제가 이해한 내용을 바탕으로 정리한 것이라서 오류가 있을 수 있습니다.
react-async는 지난 포스트에서 만든 커스텀 훅 useAsunc와 비슷한 기능을 하는 함수가 들어 있는 라이브러리이다. 매번 프로젝트를 만들 때 마다 직접 요청 상태 관리를 위한 커스텀 Hook 을 만들기 귀찮다면 이 라이브러리를 사용하시면 된다.
사용법이 조금 다른데 저번에 만들었던 커스텀 훅은 결과물을 배열로 반환하는 반면 이 훅은 객체 형태로 반환 한다.
설치: npm install react-async
react-async 의 README 에 있는 공식 사용법을 보면 아래와 같다.
import { useAsync } from "react-async" const loadCustomer = async ({ customerId }, { signal }) => { const res = await fetch(`/api/customers/${customerId}`, { signal }) if (!res.ok) throw new Error(res) return res.json() } const MyComponent = () => { const { data, error, isLoading } = useAsync({ promiseFn: loadCustomer, customerId: 1 }) if (isLoading) return "Loading..." if (error) return `Something went wrong: ${error.message}` if (data) return ( <div> <strong>Loaded some data:</strong> <pre>{JSON.stringify(data, null, 2)}</pre> </div> ) return null }
react-async 의 useAsync 를 사용 할 때 파라미터로 넣는 옵션 객체에는 호출 할 함수 promiseFn 을 넣고
파라미터도 필드 이름과 함께 (customerId) 넣어주어야 한다.
User 컴포넌트 전환
User 컴포넌트를 react-async 의 useAsync 로 전환
User.js
import React from 'react'; import axios from 'axios'; import { useAsync } from 'react-async'; async function getUser({ id }) { const response = await axios.get( `https://jsonplaceholder.typicode.com/users/${id}` ); return response.data; } function User({ id }) { const { data: user, error, isLoading } = useAsync({ promiseFn: getUser, id, watch: id }); if (isLoading) return <div>로딩중..</div>; if (error) return <div>에러가 발생했습니다</div>; if (!user) return null; return ( <div> <h2>{user.username}</h2> <p> <b>Email:</b> {user.email} </p> </div> ); } export default User;
useAsync 를 사용할 때에는 아래와 같이 프로미스를 반환하는 함수의 파라미터를 객체형태로 해주어야 한다.
async function getUser({ id }) {}
이렇게 해야 id 값을 따로 받아와서 사용 할 수 있게 된다.
그리고 useAsync 를 사용 할 때 watch 값에 특정 값을 넣어주면 이 값이 바뀔 때마다 promiseFn 에 넣은 함수를 다시 호출해준다.
Users 컴포넌트 전환
Users.js
import React, { useState } from 'react'; import axios from 'axios'; import { useAsync } from 'react-async'; import User from './User'; async function getUsers() { const response = await axios.get( 'https://jsonplaceholder.typicode.com/users' ); return response.data; } function Users() { const [userId, setUserId] = useState(null); const { data: users, error, isLoading, reload } = useAsync({ promiseFn: getUsers }); if (isLoading) return <div>로딩중..</div>; if (error) return <div>에러가 발생했습니다</div>; if (!users) return <button onClick={reload}>불러오기</button>; return ( <> <ul> {users.map(user => ( <li key={user.id} onClick={() => setUserId(user.id)} style={{ cursor: 'pointer' }} > {user.username} ({user.name}) </li> ))} </ul> <button onClick={reload}>다시 불러오기</button> {userId && <User id={userId} />} </> ); } export default Users;
reload 함수를 사용하면 데이터를 다시 불러올 수 있다.
실행 결과

'개발 공부한 내용 정리 > React' 카테고리의 다른 글
React- 파라미터와 쿼리 (0) | 2020.10.21 |
---|---|
React- react router 프로젝트 준비 및 기본적인 사용법 (0) | 2020.10.20 |
React- useAsync 커스텀 Hook 만들어서 사용하기 (0) | 2020.10.18 |
React- useReducer 로 요청 상태 관리하기 (0) | 2020.10.17 |
React- API 연동의 기본 (0) | 2020.10.16 |