1. API ์ฐ๋์ ๊ธฐ๋ณธ
$ yarn add axios
- GET: ๋ฐ์ดํฐ ์กฐํ
- POST: ๋ฐ์ดํฐ ๋ฑ๋ก
- PUT: ๋ฐ์ดํฐ ์์
- DELETE: ๋ฐ์ดํฐ ์ ๊ฑฐ
import axios from 'axios';
axios.get('/users/1');
axios.get('https://jsonplaceholder.typicode.com/users');
axios.post('/users', {
username: 'blabla',
name: 'blabla'
});
useState์ useEffect๋ก ๋ฐ์ดํฐ ๋ก๋ฉํ๊ธฐ
useState: ์์ฒญ ์ํ ๊ด๋ฆฌ
- ์์ฒญ์ ๊ฒฐ๊ณผ
- ๋ก๋ฉ ์ํ
- ์๋ฌ
useEffect: ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง๋๋ ์์ ์ ์์ฒญ์ ์์
import React, { useState, useEffect } from 'react';
import axios from 'axios';
function Users() {
const [users, setUsers] = useState(null);
const [loading, setLoading] = useState(false);
const [error, setError] = useState(null);
const fetchUsers = async () => {
try {
// ์์ฒญ์ด ์์ ํ ๋์๋ error ์ users ๋ฅผ ์ด๊ธฐํํ๊ณ
setError(null);
setUsers(null);
// loading ์ํ๋ฅผ true ๋ก ๋ฐ๊ฟ๋๋ค.
setLoading(true);
const response = await axios.get(
'https://jsonplaceholder.typicode.com/users'
);
setUsers(response.data); // ๋ฐ์ดํฐ๋ response.data ์์ ๋ค์ด์์ต๋๋ค.
} catch (e) {
setError(e);
}
setLoading(false);
};
useEffect(() => {
fetchUsers();
}, []);
if (loading) return <div>๋ก๋ฉ์ค..</div>;
if (error) return <div>์๋ฌ๊ฐ ๋ฐ์ํ์ต๋๋ค</div>;
if (!users) return null;
return (
<>
<ul>
{users.map(user => (
<li key={user.id}>
{user.username} ({user.name})
</li>
))}
</ul>
<button onClick={fetchUsers}>๋ค์ ๋ถ๋ฌ์ค๊ธฐ</button>
</>
);
}
export default Users;
2. useReducer๋ก ์์ฒญ ์ํ ๊ด๋ฆฌํ๊ธฐ
์ฅ์ !
useState์ setState ํจ์๋ฅผ ์ฌ๋ฌ๋ฒ ์ฌ์ฉํ์ง ์์๋ ๋๋ค
๋ฆฌ๋์๋ก ๋ก์ง์ ๋ถ๋ฆฌํ์ผ๋ ๋ค๋ฅธ ๊ณณ์์๋ ์ฝ๊ฒ ์ฌ์ฌ์ฉํ ์ ์๋ค
3. useAsync ์ปค์คํ Hook ๋ง๋ค์ด์ ์ฌ์ฉํ๊ธฐ
useAsync(API ์์ฒญ์ ์์ํ๋ ํจ์, deps)
- deps ํ๋ผ๋ฏธํฐ๊ฐ ๋ฐ๋ ๋ ์๋ก์ด ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์จ๋ค
- ๊ธฐ๋ณธ๊ฐ์ [] => ์ปดํฌ๋ํธ๊ฐ ๊ฐ์ฅ ์ฒ์ ๋ ๋๋ง ํ ๋๋ง API๋ฅผ ํธ์ถํ๋ค
(+ ์ถ๊ฐ ๊ธฐ๋ฅ)
useAsync(API ์์ฒญ์ ์์ํ๋ ํจ์, deps, skip)
- skip=true๋ฉด useEffect์์ ์๋ฌด๋ฐ ์์ ๋ ํ์ง ์๋๋ก ์ค์ ํ๋ค (๊ธฐ๋ณธ๊ฐ์ false)
4. react-async๋ก ์์ฒญ ์ํ ๊ด๋ฆฌํ๊ธฐ
=> ๋งค๋ฒ ํ๋ก์ ํธ๋ฅผ ๋ง๋ค ๋ ๋ง๋ค ์ง์ ์์ฒญ ์ํ ๊ด๋ฆฌ๋ฅผ ์ํ ์ปค์คํ Hook์ ๋ง๋ค๊ธฐ ๊ท์ฐฎ๋ค๋ฉด ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์!
=> ์ปค์คํ Hook์ ๊ฒฐ๊ณผ๋ฌผ๋ก ๋ฐฐ์ด๋ก ๋ฐํ, ์ด Hook์ ๊ฐ์ฒด ํํ๋ก ๋ฐํ
$ yarn add react-async
import { useAsync } from "react-async"
const {data, error, isLoading, reload} = useAsync({promiseFn(ํธ์ถํ ํจ์), id})
(+ ์ถ๊ฐ ๊ธฐ๋ฅ)
useAsync({promiseFn(ํธ์ถํ ํจ์), id, watch})
- watch์ ํน์ ๊ฐ์ ๋ฃ์ด์ฃผ๋ฉด ์ด ๊ฐ์ด ๋ฐ๋ ๋๋ง๋ค promiseFn์ ๋ฃ์ ํจ์๋ฅผ ๋ค์ ํธ์ถํด์ค๋ค
(+ ๋ ๋๋งํ๋ ์์ ์ด ์๋ ์ฌ์ฉ์์ ํน์ ์ธํฐ๋ ์ ์ ๋ฐ๋ผ API๋ฅผ ํธ์ถํ๊ณ ์ถ์ ๋)
const {data, error, isLoading, run} = useAsync({deferFn(ํธ์ถํ ํจ์), id})
5. Context์ ํจ๊ป ์ฌ์ฉํ๊ธฐ
import React, { createContext, useContext } from 'react';
'โ๏ธ > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
React ๊ณต๋ถํ๊ธฐ(6) - ๋ฆฌ๋์ค(Redux) (0) | 2021.11.05 |
---|---|
React ๊ณต๋ถํ๊ธฐ(5) - ๋ฆฌ์กํธ ๋ผ์ฐํฐ (0) | 2021.11.05 |
React ๊ณต๋ถํ๊ธฐ(2) - styled-components (0) | 2021.10.15 |
React ๊ณต๋ถํ๊ธฐ(1) - Hooks ์ข ๋ฅํธ (0) | 2021.10.10 |
React ๊ณต๋ถํ๊ธฐ(1) - ์ํ๊ด๋ฆฌ ไธญ ๋ฐฐ์ดํธ (0) | 2021.10.10 |