react native hooks 如何避免重复请求

在React Native中使用Hooks时,为了避免重复发送网络请求,你可以采取以下几个方法:

  1. 使用 useRef 存储最新请求标识或结果 :

    可以创建一个 useRef 用来存储上一次请求的标识(如请求的URL加上请求参数的哈希值),在每次发起新的请求前,先检查这个标识是否与当前要发送的请求相同。如果是,则取消或跳过新请求。

    javascript 复制代码
    import React, { useRef, useEffect } from 'react';
    import axios from 'axios';
    
    function SomeComponent({ url, params }) {
      const latestRequestId = useRef(null);
    
      useEffect(() => {
        if (latestRequestId.current !== null) return; // 如果已有请求正在进行,直接返回
    
        const requestId = /* 计算请求ID */;
        
        // 发起请求
        axios.get(url, { params })
          .then(response => {
            // 更新状态或做其他处理...
          })
          .finally(() => {
            // 请求完成后更新请求标识
            latestRequestId.current = null;
          });
    
        // 设置当前请求标识
        latestRequestId.current = requestId;
      }, [url, params]);
    
      // 返回组件...
    }
  2. 使用 useEffect 清理函数取消请求 :

    如果你使用的是支持取消的HTTP客户端(例如axios),可以在 useEffect 的清理函数中取消未完成的请求。

    javascript 复制代码
    import React, { useEffect } from 'react';
    import axios from 'axios';
    import { CancelTokenSource } from 'axios';
    
    function SomeComponent({ url, params }) {
      const cancelTokenSource = useRef(null);
    
      useEffect(() => {
        cancelTokenSource.current = axios.CancelToken.source();
    
        axios.get(url, { params, cancelToken: cancelTokenSource.current.token })
          .then(response => {
            // 处理响应
          })
          .catch(error => {
            if (axios.isCancel(error)) {
              console.log('Request cancelled');
            } else {
              throw error;
            }
          });
    
        // 清理函数中取消请求
        return () => {
          if (cancelTokenSource.current) {
            cancelTokenSource.current.cancel();
          }
        };
      }, [url, params]);
    
      // 返回组件...
    }
  3. 请求缓存与节流/防抖:

    • 使用第三方库(如react-query、swr等)可以帮助管理请求状态、缓存和自动重试等功能,它们通常内置了避免重复请求的机制。
    • 自己实现的话,可以结合 debounce 或 throttle 函数来控制用户交互触发的请求频率,确保在一定时间内只有一个请求发出。
  4. 状态管理:

    • 在Redux或者Context API等全局状态管理方案中,可以在请求开始时记录请求状态,并且在新的请求到来时检查当前是否有未完成的相同请求,若有则不发起新的请求。

通过以上方式可以有效地避免在React Native应用中使用Hooks时的重复请求问题。

相关推荐
PYB36 小时前
【Web·JS·基础】函数的使用和展运算符...objs
前端·javascript
默_笙7 小时前
🚥 给 RAG 装一台心电监护仪:LangSmith 全链路观测(上)
前端·javascript
变与不变8069 小时前
js同步和异步难点重点详解
开发语言·javascript·ecmascript
Dovis(誓平步青云)9 小时前
多个链接不等于多份证据,新闻核验看板怎样合并来源
java·服务器·前端·javascript·人工智能·pdf·电脑
Dovis(誓平步青云)10 小时前
几个方案来回选不定?做一个随时切换的候选推荐页
android·java·服务器·开发语言·javascript·数据库·智能化
可乐鸡翅yeah_11 小时前
fmp4 碎片 MP4 格式 HLS 流,和传统 TS 分片有什么不一样
开发语言·javascript·ios·音视频·safari·m3u8·m3u8在线播放
ss27312 小时前
AI全栈实战 | 2.3-01 组件库实战:Element Plus 怎么搭出专业界面,过度封装为什么成维护负担
前端·javascript·elementui·vue
福兮说13 小时前
URL 编码的七个坑:c++ 传到后端变空格、%25 套娃、截断 emoji 直接报错
开发语言·前端·javascript·node.js·url
小的时候可菜了13 小时前
JS 异步的本质:从单线程到 thenable(一条进化链)
开发语言·前端·javascript
可乐鸡翅yeah_13 小时前
hls.js 配置 loadStartPosition,点播起始播放位置踩坑
开发语言·javascript·网络协议·ecmascript·m3u8在线