function getBazFromX(x) {
return x?.foo?.bar?.baz;
}
➡ 코드가 간결하다.
➡ 성공한 경우 x.foo.bar.baz
의 형태와 차이가 크지 않다.
const { data, error } = useAsyncValue(() => {
return fetchSomething();
});
function Profile() {
const foo = useAsyncValue(() => {
return fetchFoo();
})
}
if (foo.error) return <div>로딩에 실패했습니다.</div>
if (!foo.data) return <div>로딩중입니다...</div>
return <div>{foo.data.name}님 안녕하세요!</div>
💡 컴포넌트는 성공한 상태만 다루고, 로딩 상태와 에러 상태는 외부에 위임 → 동기적인 코드와 큰 차이가 없도록!
function FooBar() {
const foo = useAsyncValue(() => fetchFoo());
const bar = useAsyncValue(() => fethBar(foo));
return <div>{foo}{bar}</div>;
}
<ErrorBoundary fallback={<MyErrorPage />}> // Error
<Suspense fallback={<Loader />}> // Loading
<FooBar />
</Suspense>
</ErrorBoundary>
<App />
)에 한번에 감싸서 사용{suspense: true}
옵션 → 자동으로 Suspense 상태가 관리된다.