出处:《react设计模式和最佳实践》
作者:米凯莱·贝尔托利
出版时间:2018年8月第1版(还算新)

使用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)

来源:https://segmentfault.com/a/1190000018151481

最新文章

  1. linux下查看最消耗CPU、内存的进程
  2. COG注释--转载
  3. activemq jmsTemplate 发送消息速度太慢
  4. selenium第一课(selenium+java+testNG+maven)
  5. FLUSH TABLES WITH READ LOCK
  6. Codevs_1040_[NOIP2001]_统计单词个数_(划分型动态规划)
  7. HTML5的优缺点是什么?
  8. TreeMap cannot be cast to java.lang.Comparable
  9. 基于Redis缓存的Session共享(附源码)
  10. 深入理解position属性&containing block
  11. Linux和window的区别
  12. 利用Python实现“指尖陀螺”,让你释放压力
  13. 信息摘要算法之六:HKDF算法分析与实现
  14. js对象属性名驼峰式转下划线
  15. Show tree of processes in linux
  16. 《Essential C++》读书笔记 之 泛型编程风格
  17. S3cmd命令行管理对象存储
  18. Haskell语言学习笔记(73)Existentials
  19. discuz回贴通知插件实现-插件后台管理配置
  20. Check类之duplicate declaration checking/Class name generation/Type Checking

热门文章

  1. Go基础---->go的第一个程序
  2. JAVA NIO使用非阻塞模式实现高并发服务器
  3. Maven 构建Spring-Boot工程报错
  4. Web测试系列之测试工具
  5. Eclipse+ADT+Android SDK 搭建安卓开发环境(版权属于forever-z)
  6. Xcode升级了6.3 出现的警告:Auto property synthesis will not synthesize property
  7. Netty in action—Netty中的ByteBuf
  8. glibc-2.23_large_bin链接方式_浅析
  9. intellij idea 编码设置(乱码问题)
  10. linux创建lvm分区