728x90
반응형
[App.jsx]
import { useEffect, useState } from 'react';
import './App.css';
import axios from 'axios';
function App() {
const [todos, setTodos] = useState(null);
const fetchTodos = async () => {
const { data } = await axios.get('http://localhost:4002/todos');
setTodos(data);
};
useEffect(() => {
fetchTodos();
}, []);
return (
<div>
{todos.map((item) => {
return (
<div key={item.id}>
{item.id} : {item.title}
</div>
);
})}
</div>
);
}
export default App;
[원인]
데이터를 async + await로 가져오는 상황에서,
(1) 비동기함수가 실행되기 전에 return 아래 부분이 먼저 호출이 됨.
(2) 랜더링되고나서 비동기함수가 더 늦게 발생함.
(3) todos는 현재 데이터가 없어서 null일 수 있음.
[해결]
null값일 경우를 생각해서 map 메서드를 사용하는 구간에 옵셔널 체이닝 '?." 넣어주기
return (
<div>
{todos?.map((item) => {
return (
<div key={item.id}>
{item.id} : {item.title}
</div>
);
})}
</div>
);
▶ 옵셔널 체이닝 ?.
: ?. 앞의 평가대상이 null / undefined인 경우 평가를 멈추고 undefined를 반환
(1) 존재하지 않아도 괜찮은 대상에만 적용해야함 (에러 피하기 위해서 남용하다가 디버깅이 어려워질 수 있음)
(2) 옵셔널 체이닝 앞에 오는 변수는 선언되어있어야함.
반응형
'React' 카테고리의 다른 글
리액트 오류 : A component is changing a controlled input to be uncontrolled. (0) | 2023.11.28 |
---|---|
[리액트 심화] 비동기통신 Axios 사용방법 (GET 메소드 사용) (0) | 2023.11.28 |
[리액트 심화] HTTP 통신 / URL 구성 (1) | 2023.11.28 |
[리액트 심화] json-server 사용 방법 (+ 특정 포트 지정) (0) | 2023.11.28 |
[리액트 심화] Redux Toolkit 사용하기 (리덕스와 다른점 비교) (1) | 2023.11.28 |