国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

詳解react-refetch的使用小例子

2019-11-19 12:08:28
字體:
來源:轉載
供稿:網友

使用react-refetch來簡化api獲取數據的代碼

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獲取數據的邏輯用高階組件抽離出來,下面我們再用react-refetch來簡化上面的異步代碼

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邏輯也添加了

分離列表和項目的職責

很明顯,List組件是一個渲染列表的組件,他的職責就是渲染列表,但是我們在這里也處理了單個Item的邏輯,我們可以將其進行職責分離,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來給Gist添加功能

react-refetch的connect方法接收一個函數作為參數,這個函數返回一個對象,如果結果對象的值是一個字符串,那么獲取prop后,會對這個字符串發起請求,但是如果值是一個函數,那么不會立即執行,而是會傳遞給組件,以便后續使用

值為字符串

const connectWithStar = refetchConnect(() => ({gists: `https://api.github.com/users/gaearon/gists`}))

值為函數

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函數會被傳遞給Gist的prop,然后就可以在Gist里面使用了

connectWithStar(Gist)

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 稻城县| 临洮县| 浮梁县| 灌云县| 富源县| 六枝特区| 辰溪县| 安徽省| 宝丰县| 公主岭市| 通化市| 阜阳市| 辰溪县| 彭阳县| 休宁县| 尤溪县| 西林县| 广西| 大荔县| 贡嘎县| 府谷县| 陕西省| 浏阳市| 永济市| 大渡口区| 延庆县| 德江县| 巨鹿县| 蓬溪县| 前郭尔| 阳新县| 光山县| 建水县| 哈巴河县| 彝良县| 松滋市| 得荣县| 嵊州市| 弥渡县| 达孜县| 遵义市|