详解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 相关文章推荐
javascript:window.open弹出窗口的位置问题
Mar 18 Javascript
JavaScript中return false的用法
Mar 12 Javascript
jQuery实现按钮的点击 全选/反选 单选框/复选框 文本框 表单验证
Jun 25 Javascript
原生JS封装Ajax插件(同域、jsonp跨域)
May 03 Javascript
JavaScript禁止用户多次提交的两种方法
Jul 24 Javascript
基于jQuery实现的查看全文功能【实用】
Dec 11 Javascript
微信浏览器禁止页面下拉查看网址实例详解
Jun 28 Javascript
JS实现数组去重方法总结(六种方法)
Jul 14 Javascript
ionic2懒加载配置详解
Sep 01 Javascript
vue中$refs的用法及作用详解
Apr 24 Javascript
javascript设计模式 ? 简单工厂模式原理与应用实例分析
Apr 09 Javascript
vue实现登录、注册、退出、跳转等功能
Dec 23 Vue.js
小程序实现多列选择器
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
PHP4与PHP5的时间格式问题
2008/02/17 PHP
PHP XML error parsing SOAP payload on line 1
2010/06/17 PHP
php使用curl模拟登录后采集页面的例子
2013/11/04 PHP
Yii2中如何使用modal弹窗(基本使用)
2016/05/30 PHP
读jQuery之二(两种扩展)
2011/06/11 Javascript
JQuery实现表格中相同单元格合并示例代码
2013/06/26 Javascript
封装html的select标签的js操作实例
2013/07/02 Javascript
Javascript 遮罩层和加载效果代码
2013/08/01 Javascript
js跳转页面方法实现汇总
2014/02/11 Javascript
jQuery实现的可编辑表格完整实例
2016/06/20 Javascript
Node.js Sequelize如何实现数据库的读写分离
2016/10/23 Javascript
浅谈jQuery before和insertBefore的区别
2016/12/04 Javascript
MUI 解决动态列表页图片懒加载再次加载不成功的bug问题
2017/04/13 Javascript
node基于puppeteer模拟登录抓取页面的实现
2018/05/09 Javascript
jQuery实现轮播图及其原理详解
2020/04/12 jQuery
Python中的hypot()方法使用简介
2015/05/18 Python
python删除指定类型(或非指定)的文件实例详解
2015/07/06 Python
实例讲解Python的函数闭包使用中应注意的问题
2016/06/20 Python
CentOS下使用yum安装python-pip失败的完美解决方法
2017/08/16 Python
Python实现打印螺旋矩阵功能的方法
2017/11/21 Python
django数据库migrate失败的解决方法解析
2018/02/08 Python
Python中sorted()排序与字母大小写的问题
2020/01/14 Python
Python configparser模块封装及构造配置文件
2020/08/07 Python
python3爬虫中引用Queue的实例讲解
2020/11/24 Python
CSS3使用border-radius属性制作圆角
2014/12/22 HTML / CSS
canvas离屏技术与放大镜实现代码示例
2018/08/31 HTML / CSS
LightInTheBox法国站:中国跨境电商
2020/03/05 全球购物
煤矿班组长岗位职责
2013/12/29 职场文书
董事长秘书职责
2014/01/31 职场文书
研究生就业推荐表导师评语
2014/12/31 职场文书
公司联欢会主持词
2015/07/04 职场文书
幼儿园安全管理制度
2015/08/05 职场文书
对Golang中的FORM相关字段理解
2021/05/02 Golang
Python使用OpenCV和K-Means聚类对毕业照进行图像分割
2021/06/11 Python
MySQL 四种连接和多表查询详解
2021/07/16 MySQL
Python中tqdm的使用和例子
2022/09/23 Python