详解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 相关文章推荐
firefox浏览器下javascript 拖动层效果与原理分析代码
Dec 04 Javascript
jquery插件开发方法(初学者)
Feb 03 Javascript
jquery实现图片等比例缩放以及max-width在ie中不兼容解决
Mar 21 Javascript
固定背景实现的背景滚动特效示例分享
May 19 Javascript
jQuery 复合选择器应用的几个例子
Sep 11 Javascript
微信企业号开发之微信考勤Cookies的使用
Sep 11 Javascript
原生js轮播特效
May 18 Javascript
详解webpack分离css单独打包
Jun 21 Javascript
vue实现微信分享朋友圈,发送朋友的示例讲解
Feb 10 Javascript
React组件重构之嵌套+继承及高阶组件详解
Jul 19 Javascript
基于vue+axios+lrz.js微信端图片压缩上传方法
Jun 25 Javascript
vue $mount 和 el的区别说明
Sep 11 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
php+iframe实现隐藏无刷新上传文件
2012/02/10 PHP
md5 16位二进制与32位字符串相互转换示例
2013/12/30 PHP
PHP基于phpqrcode生成带LOGO图像的二维码实例
2015/07/10 PHP
PHP正则表达式过滤html标签属性(DEMO)
2016/05/04 PHP
PHP简单留言本功能实现代码
2017/06/09 PHP
node.js中的socket.io入门实例
2014/04/26 Javascript
JQuery boxy插件在IE中边角图片不显示问题的解决
2015/05/20 Javascript
Node.js的项目构建工具Grunt的安装与配置教程
2016/05/12 Javascript
js和jq使用submit方法无法提交表单的快速解决方法
2016/05/17 Javascript
jQuery动态添加可拖动元素完整实例(附demo源码下载)
2016/06/21 Javascript
jQuery.form.js插件不能解决连接超时(timeout)的原因分析及解决方法
2016/10/14 Javascript
Bootstrap列表组学习使用
2017/02/09 Javascript
webpack4+Vue搭建自己的Vue-cli项目过程分享
2018/08/29 Javascript
Nodejs libuv运行原理详解
2019/08/21 NodeJs
js+springMVC 提交数组数据到后台的实例
2019/09/21 Javascript
JS中作用域以及变量范围分析
2020/07/18 Javascript
[01:19:33]DOTA2-DPC中国联赛 正赛 iG vs VG BO3 第一场 2月2日
2021/03/11 DOTA
Python重新引入被覆盖的自带function
2014/07/16 Python
socket + select 完成伪并发操作的实例
2017/08/15 Python
为什么相对PHP黑python的更少
2020/06/21 Python
python Yaml、Json、Dict之间的转化
2020/10/19 Python
python 用opencv实现霍夫线变换
2020/11/27 Python
Python之字符串的遍历的4种方式
2020/12/08 Python
CSS3实现任意图片lowpoly动画效果实例
2017/05/11 HTML / CSS
css3 响应式媒体查询的示例代码
2019/09/25 HTML / CSS
HTML5+CSS3:3D展示商品信息示例
2017/01/03 HTML / CSS
财务管理专业推荐信
2013/11/19 职场文书
办公室文员工作自我评价
2013/12/01 职场文书
销售主管竞聘书
2014/03/31 职场文书
尊老爱亲美德少年事迹材料
2014/08/14 职场文书
机票销售员态度不好检讨书
2014/09/27 职场文书
2015年财务经理工作总结
2015/05/13 职场文书
请学会珍惜眼前,因为人生没有下辈子!
2019/11/12 职场文书
SQL实现LeetCode(197.上升温度)
2021/08/07 MySQL
python函数的两种嵌套方法使用
2022/04/02 Python
python热力图实现的完整实例
2022/06/25 Python