国产探花免费观看_亚洲丰满少妇自慰呻吟_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)

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 长葛市| 饶阳县| 济宁市| 高密市| 建宁县| 抚州市| 高安市| 二连浩特市| 孟连| 奈曼旗| 潮安县| 宝鸡市| 和顺县| 巴林左旗| 安丘市| 诏安县| 化隆| 宜丰县| 咸阳市| 珠海市| 洮南市| 合阳县| 松桃| 莆田市| 嵩明县| 亳州市| 扶沟县| 马关县| 阿鲁科尔沁旗| 友谊县| 连平县| 宜宾市| 阳江市| 句容市| 凌海市| 兰溪市| 雷州市| 合山市| 沐川县| 奎屯市| 营口市|