在React中,render函數返回的結果,取決於組件的props和statecss
咱們都知道UI頁面上的數據不是寫死的,每每是從後端的數據接口中拿到html
而後將真實的數據填充到頁面上 那麼應該在哪一個生命週期函數中發起請求? 又如何發起Ajax請求呢以及有哪些方式? 以及咱們怎麼樣模擬一個後端數據接口?java
那麼本小節就是你想要知道的react
若是想閱讀體驗更好,可戳該連接,React中發送Ajax請求以及Mock數據jquery
示例API返回以下json對象
假如後端返回的商品列表以下所示webpack
{
"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文件夾內ios
在public目錄下的api文件夾下均可以放置你本身模擬的數據,該模擬的數據文件只能放置在public目錄下,不然就會報錯,不生效的git
對應的UI效果顯示:以下所示 es6
固然對於UI以什麼樣的方式來顯示,你本身能夠用css進行控制的,這不是文本的重點在哪一個生命週期函數中發送AJax請求
把Ajax請求放在componentWillMount組件即將被掛載的函數中也是能夠的github
可是官方推薦放在componentDidMount這個生命週期函數中發起Ajax請求,由於執行這個生命週期時,DOM已經掛載完了
這樣作能夠拿到Ajax請求返回的數據並經過setState來更新組件
componentDidMount(){
// 在這裏進行Ajax數據請求,axios,fetch,jquery Ajax或者request均可以
}
複製代碼
如何發送AJax請求?
在React中,你可使用你喜歡的Ajax庫,例如:Axios,瀏覽器內置的feach方法,JQuery Ajax,或是第三方庫request,下面就逐一來看看的
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會自動的找到這個目錄
該方法是瀏覽器標準的一個接口,提供了一種簡單合理的方式來跨網絡異步的獲取資源數據,如今也是愈來愈流行使用的,一樣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文檔的
jquery是一個庫,在React中你想要用時,得先安裝,使用該方法請求數據不是不能夠,可是不推薦
npm install -S jquery
或者
cnpm install -S jquery
複製代碼
而後在你須要請求數據的文件處,引入jquery
import $ from 'jquery'
複製代碼
而後在componentDidMount生命週期函數內,使用jquer請求數據的方法,下面以.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中請求數據的幾種方式
注意:都是放在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的port端口號與React本地啓動的服務端口號一致便可在你沒有配置charles工具代理服務時,若該假數據的文件放置在項目根目錄public以外,這時請求url,/api/goodlist
是會報錯的
換而言之,假數據放置在public目錄下,不使用charles等其餘代理工具,也能成功,由於在React中的webpack自動的幫你處理了,會自動的找到public目錄下的文件
固然除了charles還有mockoon等其餘一些工具的
使用mockoon進行mock本地數據
使用該方式時,須要你去官方下載mockoon工具
官網地止:mockoon.com/
mockoon配置以下所示使用Easy Mock僞造數據
Easy Mock 這是大搜車技術團隊一個開源僞造數據的工具,是一個可視化,而且能快速生成模擬數據的持久化服務
官網地止:easy-mock.com
easy-mock結合了mock.js,支持接口代理,Restful風格等很是好用的功能
把上面代碼中的baseUrl換成線上easy-mock的就能夠了
this.baseUrl = 'https://easy-mock.com/mock/5b24e12cf076d94c646a9aa2/api/googlists';
複製代碼
至於更多easy-mock工具的使用,本身能夠多試一試的,有了它,就能夠不依賴後端接口了,等後端接口弄好了,直接替換就能夠了的
小結
mock本地數據的幾種方式
本文主要講解了React中如何發送Ajax請求,其中發送請求放置的地方應當在componentDidMount組件掛載完這個生命週期內,而發送Ajax的方式有axios,fetch,Jquery Ajax,以及request的方式,其中axios與fetch,request是主流的方式
同時介紹了在項目的根目錄public文件夾下放置模擬的假數據,我的以爲這個很簡單粗暴,可是惟一不足是你得本身手動的編寫數據
而利用charles和mockoon工具攔截本地的請求,mock數據,須要你額外的配置一下的
固然最後介紹了easy-mock這個很是好用的模擬後端假數據的工具
以上的代理數據模擬手段選擇其中一種本身喜歡的就能夠了,工具無好壞之分,本身用的爽就能夠,不過我的推薦使用easy-mock,可是其餘方式也不賴,要是否是線上的,斷網了
那麼其餘方法就比較適用了,之因此介紹了不一樣的工具,主要是開拓本身的思路
這個工具用得不爽,就用另一個的,總有一個適合本身的
有時候,也不會弔死在一棵樹上,要相信,辦法總比困難要多