在一個react應用中,如何經過ajax和server端進行交互這個問題曾經困擾了我一段時間,通過學習實踐,有了一點心得體會,寫出來和你們分享一下。html
總的來講,我知道的react ajax交互方式大體有如下4種:react
Root Componentajax
Container Componentjson
Redux/Flux Async Actionsredux
Relayapi
這個是最直接的方式,很是適合原型和小型應用開發。服務器
實現起來也很簡單,在整個應用的最頂層,有一個root component。全部的ajax請求都在這個組件的componentDidMount
中發起,並將返回的結果做爲本身的state保存,同時,經過props向下層組件傳遞數據。async
若是應用比較大,組件嵌套比較深的話,data得經過props一路傳下去……(固然,也能夠經過context的方式,不過context用來傳data並不合適)學習
應用比較簡單,組件樹不深spa
沒有用Redux或者Flux
這個方案和root component很像,區別在於能夠同時有多個container和server交互。
首先要把component區分爲container和presentational兩類。
container組件和root component同樣,和server進行ajax交互,將獲取的data經過props向下傳遞給presentational組件。
組件樹比較深
須要從不一樣的server或者api獲取數據
沒有用Redux或者Flux
若是已經在使用Redux/Flux,經過他們來管理數據是很天然的事情。
實現上,Redux官方文檔有個很好的示例。
簡單來講,就是徹底不在組件中發起ajax請求,將這些操做放在async actions中進行。
使用和Redux或者Flux
Relay就徹底是另一個世界了,和前面三種有本質區別。
Relay適用於大型應用(好比facebook),使用Relay必須同時提供一個GraphQL server。
首先,得有一個GraphQL server,而後,還得用GraphQL(而不是propTypes)定義組件須要的數據。剩下的交給Relay就行了,他會負責自動下載須要的數據並填充到組件的props裏面。
Relay被設計用來和GraphQL服務器一塊兒運行,並不能很好的和第三方json服務交互。
目前,Relay好像只能和一個GraphQL服務器鏈接。
超大型應用
不打算使用json API