详解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 相关文章推荐
js loading加载效果实现代码
Nov 24 Javascript
javascript css styleFloat和cssFloat
Mar 15 Javascript
JS给超链接加确认对话框的方法
Feb 24 Javascript
JS实现仿FLASH效果的竖排导航代码
Sep 15 Javascript
BootStrap的弹出框(Popover)支持鼠标移到弹出层上弹窗层不隐藏的原因及解决办法
Apr 03 Javascript
深入浅析Extjs中store分组功能的使用方法
Apr 20 Javascript
全面解析Bootstrap中tooltip、popover的使用方法
Jun 13 Javascript
用JS动态设置CSS样式常见方法小结(推荐)
Nov 10 Javascript
浅谈jQuery操作类数组的工具方法
Dec 23 Javascript
浅谈javascript的闭包
Jan 23 Javascript
获取url中用&amp;隔开的参数实例(分享)
May 28 Javascript
在Js页面通过POST传递参数跳转到新页面详解
Aug 25 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实现多服务器session共享之NFS共享的方法
2007/03/16 PHP
PHP与SQL注入攻击[一]
2007/04/17 PHP
php使用explode()函数将字符串拆分成数组的方法
2015/02/17 PHP
php用ini_get获取php.ini里变量值的方法
2015/03/04 PHP
php获取本周开始日期和结束日期的方法
2015/03/09 PHP
php解析url并得到url中的参数及获取url参数的四种方式
2015/10/26 PHP
PHP模板引擎Smarty内建函数section,sectionelse用法详解
2016/04/11 PHP
ThinkPHP实现图片上传操作的方法详解
2017/05/08 PHP
用JavaScript脚本实现Web页面信息交互
2006/10/11 Javascript
JavaScript面向对象编程
2008/03/02 Javascript
19个很有用的 JavaScript库推荐
2011/06/27 Javascript
jQuery获取CSS样式中的颜色值的问题,不同浏览器格式不同的解决办法
2013/05/13 Javascript
高效的获取当前元素是父元素的第几个子元素
2013/10/15 Javascript
javascript数字时钟示例分享
2014/04/23 Javascript
Javascript基于AJAX回调函数传递参数实例分析
2015/12/15 Javascript
基于BootStrap Metronic开发框架经验小结【一】框架总览及菜单模块的处理
2016/05/12 Javascript
js实现日历的简单算法
2017/01/24 Javascript
整理关于Bootstrap导航的慕课笔记
2017/03/29 Javascript
angular4自定义组件详解
2017/09/28 Javascript
vue中mint-ui的使用方法
2018/04/04 Javascript
微信小程序踩坑记录之解决tabBar.list[3].selectedIconPath大小超过40kb
2018/07/04 Javascript
微信小程序用户盒子、宫格列表的实现
2020/07/01 Javascript
详解React中共享组件逻辑的三种方式
2021/02/02 Javascript
python 爬取学信网登录页面的例子
2019/08/13 Python
使用Keras建立模型并训练等一系列操作方式
2020/07/02 Python
Python用K-means聚类算法进行客户分群的实现
2020/08/23 Python
利用CSS3实现折角效果实例源码
2016/09/28 HTML / CSS
英国最大的女士服装零售商:Bonmarché
2017/08/17 全球购物
市政施工员自我鉴定
2014/01/15 职场文书
奠基仪式主持词
2014/03/20 职场文书
人事代理委托书
2014/09/27 职场文书
个人培训总结
2015/03/05 职场文书
2015年计生协会工作总结
2015/04/24 职场文书
校运会通讯稿
2015/07/18 职场文书
使用Python开发冰球小游戏
2022/04/30 Python
MySQL数据库安装方法与图形化管理工具介绍
2022/05/30 MySQL