详解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
Feb 25 Javascript
jQuery 表格插件整理
Apr 27 Javascript
一行代码实现纯数据json对象的深度克隆实现思路
Jan 09 Javascript
js基于cookie方式记住返回页面用法示例
May 27 Javascript
JavaScript提高网站性能优化的建议(二)
Jul 24 Javascript
老生常谈combobox和combotree模糊查询
Apr 17 Javascript
jQuery使用zTree插件实现可拖拽的树示例
Sep 23 jQuery
jQuery实现获取table中鼠标click点击位置行号与列号的方法
Oct 09 jQuery
vue2.0s中eventBus实现兄弟组件通信的示例代码
Oct 25 Javascript
jQuery 实现倒计时天,时,分,秒功能
Jul 31 jQuery
区分vue-router的hash和history模式
Oct 03 Javascript
antdesign-vue结合sortablejs实现两个table相互拖拽排序功能
Jan 08 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
实现树状结构的两种方法
2006/10/09 PHP
php array_map()数组函数使用说明
2011/07/12 PHP
如何使用Strace调试工具
2013/06/03 PHP
php上传图片到指定位置路径保存到数据库的具体实现
2013/12/30 PHP
PHP实现文件上传和多文件上传
2015/12/24 PHP
php解决约瑟夫环算法实例分析
2019/09/30 PHP
在chrome中window.onload事件的一些问题
2010/03/01 Javascript
JS获得QQ号码的昵称,头像,生日的简单实例
2013/12/04 Javascript
使用jQuery实现更改默认alert框体
2015/04/13 Javascript
解析javascript中鼠标滚轮事件
2015/05/26 Javascript
jquery简单实现外部链接用新窗口打开的方法
2015/05/30 Javascript
Angular2 多级注入器详解及实例
2016/10/30 Javascript
jQuery实现ajax无刷新分页页码控件
2017/02/28 Javascript
js实现点击展开隐藏效果(实例代码)
2018/09/28 Javascript
webpack dll打包重复问题优化的解决
2018/10/10 Javascript
Angular刷新当前页面的实现方法
2018/11/21 Javascript
Vue2.0使用嵌套路由实现页面内容切换/公用一级菜单控制页面内容切换(推荐)
2019/05/08 Javascript
vue 表单之通过v-model绑定单选按钮radio
2019/05/13 Javascript
vue 自定义组件的写法与用法详解
2020/03/04 Javascript
vue自定义指令限制输入框输入值的步骤与完整代码
2020/08/30 Javascript
利用Vue实现简易播放器的完整代码
2020/12/30 Vue.js
[49:05]Newbee vs TNC 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python操作json数据的一个简单例子
2014/04/17 Python
Python实现判断一个字符串是否包含子串的方法总结
2017/11/21 Python
Django之提交表单与前后端交互的方法
2019/07/19 Python
python脚本后台执行方式
2019/12/21 Python
Django重设Admin密码过程解析
2020/02/10 Python
python 错误处理 assert详解
2020/04/20 Python
canvas实现烟花的示例代码
2020/01/16 HTML / CSS
Tech21美国/加拿大:英国NO.1防摔保护壳品牌
2018/01/20 全球购物
同步和异步有何异同,在什么情况下分别使用他们
2013/04/09 面试题
大学生的应聘自我评价
2013/12/13 职场文书
怎样客观的做好自我评价
2013/12/28 职场文书
师范教师专业大学生职业生涯规划范文
2014/03/02 职场文书
规范化管理年活动总结
2014/08/29 职场文书
mysql脏页是什么
2021/07/26 MySQL