ReactJS仮想DOMはかなり速いので、非同期呼び出しのために最大の読み込み時間がかかると仮定します。 React lifecycleイベントの1つで非同期コードを実行している可能性があります(componentWillMount
など)。
アプリケーションは、HTTP呼び出しに要する時間が空に見えます。ローダーを作成するには、非同期コードの状態を維持する必要があります。我々は我々のアプリで3つの異なる状態を持つことになりますReduxの
使用せず
が
例:
- REQUEST:データが要求されているが、まだロードされていないながら。
- SUCCESS:データが正常に返されました。エラーは発生しませんでした。
- FAILURE:非同期コードがエラーで失敗しました。
私たちはリクエスト状態ですが、スピナーをレンダリングする必要があります。データがサーバーから戻ったら、アプリケーションの状態をSUCCESS
に変更して、コンポーネントの再レンダリングをトリガーして、レンダリングをレンダリングします。 Reduxの を使用して
import React from 'react'
import axios from 'axios'
const REQUEST = 'REQUEST'
const SUCCESS = 'SUCCESS'
const FAILURE = 'FAILURE'
export default class Listings extends React.Component {
constructor(props) {
super(props)
this.state = {status: REQUEST, listings: []}
}
componentDidMount() {
axios.get('/api/listing/12345')
.then(function (response) {
this.setState({listing: response.payload, status: SUCCESS})
})
.catch(function (error) {
this.setState({listing: [], status: FAILURE})
})
}
renderSpinner() {
return ('Loading...')
}
renderListing(listing, idx) {
return (
<div key={idx}>
{listing.name}
</div>
)
}
renderListings() {
return this.state.listing.map(this.renderListing)
}
render() {
return this.state.status == REQUEST ? this.renderSpinner() : this.renderListings()
}
}
例あなたはかなりReduxのとThunkミドルウェアを使用して同様のことを行うことができます。
サンクミドルウェアでは、機能であるアクションを送信できます。したがって、非同期コードを実行することができます。ここでは、前の例と同じことをやっています:非同期コードの状態を追跡します。
export default function promiseMiddleware() {
return (next) => (action) => {
const {promise, type, ...rest} = action
if (!promise) return next(action)
const REQUEST = type + '_REQUEST'
const SUCCESS = type + '_SUCCESS'
const FAILURE = type + '_FAILURE'
next({...rest, type: REQUEST})
return promise
.then(result => {
next({...rest, result, type: SUCCESS})
return true
})
.catch(error => {
if (DEBUG) {
console.error(error)
console.log(error.stack)
}
next({...rest, error, type: FAILURE})
return false
})
}
}
ありがとうございますが、私はそれが私が探しているものではないと思います。ウェブサイトがロードされると(主索引ルート)、ページ間のロードは楽になります。私が達成しようとしているのは、ウェブサイトへの最初の接続時にアニメーションをロードすることです。私が何を意味するのか知っていれば幸いです – Shacrow