AJAX ์ APIs
์ด๋ป๊ฒ AJAX ํธ์ถ์ ํ ์ ์์๊น์?
์ ํธํ๋ AJAX ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ React์ ํจ๊ป ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ ๋ช ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก๋ Axios, jQuery AJAX, ๊ทธ๋ฆฌ๊ณ ๋ธ๋ผ์ฐ์ ์ ๋ด์ฅ๋ window.fetch ๋ฑ์ด ์์ต๋๋ค.
์ปดํฌ๋ํธ์ ์๋ช ์ฃผ๊ธฐ ์ค ์ด๋์์ AJAX ํธ์ถ์ ํ ์ ์๋์?
AJAX ํธ์ถ์ ํตํ ๋ฐ์ดํฐ๋ ์๋ช
์ฃผ๊ธฐ ๋ฉ์๋ ์ค componentDidMount
์์ ์ถ๊ฐ๋์ด์ผ ํฉ๋๋ค. ์ด๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ์ฌ ๋ setState
๋ฅผ ํตํ์ฌ ์ปดํฌ๋ํธ๋ฅผ ์
๋ฐ์ดํธํ๊ธฐ ์ํจ์
๋๋ค.
์์: ๋ก์ปฌ state๋ฅผ ์ค์ ํ๊ธฐ ์ํด AJAX ๊ฒฐ๊ณผ ์ฌ์ฉํ๊ธฐ
์๋ ์ปดํฌ๋ํธ๋ ๋ก์ปฌ ์ปดํฌ๋ํธ์ state๋ฅผ ์ฑ์ฐ๊ธฐ ์ํ์ฌ componentDidMount
์์์ ์ด๋ป๊ฒ AJAX ํธ์ถ์ ๋ง๋๋์ง ๋ณด์ฌ ์ค๋๋ค.
API ์์๋ ๋ค์๊ณผ ๊ฐ์ JSON ๊ฐ์ฒด๋ฅผ ๋ฐํํฉ๋๋ค.
{
"items": [
{ "id": 1, "name": "Apples", "price": "$2" },
{ "id": 2, "name": "Peaches", "price": "$5" }
]
}
class MyComponent extends React.Component {
constructor(props) {
super(props);
this.state = {
error: null,
isLoaded: false,
items: []
};
}
componentDidMount() {
fetch("https://api.example.com/items")
.then(res => res.json())
.then(
(result) => {
this.setState({
isLoaded: true,
items: result.items
});
},
// ์ฃผ์: ์ปดํฌ๋ํธ์ ์๋ ์ค์ ๋ฒ๊ทธ๋ก ์ธํด ๋ฐ์ํ ์์ธ๋ฅผ
// ๋์น์ง ์๊ณ ์ฒ๋ฆฌํ๊ธฐ ์ํด์๋
// catch() ๋ธ๋ก๋ณด๋ค๋ ์ฌ๊ธฐ์ ์๋ฌ๋ฅผ ๋ค๋ค์ฃผ๋ ๊ฒ ์ค์ํฉ๋๋ค.
(error) => {
this.setState({
isLoaded: true,
error
});
}
)
}
render() {
const { error, isLoaded, items } = this.state;
if (error) {
return <div>Error: {error.message}</div>;
} else if (!isLoaded) {
return <div>Loading...</div>;
} else {
return (
<ul>
{items.map(item => (
<li key={item.id}>
{item.name} {item.price}
</li>
))}
</ul>
);
}
}
}
์ด๋ ์๋์ฒ๋ผ Hook์ผ๋ก ์์ฑํ ์ฝ๋์ ๋์ผํฉ๋๋ค.
function MyComponent() {
const [error, setError] = useState(null);
const [isLoaded, setIsLoaded] = useState(false);
const [items, setItems] = useState([]);
// ์ฃผ์: ๋น deps ๋ฐฐ์ด []์
// useEffect๊ฐ componentDidMount()์ฒ๋ผ
// ํ ๋ฒ๋ง ์คํ๋๋ ๊ฑธ ์๋ฏธํฉ๋๋ค.
useEffect(() => {
fetch("https://api.example.com/items")
.then(res => res.json())
.then(
(result) => {
setIsLoaded(true);
setItems(result);
},
// ์ฃผ์: ์ปดํฌ๋ํธ์ ์๋ ์ค์ ๋ฒ๊ทธ๋ก ์ธํด ๋ฐ์ํ ์์ธ๋ฅผ
// ๋์น์ง ์๊ณ ์ฒ๋ฆฌํ๊ธฐ ์ํด์๋
// catch() ๋ธ๋ก๋ณด๋ค๋ ์ฌ๊ธฐ์ ์๋ฌ๋ฅผ ๋ค๋ค์ฃผ๋ ๊ฒ ์ค์ํฉ๋๋ค.
(error) => {
setIsLoaded(true);
setError(error);
}
)
}, [])
if (error) {
return <div>Error: {error.message}</div>;
} else if (!isLoaded) {
return <div>Loading...</div>;
} else {
return (
<ul>
{items.map(item => (
<li key={item.id}>
{item.name} {item.price}
</li>
))}
</ul>
);
}
}
Is this page useful?Edit this page