在日常的開發中,從伺服器端非同步獲取資料並渲染是相當高頻的操作。在以往使用react class元件的時候,這種操作我們已經很熟悉了,即在class元件的componentdidmount中通過ajax來獲取資料並setstate,觸發元件更新。
隨著hook的到來,我們可以在一些場景中使用hook的寫法來替代class的寫法。但是hook中沒有setstate、componentdidmount等函式,又如何做到從伺服器端非同步獲取資料並渲染呢?本文將會介紹如何使用react的新特性hook來編寫元件並獲取資料渲染。
先來看乙個資料渲染的簡單demo
import react,
from
'react'
;function()
]});
return
(>
<
/li>))
}<
/ul>);
}export
但現在是寫死的乙個資料,如果我們期望從伺服器端獲取資料並渲染,那麼就需要在元件渲染完成時fetch服務端資料,然後通過setdata去改變state觸發渲染。我們接下來準備用axios
來獲取資料。
import react,
from
'react'
;import axios from
'axios'
;function()
]});
useeffect
(async()
=>);
return
(>
<
/li>))
}<
/ul>);
}export
**中使用到的useeffect
就是hook的其中一種,叫effect hook
。useeffect會在每次元件渲染的時候觸發,我們使用它來獲取資料並更新state。但是上面的**是有缺陷的,你發現了嗎?
沒錯,只要你執行一下,你就會發現程式進入了乙個死迴圈。因為useeffect不僅在元件didmounts的時候被觸發了,還在didupdate的時候被觸發了。在useeffect中獲取資料後,通過setdate改變state,觸發元件渲染更新,從而又進入到了useeffect中,無限迴圈下去。這並不是我們想要的結果。我們最初想要的,只是希望在didmounts的時候獲取一次資料而已。所以,這種情況下,我們必須要給useeffect方法的第二個引數傳入乙個空,以使得useeffect中的邏輯只在元件didmounts的時候被執行。
import react,
from
'react'
;import axios from
'axios'
;function()
]});
useeffect
(async()
=>,[
]);//重點
return
(>
<
/li>))
}<
/ul>);
}export
雖然看起來這個錯誤比較低階,但確實比較多人在新上手hook時常常犯的問題。
當然,useeffect第二個引數,也可以傳入值。當如果有值的時候,那useeffect會在這些值更新的時候觸發。如果只是個空陣列,則只會在didmounts的時候觸發。
另外,執行這段**,你會看到控制台警告,promises and useeffect(async () => ...) are not supported, but you can call an async function inside an effect.
。所以如果要使用async,需要修改下寫法。
import react,
from
'react'
;import axios from
'axios'
;function()
]});
useeffect((
)=>
fetchdata()
;},[
]);return
(>
<
/li>))
}<
/ul>);
}export
一般的應用在某些請求過程的互動設計上,會加上loading來緩解使用者焦慮。那在hook的寫法中,如何實現呢?下面將會介紹。
import react,
from
'react'
;import axios from
'axios'
;function()
]});
const
[isloading, setisloading]
=usestate
(false);
useeffect((
)=>
fetchdata()
;},[
]);return
(>
<
/li>))
}<
/ul>)}
;}export
這裡通過加入乙個叫isloading的state來實現。我們在fetch的開始和結束去改變isloading的值,來控制return返回的元件內容,從而在請求前顯示loading元件,在請求後顯示產品列表。
請求的過程經常會由於各種原因失敗,比如網路、伺服器錯誤等等。所以錯誤處理必不可少的。
import react,
from
'react'
;import axios from
'axios'
;function()
]});
const
[isloading, setisloading]
=usestate
(false);
const
[iserror, setiserror]
=usestate
(false);
useeffect((
)=>
catch
(e)setisloading
(false);
}fetchdata()
;},[
]);return
(>
<
/li>))
}<
/ul>)}
;<
/div>
}export
當請求出錯時,iserror
會被設定為true,觸發渲染時,錯誤提示元件就會被渲染出來。這裡的處理比較簡單,在真實場景中,你可以在錯誤處理時加入更複雜的邏輯。iserror
會在每次hook執行的時候被重置。
讀到這你已經基本學會了如何使用react hooks獲取資料並渲染元件了。
C 使用WebRequest類請求資料
本文翻譯於 下列程式描述的步驟用於從伺服器請求乙個資源,例如,乙個web頁面或檔案。必須由uri標識的資源。從主機伺服器請求資料 1 建立乙個webrequest例項通過呼叫建立uri的資源。webrequest request webrequest.create note net 框架提供了特定於...
使用load 方法非同步請求資料
使用load 方法通過ajax請求載入伺服器中的資料,並把返回的資料放置到指定的元素中,它的呼叫格式為 load url,data callback 引數url為載入伺服器位址,可選項data引數為請求時傳送的資料,callback引數為資料請求成功後,執行的 函式。例如,點選 載入 按鈕時,向伺服...
C winform post請求資料
其原理是,利用winfrom模擬表單提交資料,將要提交的引數提交給網頁,網頁執行 得到資料,然後winform程式將網頁的所有源 讀取下來,這樣就達到windows應用程式和web應用程式之間傳參和現實資料的效果了。首先建立乙個windows應用程式和web應用程式。在web應用程式中,將網頁切換到...