AJAX API Troika:AxiosとjQueryおよびFetch
Ajax Api Troika Axios Vs
同様のものを使用した場合Angular
フレームワークの経験から、これらのフレームワークは、HTTP呼び出しを行うためのサービス(Angular
中間$HTTP
)など、アプリケーションに必要なすべての機能を統合していることがわかります。
React
ユーザーインターフェイスを構築するためのビューレイヤーフレームワークです。でMVC
アーキテクチャでは、ビュー部分のみを担当します。実際の開発プロセスでは、今日言うことなど、いくつかのサードパーティコンポーネントを導入する必要があることがよくあります。AJAX API
。
この記事では、簡単な例を使用して、さまざまな方法(Axios
、XMLHttpRequest
またはfetch API
など)で学習し、AJAX
を実行します。データを取得、作成、更新、および削除するための要求(GET、POST、PUT、およびDELETE)。
AJAX API
多くの解決策があります、あなたがしなければならないのは正しい解決策を選ぶことだけです:
1ペアJavaScript
中Promise
より身近な、使用することができます Axios 。
2、最先端の標準を使用するように、あなたは使用することができますfetch API
。
3、使用することもできますjQuery
、ただし、API呼び出しのためだけにライブラリ全体を導入することはお勧めしません。
直接使用できます XMLHttpRequest インターフェース。
FetchAPIの例
使用をお勧めしますcreate-react-app
多くの構成を保存するため、アプリケーションを作成します。
npm install -g create-react-app Copy code
次のコマンドを実行して、アプリを作成して起動します。react-ajax-demo
create-react-app react-ajax-demo cd react-ajax-demo npm start Copy code
フェッチAPI
以下に引用 Mozilla MDN :
Fetch APIは、リソース(クロスドメインを含む)を取得するためのインターフェイスを提供します。 XMLHttpRequestを使用したことのある人なら誰でも簡単に始めることができますが、新しいAPIはより強力で柔軟な機能セットを提供します。
Redditに投稿されたいくつかの投稿を読んでくださいsrc/App.js
:
import React, { Component } from 'react' import logo from './logo.svg' import './App.css' class App extends Component { constructor(props) { super(props) this.state = { posts: [] } } fetchFirst(url) { var that = this if (url) { fetch('https://www.reddit.com/r/' + url + '.json').then(function (response) { return response.json() }).then(function (result) { that.setState({ posts: result.data.children, lastPostName: result.data.children[result.data.children.length - 1].data.name }) console.log(that.state.posts) }) } } componentWillMount() { this.fetchFirst('reactjs') } render() { return ( <div className='App'> <header className='App-header'> <img src={logo} className='App-logo' alt='logo' /> <h1 className='App-title'>React AJAX Exampleh1> header> <p className='App-intro'> <ul> {this.state.posts.map(post => <li key={post.id}>{post.title}li> )} ul> p> div> ) } } export default App Copy code
でfetchFirst()
このメソッドでは、GETリクエストを開始しました。
fetch('https://www.reddit.com/r/' + url + '.json').then(function (response) { return response.json() }).then(function (result) { console.log(result.data.children) }) Copy code
APIはシンプルで、必要なパラメーターはリソースのURIだけです。ここではJSONファイルですが、画像やその他のタイプなど、任意のタイプのリソースにすることもできます。
** fetch(url)**は、デフォルトでGETHTTPリクエストを送信します。
2番目のパラメーターでメソッド名を指定することにより、POST、PUT、DELETEなどの他のHTTPメソッドを呼び出すこともできます。
たとえば、fetch()
を使用しますPOSTリクエストを送信します。
var form = new FormData(document.getElementById('login-form')) fetch('/login', { method: 'POST', body: form }) Copy code
AJAXAPI呼び出しのタイミング
典型的なReact
アプリケーションは、ルートコンポーネント、親コンポーネント、および子コンポーネント(および子コンポーネントの子コンポーネント)を含むコンポーネントのコレクションであり、ツリー構造として表示できます。
ここには多くの問題があります:1。データを処理する方法は? 2.データはコンポーネントから他のコンポーネントにどのように流れますか? 3、最も重要なことは、非同期リクエストのコードをどこに置くかです。
componentWillMount()
これはReactライフサイクルの重要なイベントであり、コンポーネントが最初にレンダリングされる前にコンポーネントがマウントされようとしているときに実行タイミングが呼び出されます。
前の例では、componentWillMount()
にいます。内部で開始AJAX
リクエスト。
実際にこれを行うことができるいくつかの場所があります:
1、componentDidMount()
:これは公式の推奨場所です
2、componentWillMount()
:公式は推奨していません
3、constructor()
:アンチパターンと見なされます!しかし、それは次のようになりますcomponentWillMount()
同じものを使用してください。
componentDidMount()とcomponentWillMount()
componentWillMount()
このメソッドは、コンポーネントの最初のレンダリングの前に呼び出されます。誰もがこれがデータを取得するのに最適な場所であると誤って考えました。しかし、そうではありません!なぜならfetch
呼び出しは非同期です。つまり、コンポーネントがレンダリングされる前に非同期要求が返されない可能性があります。一般的なアプローチは次のとおりです。constructor()
React
の順序で初期状態を設定しますコンポーネントは正しくレンダリングでき、非同期要求が戻った後にコンポーネントが再レンダリングされます。
componentDidMount()
このメソッドは、コンポーネントが最初にレンダリングされた後に呼び出されるため、サーバーデータを取得したり、DOMを操作したりするために、ここで非同期コードを安全に実行できます。
サーバー側のレンダリングを実装する場合、componentWillMount()が2回呼び出されるため、サーバーへの要求が2つあり、これは無駄です。また、componentDidMount()は、クライアントで1回だけ呼び出されます。
上記の例に次の変更を加えました。
componentDidMount() { this.fetchFirst('reactjs') } Copy code
componentWillMount()とコンストラクター
プログラムの観点から、使用することは可能ですかconstructor
交換componentWillMount()
?
表面的にはそれは確かに代替手段ですが、それは正しい方法ではありません。
純粋関数を学んだ場合、非同期要求は副作用のある典型的な非純粋関数であることがわかっているからです。コンポーネントコンストラクターに純粋でない関数がある場合、React
警告をスローし、componentWillMount()
不純な機能には中程度が許可されます。コード内の他のコンポーネントの状態を更新する必要がある場合は、コンストラクターを使用しないことをお勧めします。
最後の結論は、副作用(ステータスの更新など)を生成しない初期化コードにはコンストラクターを使用することです。それ以外の場合は、componentDidMount()を使用します。
コンポーネント間の通信
もう1つの方法は、親コンポーネントから子コンポーネントにデータを渡すことです。もちろん、親コンポーネントは以前にデータを取得する方法も回避する必要があるので、どこにありますか?親ノードは、Reactルーターフック(onEnter()
など)を使用してデータを取得し、props
を渡すことができます。データを子ノードに渡します。
この例では、コンポーネントが1つしかないため、これは簡単に次のように分類できます。
Fetch.js
export default { fetchFirst: function(url){ fetch('https://www.reddit.com/r/' + url + '.json').then(function (response) { return response.json() }).then(function (result) { return result.data.children }) } } Copy code
RedditPost.js
import React from 'react' class RedditPost extends React.Component { constructor(props) { super(props) this.state = { title: props.title, id: props.id } } componentWillReceiveProps(nextProps) { this.setState(nextProps) } render() { {this.state.title} ) } } } RedditPost.propTypes = { id: React.PropTypes.number, title: React.PropTypes.string } RedditPost.defaultProps = { id: null, title: '' } export default RedditPost Copy code
App.js
import fetchFirst from './Fetch' import React, { Component } from 'react' import logo from './logo.svg' import './App.css' class App extends Component { constructor(props) { super(props) this.state = { posts: [] } } componentDidMount() { fetchFirst('reactjs').then((posts)=>{ this.state.posts = posts }) } render() { return (
{this.state.posts.map(post => )}
) } } export default App Copy code
Redux StateManagerを使用する
3番目の方法はRedux
を使用することですそのような状態管理者。
コード内のどこからでもデータを取得し、他のすべてのコンポーネントで使用できるグローバルストレージにデータを保存します。
約Redux
あなたは自分で学ぶか、私が以前に書いたいくつかの記事を読むことができます:1。 Redux-グローバル状態をよりエレガントに変更する方法 二、 Reduxを再考する
終わり
ますます多くの企業が独自のウェブサイトを構築する際に経験とパフォーマンスに注意を払っています。多数のシングルページアプリケーションが登場しています。AJAX
このブラシレス技術は最高です。そして、私たちは使用していますReact
アプリケーションを開発する方法はたくさんあります。AJAX
プログラム:
1、Use XMLHttpRequest
複雑に感じる場合は、直接使用できます。jQuery
。2、Fetch API
、最新のブラウザサポート、古いブラウザを使用する必要がありますpolyfills
。3、Axios
:ベースpromise
のHTTP
ライブラリ、ブラウザで使用できますnode.js
に。