详解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中的对象 推荐
Jan 09 Javascript
jquery easyui滚动条部分设置介绍
Sep 12 Javascript
省市区三级联动下拉框菜单javascript版
Aug 11 Javascript
SpringMVC restful 注解之@RequestBody进行json与object转换
Dec 10 Javascript
Bootstrap模态对话框的简单使用
Apr 29 Javascript
浅谈jQuery效果函数
Sep 16 Javascript
详谈js遍历集合(Array,Map,Set)
Apr 06 Javascript
JavaScript中undefined和null的区别
May 03 Javascript
浅谈vue2 单页面如何设置网页title
Nov 08 Javascript
bootstrap表格内容过长时用省略号表示的解决方法
Nov 21 Javascript
vue element 生成无线级左侧菜单的实现代码
Aug 21 Javascript
vue实现随机验证码功能(完整代码)
Dec 10 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
「OVERLORD」动画重要删减!雅儿贝德的背叛?至尊猎杀队结成
2020/04/09 日漫
php中判断数组是一维,二维,还是多维的解决方法
2013/05/04 PHP
PHP实现根据浏览器跳转不同语言页面代码
2013/08/02 PHP
php实现无限级分类
2014/12/24 PHP
PHP经典面试题集锦
2015/03/19 PHP
PHP多文件上传实例
2015/07/09 PHP
PHP实现电商订单自动确认收货redis队列
2017/05/17 PHP
js中的referrer返回上一页使用介绍
2013/09/26 Javascript
引用外部脚本时script标签关闭的写法
2014/01/20 Javascript
JavaScript结合AJAX_stream实现流式显示
2015/01/08 Javascript
jQuery动态添加及删除表单上传元素的方法(附demo源码下载)
2016/01/15 Javascript
Angularjs使用directive自定义指令实现attribute继承的方法详解
2016/08/05 Javascript
jQuery插件实现可输入和自动匹配的下拉框
2016/10/24 Javascript
vue元素实现动画过渡效果
2017/07/01 Javascript
全面解析jQuery中的$(window)与$(document)的用法区别
2017/08/15 jQuery
微信小程序-可移动菜单的实现过程详解
2019/06/24 Javascript
高性能js数组去重(12种方法,史上最全)
2019/12/21 Javascript
vue 使用post/get 下载导出文件操作
2020/08/07 Javascript
Vue实现指令式动态追加小球动画组件的步骤
2020/12/18 Vue.js
python实现博客文章爬虫示例
2014/02/26 Python
Python实现的批量下载RFC文档
2015/03/10 Python
python3+mysql查询数据并通过邮件群发excel附件
2018/02/24 Python
Django开发中复选框用法示例
2018/03/20 Python
获取python的list中含有重复值的index方法
2018/06/27 Python
django 信号调度机制详解
2019/07/19 Python
python使用sklearn实现决策树的方法示例
2019/09/12 Python
python实现图像拼接功能
2020/03/23 Python
Python logging模块进行封装实现原理解析
2020/08/07 Python
肯尼亚网上商城:Kilimall
2016/08/20 全球购物
Melissa鞋英国官方网站:Nonnon
2019/05/01 全球购物
工商企业管理应届生求职信
2013/11/03 职场文书
装饰工程师岗位职责
2014/06/08 职场文书
前台接待岗位职责范本
2015/04/03 职场文书
纪录片信仰观后感
2015/06/08 职场文书
2015新教师教学工作总结
2015/07/22 职场文书
Hive HQL支持2种查询语句风格
2022/06/25 数据库