你们好,我是来自重庆的一个精神小伙,今年毕业,来了掘金已经有很多时间了,但从没写过一篇文章,这是个人第一篇掘金文章,写得很差之处但愿大佬们能指出。前端
先吐槽一下,由于本人英语阅读能力有限,swr目前只有英文文档,刚开始看的是英文文档,比较头大,幸亏知乎上已经有飞冰大佬翻译成中文,连接为:react
[swr中文使用手册]zhuanlan.zhihu.com/p/89570321ios
先简单的说一下axios
swr是一个用于请求远程数据的 React Hooks 库,这是官网的快速开始实例api
import useSWR from 'swr'
function Profile () {
const { data, error } = useSWR('/api/user', fetch)
if (error) return <div>failed to load</div>
if (!data) return <div>loading...</div>
return <div>hello {data.name}!</div>
}
复制代码
useSWR 接受一个 key 和一个异步请求函数 fetch 做为参数。 key 是数据的惟一标识符,一般是 API URL,而且 fetch 接受 key 做为其参数,而且 fetch 接受 key 做为其参数,而且 fetch 接受 key 做为其参数,完成具体的数据请求行为并异步返回数据。异步
fetch是一个远程请求,好比它能够是使用axios来获取async
const fetch = axios({
//这里的url,接收的就是传的key '/api/user'
url,
method: "get"
}).then(res => {
console.log(res);
responseData = res.data;
});
复制代码
在传统的方式在咱们在componentdidmount中请求,而后setState,存入state中,使用react-hooks也是同样的,须要在useEffect中为state赋初值,套路是同样的,缺点也很明显,特别麻烦函数
class Demo extends React.Component {
constructor(props) {
super(props);
this.state = { }
}
componentDidMount() {
axios('...').then(result => {
this.setState({data: result});
});
}
render() {
if (!this.state.data) {
return null;
} else {
return <div>this.state.data</div>;
}
}
}
复制代码
import React, { Suspense, useEffect } from "react";
import useSWR from "swr";
import fetcher from "../../../../api/user";
const Child = () => {
const { data } = useSWR("/api/users/alluser", fetcher, { suspense: true });
useEffect(() => {}, []);
console.log(data);
const renderItem = () => {
return data.data.map((item, index) => {
return <li key={item.key}>{item.name}</li>;
});
};
return <ul>{renderItem()}</ul>;
};
const App = () => {
return (
<Suspense fallback={<div>我是一个前端,成天郁郁寡欢</div>}>
<Child></Child>
</Suspense>
);
};
export default App;
复制代码
别急,且容我慢慢道来!fetch
Susponse用一句话来归纳的话,就是用同步的代码来实现异步操做,它能够明显减小请求时候的代码量。this
为了解决上述问题呢,上述代码中,咱们可使用susponse+swr简化请求的流程,在swr中,有一个option能够设置成{ suspense: true },即为开启susponse,子组件使用useSWR后,获取返回的data,将它渲染成li标签。 而后在父标签中,使用Susponse组件,Susponse组件的用处是,当子组件请求还在pending中时候,就显示fallback的内容,当请求完成后,就显示子组件,这是否是对比于传统方法来讲清晰多了。爽不爽!爽不爽!爽不爽!
使用的是飞冰,自带的mock能力
module.exports = {
// 同时支持 GET 和 POST
"/api/users/alluser": {
data: [
{
key: "1",
name: "小瓜皮"
},
{
key: "2",
name: "小皮瓜"
}
]
}
};
复制代码
import axios from "axios";
async function fetcher(url) {
let res;
switch (url) {
case "/api/users/alluser":
res = await axios({
url,
method: "get"
});
break;
default:
break;
}
return res.data;
}
export default fetcher;
复制代码
刚开始还在请求中,状态为pending时候
若是以为这篇文章对您有帮助,麻烦点击左上方的小星星,谢啦