詳解react-refetch的使用小例子
使用react-refetch來(lái)簡(jiǎn)化api獲取數(shù)據(jù)的代碼
const List = ({data: gists}) => {
return (
<ul>
{gists.map(gist => (
<li key={gist.id}>{gist.description}</li>
))}
</ul>
)
}
const withData = url => Part => {
return class extends Component {
state = {data: []}
componentDidMount() {
fetch(url)
.then(response => response.json ? response.json() : response)
.then(data => this.setState({data}))
}
render() {
return <Part {...this.state} {...this.props} />
}
}
}
const ListWithGists = withData('https://api.github.com/users/gaearon/gists')(List)
上面的代碼,我們將api獲取數(shù)據(jù)的邏輯用高階組件抽離出來(lái),下面我們?cè)儆胷eact-refetch來(lái)簡(jiǎn)化上面的異步代碼
import { connect as refetchConnect } from 'react-refetch'
const List = ({gists}) => {
if (gists.pending) {
return <div>loading...</div>
} else if (gists.rejected) {
return <div>{gists.reason}</div>
} else if (gists.fulfilled) {
return (
gists.fulfilled && <ul>
{gists.value.map(gist => (
<li key={gist.id}>{gist.description}</li>
))}
</ul>
)
}
}
const ListWithGists = refetchConnect(() => ({gists: `https://api.github.com/users/gaearon/gists`}))(List)
瞬間清爽多了,順便利用react-refetch提供的屬性,順便把loading邏輯也添加了
分離列表和項(xiàng)目的職責(zé)
很明顯,List組件是一個(gè)渲染列表的組件,他的職責(zé)就是渲染列表,但是我們?cè)谶@里也處理了單個(gè)Item的邏輯,我們可以將其進(jìn)行職責(zé)分離,List只做列表染,而Gist也只渲染自身
const Gist = ({description}) => (
<li>
{description}
</li>
)
const List = ({gists}) => {
if (gists.pending) {
return <div>loading...</div>
} else if (gists.rejected) {
return <div>{gists.reason}</div>
} else if (gists.fulfilled) {
return (
gists.fulfilled && <ul>
{gists.value.map(gist => <Gist key={gist.id} {...gist} />)}
</ul>
)
}
}
使用react-refetch來(lái)給Gist添加功能
react-refetch的connect方法接收一個(gè)函數(shù)作為參數(shù),這個(gè)函數(shù)返回一個(gè)對(duì)象,如果結(jié)果對(duì)象的值是一個(gè)字符串,那么獲取prop后,會(huì)對(duì)這個(gè)字符串發(fā)起請(qǐng)求,但是如果值是一個(gè)函數(shù),那么不會(huì)立即執(zhí)行,而是會(huì)傳遞給組件,以便后續(xù)使用
值為字符串
const connectWithStar = refetchConnect(() => ({gists: `https://api.github.com/users/gaearon/gists`}))
值為函數(shù)
const connectWithStar = refetchConnect(({id}) => ({
star: () => ({
starResponse: {
url: `https://api.github.com/gists/${id}/star?${token}`,
method: 'PUT'
}
})
}))
const Gist = ({description, star}) => (
<li>
{description}
<button onClick={star}>+1</button>
</li>
)
加工Gist組件,star函數(shù)會(huì)被傳遞給Gist的prop,然后就可以在Gist里面使用了
connectWithStar(Gist)
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
React函數(shù)式組件Hook中的useEffect函數(shù)的詳細(xì)解析
useEffect是react v16.8新引入的特性。我們可以把useEffect hook看作是componentDidMount、componentDidUpdate、componentWillUnmounrt三個(gè)函數(shù)的組合2022-10-10
一文學(xué)會(huì)使用Remix寫(xiě)API接口
這篇文章主要為大家介紹了一文學(xué)會(huì)Remix寫(xiě)API接口實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04
React+Node實(shí)現(xiàn)大文件分片上傳、斷點(diǎn)續(xù)傳秒傳思路
本文主要介紹了React+Node實(shí)現(xiàn)大文件分片上傳、斷點(diǎn)續(xù)傳秒傳思路,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02
React Native AsyncStorage本地存儲(chǔ)工具類(lèi)
這篇文章主要為大家分享了React Native AsyncStorage本地存儲(chǔ)工具類(lèi),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10
可定制react18 input otp 一次性密碼輸入組件
這篇文章主要為大家介紹了可定制react18 input otp 一次性密碼輸入組件,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10
詳解React-Native解決鍵盤(pán)遮擋問(wèn)題(Keyboard遮擋問(wèn)題)
本篇文章主要介紹了React-Native解決鍵盤(pán)遮擋問(wèn)題(Keyboard遮擋問(wèn)題),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07
在React中使用Antd上傳并讀取Excel文件的詳細(xì)步驟
在React中使用Antd組件庫(kù)來(lái)上傳并讀取Excel文件,可以結(jié)合antd的Upload組件和xlsx庫(kù)來(lái)實(shí)現(xiàn),以下是一個(gè)詳細(xì)的步驟和示例代碼,展示如何在React應(yīng)用中實(shí)現(xiàn)這一功能,感興趣的小伙伴跟著小編一起來(lái)看看吧2025-01-01
解決React初始化加載組件會(huì)渲染兩次的問(wèn)題
這篇文章主要介紹了解決React初始化加載組件會(huì)渲染兩次的問(wèn)題,文中有出現(xiàn)這種現(xiàn)象的原因及解決方法,感興趣的同學(xué)跟著小編一起來(lái)看看吧2023-08-08

