初始化

基于 umijs[3.4.7]、swr[0.5.4]、antd[4.14.1]

  1. # 使用国内源
  2. npm i yarn tyarn -g
  3. # 创建空目录
  4. mkdir myswr && cd myswr
  5. # 使用官方工具创建项目
  6. tyarn create @umijs/umi-app
  7. # 安装依赖
  8. tyarn
  9. # 安装 antd、swr
  10. tyarn add antd swr
  11. # 启动项目
  12. tyarn start

页面布局

代码

  1. // src/index.tsx
  2. import useSWR from 'swr';
  3. import {Divider, Avatar, Skeleton} from 'antd';
  4. function fetchUser() {
  5. return fetch('api/user').then(res => (res.json()))
  6. }
  7. const MyAvatar = () => {
  8. const { data, error } = useSWR('/user', fetchUser);
  9. if (data && !error) {
  10. return (
  11. <Avatar src={data.avatar} />
  12. )
  13. }
  14. return (
  15. <Skeleton.Avatar active shape="circle" />
  16. )
  17. }
  18. const Content = () => {
  19. const {data} = useSWR('/user', fetchUser);
  20. return (
  21. <h1 style={{textAlign: 'center'}}>
  22. welcome {data && data.name ? data.name : '--'}
  23. </h1>
  24. )
  25. }
  26. export default function Index() {
  27. return (
  28. <div>
  29. <div style={{textAlign: 'right', padding: '24px 24px 0 0'}}>
  30. <MyAvatar />
  31. </div>
  32. <Divider />
  33. <Content />
  34. </div>
  35. );
  36. }

mock 数据

  1. // mock/index.ts
  2. export default {
  3. 'GET /api/user': (req: any, res: any) => {
  4. let timer = setTimeout(() => {
  5. res.send({
  6. name: 'liao',
  7. avatar: 'https://zos.alipayobjects.com/rmsportal/ODTLcjxAfvqbxHnVXCYX.png'
  8. });
  9. }, 3000)
  10. }
  11. };

结果

user 接口只请求一次
1wsit-5tnyi.gif