データの取得方法
14882 ワード
データを取得したいときには、約束を取り扱っています. 約束は解決し成功だ その約束は解決されて失敗した 約束は保留状態にある このようにして、私たちのコードはどのように高レベルになるでしょう.
これが
の定義で見ましょう
完了のために、の定義で見ましょう
あなたが見ることができるように、反応18
あなたが見ることができるように、それは最初にレンダリング
ErrorBoundary
コンポーネントSuspense component
) function App() {
return (
<>
<ErrorBoundary>
<Suspense fallback={<h1>Loading blog...</h1>}>
<BlogPost resource={resource1} />
<Share />
</Suspense>
</ErrorBoundary>
</>
);
}
BlogPost
それは約束の状態を読むコンポーネントです.function BlogPost({resource:{read}}) {
const {title,body} = read();
// ...
どこresource
関数によって生成されるオブジェクトですcreateResource
:const resource1=createResource(fetchPosts(0))
の定義を見てみましょうcreateResource
:function createResource(promise){
let error,response
promise.then(r=>response=r).catch(e=>(error=e))
return {
read(){
if(error)throw error
if(response) return response
throw promise
}
}
}
ご覧の通りread
関数は、プロミス、エラー、または応答の成功を返すことができます.それは約束は、キャッチされますSuspense
コンポーネントとフォールバック支柱をレンダリングします.このエラーはErrorBoundary
私たちがSECで見るつもりであるコンポーネント、そしてErrorScreen
コンポーネント.約束が正常に解決されると、Suspense
が表示されます.これが
ErrorBoundary
コンポーネントimport {Component} from 'react'
function ErrorScreen({error:{message}}){
return <div>
Something went wrong: {message}
</div>
}
class ErrorBoundary extends Component{
state={error:null}
static getDerivedStateFromError(e){
return {error:e}
}
render(){
const {children,fallback}=this.props
const {error}=this.state
if(error&&!fallback)return <ErrorScreen error={error} />
if(error)return <fallback error={error} />
return children
}
}
export default ErrorBoundary
ご覧のように、それはSuspense
一つは、Afallback
この場合、デフォルトはErrorScreen
コンポーネント.の定義で見ましょう
fetchPosts()
機能
let blogPosts = [
{
id: 1,
title: 'qui est esse',
body: 'est rerum tempore vitae\nsequi sint nihil reprehenderit'
},
];
export function fetchPosts(id) {
let post = blogPosts[id];
return new Promise((resolve) => {
setTimeout(() => {
console.log("fetched blogs");
resolve(post);
}, 2000);
});
}
我々が見ることができるように、それは約束を返します.完了のために、の定義で見ましょう
BlogPost
and Share
コンポーネントfunction Share() {
useEffect(() => {
console.log("Effect Share");
return () => {
console.log("Cleanup Share");
};
});
console.log("Render Share");
return (
<div>Share:
<span> twitter</span>
<span> reddit</span>
</div>
)
}
function BlogPost({resource:{read}}) {
const {title,body} = read();
useEffect(() => {
console.log("Effect BlogPost");
return () => {
console.log("Cleanup BlogPost");
};
});
return (
<div>
<h1>Blog Post</h1>
<h3>{title}</h3>
<span>{body}</span>
</div>
);
}
そして、これはアプリケーションを実行するときのコンソール上の出力です.あなたが見ることができるように、反応18
Share
コンポーネントはBlogPost
準備ができています.なぜなら、彼らはすべての子供たちに属しているからですSuspense
コンポーネント.私たちが代わりに反応17を使用するならば、これはコンソールの出力です:あなたが見ることができるように、それは最初にレンダリング
Share
約束を解決する前に、そして、約束が正常に解決されたあと、それはBlogPost
コンポーネント.Reference
この問題について(データの取得方法), 我々は、より多くの情報をここで見つけました https://dev.to/roggc/how-to-fetch-data-in-react-with-suspense-and-errorboundary-3k86テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol