详解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 相关文章推荐
兼容Mozilla必须知道的知识。
Jan 09 Javascript
jquery 插件学习(六)
Aug 06 Javascript
javascript判断网页是关闭还是刷新
Sep 12 Javascript
jquery简单插件制作(fn.extend)完整实例
May 24 Javascript
js控制li的隐藏和显示实例代码
Oct 15 Javascript
Node.js复制文件的方法示例
Dec 29 Javascript
vue 计时器组件的实现代码
Sep 14 Javascript
Angular7.2.7路由使用初体验
Mar 01 Javascript
JS实现的tab切换并显示相应内容模块功能示例
Aug 03 Javascript
VUE 单页面使用 echart 窗口变化时的用法
Jul 30 Javascript
JS实现多功能计算器
Oct 28 Javascript
Element-ui 自带的两种远程搜索(模糊查询)用法讲解
Jan 29 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获取mysql版本的几种方法小结
2008/03/25 PHP
PHP 验证登陆类分享
2015/03/13 PHP
PHP数组和explode函数示例总结
2015/05/08 PHP
PHP并发多进程处理利器Gearman使用介绍
2016/05/16 PHP
PHP获取文件扩展名的方法实例总结
2017/06/10 PHP
PHP+原生态ajax实现的省市联动功能详解
2017/08/15 PHP
基于PHP实现发微博动态代码实例
2020/12/11 PHP
精通JavaScript 纠正 cleanWhitespace函数
2010/03/11 Javascript
使用 Node.js 做 Function Test实现方法
2013/10/25 Javascript
jquery中change()用法实例分析
2015/02/06 Javascript
JavaScript 事件入门知识
2015/04/13 Javascript
轻松学习jQuery插件EasyUI EasyUI创建RSS Feed阅读器
2015/11/30 Javascript
JavaScript对象参数的引用传递
2016/01/14 Javascript
移动端H5开发 Turn.js实现很棒的翻书效果
2016/06/20 Javascript
jQGrid动态填充select下拉框的选项值(动态填充)
2016/11/28 Javascript
移动端基础事件总结与应用
2017/01/12 Javascript
javascript实现简易计算器
2017/02/01 Javascript
javascript 取小数点后几位几种方法总结
2017/08/02 Javascript
Express系列之multer上传的使用
2017/10/27 Javascript
学习JS中的DOM节点以及操作
2018/04/30 Javascript
JavaScript ES6箭头函数使用指南
2018/12/30 Javascript
一个手写的vue放大镜效果
2019/08/09 Javascript
vue.js click点击事件获取当前元素对象的操作
2020/08/07 Javascript
vue移动端写的拖拽功能示例代码
2020/09/09 Javascript
javascript中call,apply,bind的区别详解
2020/12/11 Javascript
[03:11]完美世界DOTA2联赛PWL DAY8集锦
2020/11/09 DOTA
使用Python标准库中的wave模块绘制乐谱的简单教程
2015/03/30 Python
Python实现将照片变成卡通图片的方法【基于opencv】
2018/01/17 Python
python使用thrift教程的方法示例
2019/03/21 Python
Python3 无重复字符的最长子串的实现
2019/10/08 Python
微信小程序canvas实现水平、垂直居中效果
2020/02/05 HTML / CSS
智能电子秤、手表和健康监测仪:Withings(之前为诺基亚健康)
2018/10/30 全球购物
简历中自我评价范文3则
2013/12/14 职场文书
村长反四风问题个人对照检查材料
2014/09/21 职场文书
2016年八一建军节活动总结
2016/04/05 职场文书
canvas绘制折线路径动画实现
2021/05/12 Javascript