前言
在 React
中,render
函數返回的結果,取決於組件的 props
和 state
css
咱們都知道 UI
頁面上的數據不是寫死的,每每是從後端的數據接口中拿到的html
而後將真實的數據填充到頁面上 ,那麼應該在哪一個生命週期函數中發起請求?java
又如何發起 Ajax
請求呢以及有哪些方式? 以及咱們怎麼樣模擬一個後端數據接口?react
示例API
返回以下json
對象
假如後端返回的商品列表以下所示jquery
{ "goodLists": [ {"id": 1, "name": "瓜子", "price": 10, "address": "廣東"}, {"id": 2, "name": "蘋果", "price": 20, "address": "北京"}, {"id": 3, "name": "橘子", "price": 8, "address": "湖南"}, {"id": 4, "name": "桃子", "price": 13, "address": "北京"}, {"id": 5, "name": "榴蓮", "price": 18, "address": "海南"} ] }
把這段商品列表的json
代碼命名爲goodlist.json
,放到根目錄public
的api
文件夾內linux
在public
目錄下的api
文件夾下均可以放置你本身模擬的數據,該模擬的數據文件只能放置在public
目錄下,不然就會報錯,不生效的webpack
對應的 UI
效果顯示:以下所示ios
固然對於 UI
以什麼樣的方式來顯示,你本身能夠用 css
進行控制的,這並非文本的重點git
在哪一個生命週期函數中發送 AJax 請求
把Ajax
請求放在componentWillMount
組件即將被掛載的函數中也是能夠的es6
可是官方推薦放在componentDidMount
這個生命週期函數中發起Ajax
請求,由於執行這個生命週期時,DOM
已經掛載完了
這樣作能夠拿到Ajax
請求返回的數據並經過setState
來更新組件
componentDidMount(){ // 在這裏進行Ajax數據請求,axios,fetch,jquery Ajax或者request均可以 }
如何發送 AJax 請求?
在React
中,你可使用你喜歡的Ajax
庫,例如:Axios
,瀏覽器內置的feach
方法,JQuery Ajax
,或是第三方庫request
,下面就逐一來看看的
Axios
發送Ajax
請求該方式不管是Vue
仍是React
甚至其餘一些框架中,都廣泛經常使用,它支持promise
方式,在使用axios
庫以前,應該先在終端下使用npm
或者cnpm
全局安裝一下
npm install -S axios 或者cnpm install -S axios 或者yarn add axios
安裝完axios
後,在須要使用請求數據的文件最上面,引入axios
庫,以下代碼所示,下面是上面示例API
的具體代碼
import React, { Fragment, Component } from 'react'; import ReactDOM from 'react-dom'; import axios from 'axios'; // 引入axios庫 import './style.css'; class List extends Component { constructor(props) { super(props); this.baseUrl = '/api/goodlist'; // 這裏是本地模擬,在public下建立一個api文件,放置一個json文件,這裏的路徑直接是根路徑便可,react會自動的找到這個目錄 // this.baseUrl = 'http://localhost:4000/api/goodlist'; // 這種方式是使用代理的方式,這裏用的是mockoon工具 // this.baseUrl = 'https://easy-mock.com/mock/5b24e12cf076d94c646a9aa2/api/googlists'; //這是使用easy-mock this.state = { list: [], }; } render() { const { list } = this.state; return ( <Fragment> <ul> {list.map((item) => { const isRed = item.price >= 10 ? 'red' : ''; return ( <li key={item.id}> {item.name}-<span className={isRed}>{item.price}¥</span>- {item.address} </li> ); })} </ul> </Fragment> ); } // Ajax請求放在componentDidMount生命週期內 componentDidMount() { // 使用axios完成ajax數據請求 axios .get(this.baseUrl) .then((res) => { const { goodlists } = res.data; this.setState({ list: goodlists, }); }) .catch((err) => { console.log(err); }); } } const container = document.getElementById('root'); ReactDOM.render(<List />, container);
上面的代碼就是在componentDidMount
中發起Ajax
請求,用axios
請求數據
拿到數據後,而後經過setState
去更新組件的state
的數據渲染到頁面上
同時,當價格大於 10 時,進行了一些邏輯判斷,讓價格大於 10 的變紅色,在 JSX 裏面是能夠插值表達式的方式進行一些特殊處理的
注意:本地模擬數據的json
文件(這裏是goodlist.json
),放置的位置只能是放置在根目錄public
目錄文件夾下,若放置在其餘處,是不起做用的
之因此放在public
能起做用,訪問的路徑直接是根路徑便可,webpack
作了一些處理,react
會自動的找到這個目錄
fetch
方法該方法是瀏覽器標準的一個接口,提供了一種簡單合理的方式來跨網絡異步的獲取資源數據,如今也是愈來愈流行使用的,一樣 Ajax
請求也是放在componentDidMount
組件掛載完以後進行數據請求,以下代碼所示
componentDidMount(){ // 使用fetch,這裏的地止換成上面的this.baseUrl也是能夠的 fetch('/api/goodlist') .then(res => res.json()) .then((result) => { console.log(result); const { goodlists } = result; this.setState({ list: goodlists }) }, // 注意在這裏處理錯誤時,與axios有些區別,不是用catch()去捕獲錯誤,由於使用catch去捕獲異常會掩蓋掉組件自己可能產生的bug (error) => { console.log(error); } ) }
上面使用的是fetch
的方式請求數據,fetch
是前沿的標準,它是Ajax
的替代品,它的API
是基於Promise
設計的,舊版本的瀏覽器不支持fetch
,須要用polyfill es6-promise
具體更詳細的fetch
使用,可參照MDN
文檔的
JQ
的Ajax
jquery
是一個庫,在React
中你想要用時,得先安裝,使用該方法請求數據不是不能夠,可是不推薦
npm install -S jquery 或者 cnpm install -S jquery
而後在你須要請求數據的文件處,引入jquery
import $ from 'jquery';
而後在componentDidMount
生命週期函數內,使用jquer
請求數據的方法,下面以$.get()
爲例,$
至於$.post()
,$.ajax()
使用方式可自行查閱的
componentDidMount(){ /* $.get('/api/goodlist', function(res){ console.log(res); this.setState({ list: res.goodLists }) }.bind(this)) // 這裏必須手動綁定this */ // 等價於下面的,若是不手動綁定,可使用箭頭函數,避免this的綁定 $.get('/api/goodlist', (res) => { console.log(res); const { goodlists } = res; this.setState({ list: goodlists }) }) }
上面是使用jquery
中提供的方法Ajax
請求數據,咱們只須要請求一數據,但卻要把整個jquery
庫都給引入進來,這個按照當今的按需加載模塊化開發的話,是很是不合理的,因而就有了fetch
,和axios
的解決方案
在React
中推薦使用axios
或者fetch
的方式進行Ajax
請求數據
這個不只僅是在Vue
,React
等框架中使用,在微信小程序裏Ajax
請求數據也是支持的
這個request
模塊也是很是流行和好用的,在這裏不提一下,都以爲埋沒了的
使用時,先要安裝request
模塊而後在安裝request-promise
模塊,由於request-pormise
是依賴於request
,因此兩個依賴都得依次安裝
npm install -S request npm install -S request-promise
而後在你須要使用請求數據的文件上方引入request-promise
庫,調用一個rp
函數
import rp from 'request-promise';
而後在componentDidMount
內進行Ajax
的數據請求,以下代碼所示
componentDidMount(){ // 使用request-promise請求數據 // 注意這裏的this.baseUrl不支持/api/goodlist.json方式,下面的this.baseUrl是http://localhost:4000/api/goodlist,以及真實的地止,都是能夠的 rp(this.baseUrl) .then(res => { // 這裏要注意的是res返回的是一個字符串,須要用JSON.parse()方法將字符串轉化爲json對象 const { goodlists } = JSON.parse(res); this.setState({ list: goodlists }) }) .catch(error => { console.log(error); }) }
上面是使用request-promise
的方式實現Ajax
數據的請求也是能夠的,注意使用該方式時,沒法使用本地mock
數據的
它也是支持promise
對象,注意,當返回成功的response
的類型是一個json
字符串格式,你須要用JSON.parse()
的方式
將json
字符串,轉化爲json
對象,而後作處理的
若是你是使用axios
的方式請求數據,那麼是不用進行json
序列的格式化的
小結
在React
中請求數據的幾種方式
axios
(廣泛經常使用)fetch
方法(嚐鮮,顯逼格用)jquery Ajax
(不推薦使用)request
(經常使用,僅次於axios
使用頻率)注意: 都是放在componentDidMount
函數中進行數據請求的
在本地的public
目錄下mock
本地數據
這種方式比較簡單,直接在工程public
目錄下建立一個api
文件夾,新建一個json
文件就能夠了
若使用axios
進行數據的請求,或者fetch
的方式,url
以反斜槓/
開頭就能夠了,如上示例代碼所示,可是如果request
的方式,url
寫成反斜線/的方式是不生效的
使用request
的方式,須要帶上http
協議,它也支持線上接口
如果遇到跨域問題,在請求頭 headers
中,添加Access-Control-Allow-Origin: *
便可
這個咱們在稍後的 mockoon
工具中會介紹到
react-ajax ├── package-lock.json ├── package.json ├── public // 在該目錄下建立一個api文件夾,把須要的模擬的數據放在一個json文件便可 │ ├── api │ │ └── goodlist.json │ ├── favicon.ico │ ├── index.html │ └── manifest.json ├── README.md ├── src │ ├── App.js │ ├── index.js │ └── style.css └── yarn-error.log
使用 charles 抓取本地化模擬數據
charles
是一款代理服務器,經過將本身設置成系統的網絡訪問代理服務器,而後截取請求和請求結果達到分析抓包的目的,該軟件是用java
寫的,安裝charles
的時候,先要裝好Java
壞境,也就是Jdk
壞境的設置
下面就來看看charles
的簡單具體使用
先百度百科 charles
下載該工具,下一步,下一步安裝就好,固然你在後臺回覆【charles
下載】也是獲取到的
使用方式以下所示:
注意:charles
的port
端口號與React
本地啓動的服務端口號一致便可
在你沒有配置charles
工具代理服務時,若該假數據的文件放置在項目根目錄public
以外,這時請求url
,/api/goodlist
是會報錯的
換而言之,假數據放置在public
目錄下,不使用charles
等其餘代理工具,也能成功,由於在React
中的webpack
自動的幫你處理了,會自動的找到public
目錄下的文件
固然除了charles
還有mockoon
等其餘一些工具的
使用 mockoon 進行 mock 本地數據
使用該方式時,須要你去官方下載mockoon
工具,固然你若懶於百度谷歌,你在後臺回覆【mockoon】,這裏我只提供了 windows
版本的,linux
與 Mac
用戶可自行解決
官網地止:https://mockoon.com/
mockoon
配置以下所示
Easy Mock
這是大搜車技術團隊一個開源僞造數據的工具,是一個可視化,而且能快速生成模擬數據的持久化服務
官網地止:https://easy-mock.com
easy-mock
結合了mock.js
,支持接口代理,Restful
風格等很是好用的功能
把上面代碼中的baseUrl
換成線上easy-mock
的就能夠了
this.baseUrl = 'https://easy-mock.com/mock/5b24e12cf076d94c646a9aa2/api/googlists';
至於更多easy-mock
工具的使用,本身能夠多試一試的,有了它,就能夠不依賴後端接口了,等後端接口弄好了,直接替換就能夠了的
小結
mock
本地數據的幾種方式
public
目錄下mock
本地數據(最簡單粗暴,經常使用)charles
抓取本地化模擬數據mockoon
進行mock
本地數據easy-mock
僞造接口數據(推薦多用)結語
本文主要講解了React
中如何發送Ajax
請求,其中發送請求放置的地方應當在componentDidMount
組件掛載完這個生命週期內,而發送Ajax
的方式有axios
,fetch
,Jquery Ajax
,以及request
的方式,其中axios
與fetch
,request
是主流的方式
同時介紹了在項目的根目錄 public
文件夾下放置模擬的假數據,我的以爲這個很簡單粗暴,可是惟一不足是你得本身手動的編寫數據
而利用 charles
和 mockoon
工具攔截本地的請求,mock 數據,須要你額外的配置一下的
固然最後介紹了easy-mock
這個很是好用的模擬後端假數據的工具
以上的代理數據模擬手段選擇其中一種本身喜歡的就能夠了,工具無好壞之分,本身用的爽就能夠,不過我的推薦使用easy-mock
,可是其餘方式也不賴,要是否是線上的,斷網了
那麼其餘方法就比較適用了,之因此介紹了不一樣的工具,主要是開拓本身的思路
這個工具用得不爽,就用另一個的,總有一個適合本身的