react-refetch的使用小例子
2024-10-15 19:34:11
出处:《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
最新文章
- linux下查看最消耗CPU、内存的进程
- COG注释--转载
- activemq jmsTemplate 发送消息速度太慢
- selenium第一课(selenium+java+testNG+maven)
- FLUSH TABLES WITH READ LOCK
- Codevs_1040_[NOIP2001]_统计单词个数_(划分型动态规划)
- HTML5的优缺点是什么?
- TreeMap cannot be cast to java.lang.Comparable
- 基于Redis缓存的Session共享(附源码)
- 深入理解position属性&;containing block
- Linux和window的区别
- 利用Python实现“指尖陀螺”,让你释放压力
- 信息摘要算法之六:HKDF算法分析与实现
- js对象属性名驼峰式转下划线
- Show tree of processes in linux
- 《Essential C++》读书笔记 之 泛型编程风格
- S3cmd命令行管理对象存储
- Haskell语言学习笔记(73)Existentials
- discuz回贴通知插件实现-插件后台管理配置
- Check类之duplicate declaration checking/Class name generation/Type Checking
热门文章
- Go基础---->;go的第一个程序
- JAVA NIO使用非阻塞模式实现高并发服务器
- Maven 构建Spring-Boot工程报错
- Web测试系列之测试工具
- Eclipse+ADT+Android SDK 搭建安卓开发环境(版权属于forever-z)
- Xcode升级了6.3 出现的警告:Auto property synthesis will not synthesize property
- Netty in action—Netty中的ByteBuf
- glibc-2.23_large_bin链接方式_浅析
- intellij idea 编码设置(乱码问题)
- linux创建lvm分区