Reactjs 에서 axios로 데이터 로딩시 more 버튼을 눌렀을시에 ~ 아래로 10개 더 로딩 하면서 계속 붙는 호출 하는 예제이다.
import React, { useState, useEffect } from "react"; import axios from "axios"; const App = () => { const [data, setData] = useState([]); const [offset, setOffset] = useState(0); const [loading, setLoading] = useState(false); useEffect(() => { const fetchData = async () => { setLoading(true); const res = await axios.get(`https://my-api.com/data?offset=${offset}&limit=10`); setData(prevData => [...prevData, ...res.data]); setLoading(false); }; fetchData(); }, [offset]); const handleLoadMore = () => { setOffset(prevOffset => prevOffset + 10); }; return ( <div> <h1>Data</h1> {data.map(item => ( <div key={item.id}>{item.title}</div> ))} {loading && <div>Loading...</div>} {!loading && data.length > 0 && ( <button onClick={handleLoadMore}>Load More</button> )} </div> ); }; export default App;
문제는 Uncaught TypeError: Cannot read properties of undefined (reading ‘data’) 오류가 나왔다.
그래서 ~ axios 쪽에서 오류 처리를 해주면서 데이터 값 setData를 안쪽으로 넣어주니 해결이 되었다.
import React, { useState, useEffect } from "react"; import axios from "axios"; const App = () => { const [data, setData] = useState([]); const [offset, setOffset] = useState(0); const [loading, setLoading] = useState(false); useEffect(() => { const fetchData = async () => { setLoading(true); const res = await axios .get(`https://my-api.com/data?offset=${offset}&limit=10`); .then((response) => { const { rows } = response.data; console.log(rows); setData((prevData) => [...prevData, ...rows]); }) .catch((error) => { console.error(error); }); setLoading(false); }; fetchData(); }, [offset]); const handleLoadMore = () => { setOffset(prevOffset => prevOffset + 10); }; return ( <div> <h1>Data</h1> {data.map(item => ( <div key={item.id}>{item.title}</div> ))} {loading && <div>Loading...</div>} {!loading && data.length > 0 && ( <button onClick={handleLoadMore}>Load More</button> )} </div> ); }; export default App;