本文介紹下React下fetch的get使用步驟
參考文章網絡請求之fetch
(1)編寫基礎組件模板
根組件引入
(2)json-server搭建模擬后台服務
編寫模擬數據
自定義端口啟動
測試如下
(3)結合生命周期componentDidMount進行fetch網絡請求操作
注意:fetch后的then的response不是最終結果,可以測試下
返回的response為流數據,需要用response.json()進行轉換,而該方法返回Promise對象,所以后續便有了類似then調用,結合文章網絡請求之fetch.上述代碼還可以做下完善如下
接下來覆蓋state初始值並進行模板渲染即可
(4)覆蓋state初始狀態並渲染
完整代碼如下:
import React,{Component} from 'react' class FetchGet extends Component { constructor(props){ super(props) this.state = { usersInfo:[] } } componentDidMount(){ fetch('http://localhost:2222/users') .then((response)=>{ return response.json() }) .then((response)=>{ this.setState({ usersInfo:response }) }).catch((error)=>{ console.log('錯誤'+error) }) } render(){ var {usersInfo} = this.state//解構賦值 return ( <div> <ul> { usersInfo.map((item,index)=>{ return ( <li key={index}> {item.id} {item.username} {item.age} </li> ) }) } </ul> </div> ) } } export default FetchGet
(5)細節點
1、盡量使用箭頭函數,因為箭頭函數沒有特定this指向
2、箭頭函數只有一個參數時,()可以省略,所以上訴代碼如下
3、采用ES2016的 async/await 語法進行進一步優化
詳見下面
(6)采用ES2016的 async/await 語法優化
對比如下
此外在做下優化
因為response.json()也是異步的所以也需要await
完整代碼:
import React,{Component} from 'react' class FetchGet extends Component { constructor(props){ super(props) this.state = { usersInfo:[] } } componentDidMount(){ ;(async()=>{ try{ const response = await fetch('http://localhost:2222/users') const data = await response.json()//因為也是異步的所以也需要await this.setState({ usersInfo:data }) }catch(error){ console.log('Fetch Error: ', error) } })() /* fetch('http://localhost:2222/users') .then(response => { return response.json() }) .then(response => { this.setState({ usersInfo:response }) }).catch(error => { console.log('錯誤'+error) }) */ } render(){ var {usersInfo} = this.state//解構賦值 return ( <div> <ul> { usersInfo.map((item,index)=>{ return ( <li key={index}> {item.id} {item.username} {item.age} </li> ) }) } </ul> </div> ) } } export default FetchGet
.