2차 프로젝트 코드 리뷰 중
Loading...
과 관련하여 담당 코치님께서 서스펜스 에 대해서 알아보면 좋을 것 같다고 조언을 해주셔서 이 내용을 공부하면서 정리해보았습니다.
: 비동기 작업을 진행하는 컴포넌트를 자식 컴포넌트로 가지며,
그 자식 컴포넌트가 비동기 작업을 진행하는 동안
fallback
에 할당받은 특정 컴포넌트를 렌더링 하는 역할을 합니다.
const SamplePage = () => {
return (
<Suspense fallback={<h1>Loading Title...</h1>}>
<TitleDetails />
<Suspense fallback={<h1>Loading posts...</h1>}>
<PostDetails />
</Suspense>
</Suspense>
);
};
export default SamplePage;
waterfall
현상const wrapPromise = (promise) => {
let status = "pending";
let response;
const suspender = promise.then(
(res) => {
status = "success";
response = res;
},
(err) => {
status = "error";
response = err;
}
);
const read = () => {
switch (status) {
case "pending":
throw suspender;
case "error":
throw response;
default:
return response;
}
};
return { read };
};
const fetchData = () => {
const promise = axios
.get("https://jsonplaceholder.typicode.com/photos")
.then((res) => res.data.slice(0, 10));
return wrapPromise(promise);
};
export { fetchData };
fetchData
를 call ( 즉, PostDetails 컴포넌트 외부에서 call ) 해준 뒤,
const resource = fetchData();
const PostDetails = () => {
// 비록 아직 불러오기가 완료되지 않았겠지만, 이미지 읽기를 시도합니다!
const example = resource.read();
return (
<ul>
{example.map((post, id) => (
<li key={id}>
<img src={post.url}></img>
</li>
))}
</ul>
);
};
아직
React Suspense
에 대한 정보들이 많지 않아서 이해하는데 어려움이 있었지만 개발자, 사용자 모두에게 이점을 제공하는 좋은 기술임을 느꼈습니다. 앞으로 좀 더 많은 활용 사례들이 나오길 바라며 이후에도 계속 공부하여 업데이트하겠습니다.