const Todos = () => {
const [todos, setTodos] = useState();
const [isLoading, setLoading] = useState(false);
const [isError, setError] = useState(false);
useEffect(() => {
setLoading(true);
fetch('http://some.api.com/todo')
.then((res) => setTodos(res))
.catch((error) => setError(true));
}, []);
if (error) {
return <p>Error !</p>
}
if (isLoading) {
return <p>Loading...</p>
}
return (
<ul>
{todos.map((todo) => (
<li key={todo.id}>{todo.content}</li>
)}
</ul>
);
}
const App = () => {
return <Todos />
}
제어의 역전
특정 로직(로딩 또는 에러 상태)에 따른 렌더링 제어권을 부모 컴포넌트에게 전가하고 현재 컴포넌트는 보여주고 싶은 화면에만 집중하는 방식
const Todos = () => {
const [todos, setTodos] = useState();
useEffect(() => {
fetch('http://some.api.com/todos')
.then((res) => setTodos(res));
}, []);
return <ul>
{todos.map((todo) => (
<li key={todo.id}>{todo.content}</li>
)}
</ul>;
}
const App = () => {
return <ErrorBoundary fallback={<p>Error !</p>}>
<Suspense fallback={<p>Loading...</p>}>
<Todos />
</Suspense>
</ErrorBoundary>
}