千锋教育-做有情怀、有良心、有品质的职业教育机构

手机站
千锋教育

千锋学习站 | 随时随地免费学

千锋教育

扫一扫进入千锋手机站

领取全套视频
千锋教育

关注千锋学习站小程序
随时随地免费学习课程

当前位置:首页  >  技术干货  > React中使用SWR处理数据请求

React中使用SWR处理数据请求

来源:千锋教育
发布人:wjy
时间: 2022-06-01 16:54:00 1654073640

  在做React项目开发的时候,我们一般都会直接使用axios插件或者fetch进行数据的获取。但是这一次给大家介绍一个插件库SWR,算是网络数据请求的一个补充吧。

React中使用SWR处理数据请求

  先上官网地址:[https://swr.vercel.app/zh-CN](https://link.zhihu.com/?target=https%3A//swr.vercel.app/zh-CN)

  ### SWR

  SWR是一个用于数据请求的React Hooks库,使用SWR组件可以实时的获取服务器最新的数据。借用官方的说明:“SWR” 这个名字来自于 `stale-while-revalidate`:一种由 [HTTP RFC 5861](https://link.zhihu.com/?target=https%3A//tools.ietf.org/html/rfc5861) 推广的 HTTP 缓存失效策略。这种策略首先从缓存中返回数据(过期的),同时发送 fetch 请求(重新验证),最后得到最新数据。

  当我们重新聚焦一个页面或在标签页之间切换时重新获取最新的数据,或者也可以自行设置一个获取数据的时间间隔(refreshInterval)。

  ### 安装

  ```bash

  npm i swr

  # or

  yarn add swr

  ```

  使用npm或者yarn在react项目中安装swr插件。

  ### 使用

  ```js

  const { data, error, isValidating, mutate } = useSWR(key, fetcher, options)

  ```

  ### 参数

  - `key`: 请求的唯一 key string

  - `fetcher`:(*可选*)一个请求数据的 Promise 返回函数

  - `options`:(*可选*)该 SWR hook 的选项对象

  ### 返回值

  - `data`: 通过 `fetcher` 用给定的 key 获取的数据(如未完全加载,返回 undefined)

  - `error`: `fetcher` 抛出的错误(或者是 undefined)

  - `isValidating`: 是否有请求或重新验证加载

  - `mutate(data?, shouldRevalidate?)`: 更改缓存数据的函数

  data表示数据,可以修改缓存的数据,一般在数据改变的时候使用,可以结合post请求操作

  是否需要和服务器上的数据进行比对校验

  ### 选项

  - `revalidateOnFocus = true`: 窗口聚焦时自动重新验证

  - `refreshInterval = 0`: 轮询间隔 (默认 disabled)

  在使用时,我只列出了最常用的一些配置信息。其他的可以参考官方文档

  文档地址:[https://swr.vercel.app/zh-CN/docs/options](https://link.zhihu.com/?target=https%3A//swr.vercel.app/zh-CN/docs/options)

  ### 举个例子

  ```js

  import React from 'react';

  import useSWR from 'swr';

  const fetcher = (url) => fetch(url).then((res) => res.json());

  const SwrDemo = () => {

  const { data, error } = useSWR('/api/pets', fetcher);

  // console.log(error);

  if (error) return

failed to load

;

 

  if (!data) return

loading...

;

 

  return

{data.length}

;

 

  };

  export default SwrDemo;

  ```

  比如,只想使用swr实现一个简单的实时获取服务器最新数据的功能,可以直接设置refreshInterval参数,设置一个获取刷新数据的间隔时间,这样子客户端代码就会轮询的方式进行接口的调用。

  当我们的页面重新聚焦或者标签页切换的时候会自动的获取最新的数据,也就是说只要用户返回打开了我们的项目,那么使用了swr包装的网络请求,都会尽心再一次的数据获取,保证页面以最新的数据展示。

  ### 参数传递

  在调用fetcher的时候如果要传递多个参数,可以使用数组的形式进行传递。

  ```js

  // 默认情况下,key 将作为参数传递给 fetcher

  useSWR('/api/user', () => fetcher('/api/user'))

  useSWR('/api/user', url => fetcher(url))

  useSWR('/api/user', fetcher)

  ```

  如果需要传递多个参数,那么参数使用数组的形式进行组织,比如:

  ```js

  const fetcher = (url, id) => {

  console.log(url, id);

  return fetch(url).then((res) => res.json());

  };

  const SwrDemo = () => {

  const { data, error } = useSWR(['/api/pets', 111], fetcher);

  ...

  };

  ...

  ```

  ### 重新验证数据

  swr中的mutate方法可以通过指定可以的形式,触发所有相同key的请求进行数据校验,更新最新值。比如

  ```text

  import useSWR, { mutate } from 'swr'

  ...

  const SwrDemo = () => {

  const { data, error } = useSWR('/api/pets', fetcher);

  ...

  

  };

  ...

  ```

  ### 更改数据

  ```text

  import React from 'react';

  import useSWR, { mutate as M } from 'swr';

  const fetcher = (url) => {

  return fetch(url).then((res) => res.json());

  };

  const SwrDemo = () => {

  const { data, error, mutate } = useSWR('/api/pets', fetcher);

  if (error) return

failed to load

;

 

  if (!data) return

loading...

;

 

  console.log(data);

  return (

  

 

  

 

  {data.map((item) => (

  

    • {item.name}

 

  ))}

  

 

  <button< p="">

  onClick={() => {

  // 点击添加的时候使用改变当前key对应的缓存数据的方法,只对本地数据做修改

  // 当前所做的修改是没有结合api接口的,所以此处不做服务器端校验

  // 参数二传递false

  mutate(

  [...data, { _id: Date.now(), name: '小明' + Math.random() }],

  false

  );

  }}

  >

  添加

  

  


 

  {data.length}


 

  

  

 

  );

  };

  export default SwrDemo;

  ```

  此例子演示的效果是数据在本地做缓存更改,手动更新按钮点击之后会重新和服务器的数据做比对,获取服务器最新的数据进行显示。如果需要更新服务器的数据,可以结合api接口发送对应的请求实现

  ### 总结

  SWR是一个神奇的插件,使用它可以为我们的项目带来更好的体验。这里只是列出来了一些常用的方法,如果想了解更多,可以看下官方文档中的更多说明。更多关于“html5培训”的问题,欢迎咨询千锋教育在线名师。千锋已有十余年的培训经验,课程大纲更科学更专业,有针对零基础的就业班,有针对想提升技术的提升班,高品质课程助理你实现梦想。

tags:
声明:本站稿件版权均属千锋教育所有,未经许可不得擅自转载。
10年以上业内强师集结,手把手带你蜕变精英
请您保持通讯畅通,专属学习老师24小时内将与您1V1沟通
免费领取
今日已有369人领取成功
刘同学 138****2860 刚刚成功领取
王同学 131****2015 刚刚成功领取
张同学 133****4652 刚刚成功领取
李同学 135****8607 刚刚成功领取
杨同学 132****5667 刚刚成功领取
岳同学 134****6652 刚刚成功领取
梁同学 157****2950 刚刚成功领取
刘同学 189****1015 刚刚成功领取
张同学 155****4678 刚刚成功领取
邹同学 139****2907 刚刚成功领取
董同学 138****2867 刚刚成功领取
周同学 136****3602 刚刚成功领取
相关推荐HOT