详解react-refetch的使用小例子


Posted in Javascript onFebruary 15, 2019

使用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)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js中 关于undefined和null的区别介绍
Apr 16 Javascript
JS可以控制样式的名称写法一览
Jan 16 Javascript
jQuery获取当前对象标签名称的方法
Feb 07 Javascript
javascript操作excel生成报表全攻略
May 04 Javascript
Javascript实现检测客户端类型代码封包
Dec 03 Javascript
莱鸟介绍window.print()方法
Jan 06 Javascript
jQuery soColorPacker 网页拾色器
Jun 22 Javascript
JS实现拖拽的方法分析
Dec 20 Javascript
探索Vue高阶组件的使用
Jan 08 Javascript
js实现简单选项卡功能
Mar 23 Javascript
Vue使用zTree插件封装树组件操作示例
Apr 25 Javascript
Element-UI中关于table表格的那些骚操作(小结)
Aug 15 Javascript
小程序实现多列选择器
Feb 15 #Javascript
jQuery实现经典的网页3D轮播图封装功能【附源码下载】
Feb 15 #jQuery
微信实现自动跳转到用其他浏览器打开指定APP下载
Feb 15 #Javascript
微信小程序实现联动选择器
Feb 15 #Javascript
推荐一个基于Node.js的表单验证库
Feb 15 #Javascript
微信小程序实现左右列表联动
May 19 #Javascript
webpack-url-loader 解决项目中图片打包路径问题
Feb 15 #Javascript
You might like
深入解析yii权限分级式访问控制的实现(非RBAC法)
2013/06/13 PHP
php求斐波那契数的两种实现方式【递归与递推】
2019/09/09 PHP
asp.net和php的区别点总结
2019/10/10 PHP
使用jQuery实现dropdownlist的联动效果(sharepoint 2007)
2011/03/30 Javascript
Javascript中产生固定结果的函数优化技巧
2013/01/16 Javascript
如何使用Bootstrap创建表单
2017/03/29 Javascript
JavaScript实现旋转轮播图
2020/08/18 Javascript
Vue.js devtool插件安装后无法使用的解决办法
2017/11/27 Javascript
详解使用webpack构建多页面应用
2017/12/21 Javascript
vue 项目中使用Loading组件的示例代码
2018/08/31 Javascript
详解JavaScript原生封装ajax请求和Jquery中的ajax请求
2019/02/14 jQuery
vue-model实现简易计算器
2020/08/17 Javascript
vue-router定义元信息meta操作
2020/12/07 Vue.js
windows下python模拟鼠标点击和键盘输示例
2014/02/28 Python
python实现登陆知乎获得个人收藏并保存为word文件
2015/03/16 Python
python 多线程实现检测服务器在线情况
2015/11/25 Python
Python中不同进制的语法及转换方法分析
2016/07/27 Python
JavaScript实现一维数组转化为二维数组
2018/04/17 Python
pycharm 将django中多个app放到同个文件夹apps的处理方法
2018/05/30 Python
Python3实现的简单工资管理系统示例
2019/03/12 Python
PyQt5实现从主窗口打开子窗口的方法
2019/06/19 Python
全面了解django的缓存机制及使用方法
2019/07/22 Python
Python用5行代码实现批量抠图的示例代码
2020/04/14 Python
pytorch中 gpu与gpu、gpu与cpu 在load时相互转化操作
2020/05/25 Python
利用css3如何设置没有上下边的列表间隔线
2017/07/03 HTML / CSS
详解canvas绘制网络字体几种方法
2019/08/27 HTML / CSS
苏格兰在线威士忌商店:The Whisky Barrel
2019/05/07 全球购物
澳大利亚最大的护发和护肤品购物网站:RY
2019/12/26 全球购物
优秀党员转正的自我评价
2013/10/06 职场文书
2014国培学习感言
2014/03/05 职场文书
2014年话务员工作总结
2014/11/19 职场文书
环卫工人慰问信
2015/02/15 职场文书
总经理检讨书范文
2015/02/16 职场文书
幼儿园园长新年寄语
2015/08/17 职场文书
vite+vue3.0+ts+element-plus快速搭建项目的实现
2021/06/24 Vue.js
Java后台生成图片的完整步骤
2021/08/04 Java/Android