nuxt3 useFetch封装一个api接口http请求 - 解决刷新页面useFetch无返回

文章讨论了在Nuxt3项目中封装接口请求时遇到的刷新页面数据不更新的问题。作者通过添加时间戳参数强制刷新数据,但导致F5刷新时无法获取数据。文中提到了利用nextTick尝试解决,以及在http.ts文件中自定义fetch方法进行错误处理和接口调用。最后,展示了如何在组件中使用这些方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目中封装接口请求,并且解决刷新页面useFetch无返回数据问题
刷新页面useFetch无返回数据问题:

浏览器刷新的时候页面没有显示数据,接口data无返回。本身nuxt的useFetch在参数不变的情况下,数据是不会重新从后台接口去请求数据的,会直接拿上一次的结果。但是有实时去后台获取数据这样的需求,
比如我的关注页面,在其他页面点了关注,每次进这个页面或者刷新都需要去后台重新获取数据,所以我给入参加了一个以时间戳为值的参数key,但是这样导致每次F5刷新页面的时候,都拿不到数据,导致页面没有显示。Suspense不起作用。

utils/https.ts

import { _AsyncData } from "nuxt3/dist/app/composables/asyncData";
import { ElMessage } from "element-plus";

const baseUrl = "";
// 指定后端返回的基本数据类型
export interface ResponseConfig {
  code: number;
  status: number;
  data: any;
  msg: string;
}
export interface ValueConfig {
  value: any;
}

const fetch = async (url: string, options?: any): Promise<any> => {
  await nextTick(); //解决刷新页面useFetch无返回
  const reqUrl = baseUrl + url;
  return new Promise((resolve, reject) => {
    useFetch(reqUrl, { ...options })
      .then(({ data, error }: _AsyncData) => {
        if (error.value) {
          reject(error.value);
          return;
        }
        const value = data.value;
        if (!value) {
          console.log("执行错误了");
          // 这里处理错误回调
          // reject(value)
          // $router.replace('/reject/' + value.status)
        } else if (value.code === 102) {
          ElMessage({
            message: value.msg,
            type: "error",
          });
        } else {
          resolve(ref(value));
        }
      })
      .catch((err: any) => {
        reject(err);
      });
  });
};

export default new (class Http {
  get(url: string, params?: any): Promise<any> {
    return fetch(url, { method: "get", params });
  }

  post(url: string, params?: any): Promise<any> {
    return fetch(url, { method: "post", params });
  }

  put(url: string, body?: any): Promise<any> {
    return fetch(url, { method: "put", body });
  }

  delete(url: string, body?: any): Promise<any> {
    return fetch(url, { method: "delete", body });
  }
})();

使用方法:composables/index.ts,api接口放在这个里面会自动导入函数

import Http from "@/utils/http";

/**
 * 测试接口
 */
export const getTags = () => {
  return Http.get("https://api/apiWx/wechat-config");
};

在页面或者组件中使用:

onMounted(() => {
   getTags()
     .then((res) => {
       console.log(res.value.data, "res");
     })
     .catch((err) => {
      console.log(err, "错误");
   });
});
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王小王和他的小伙伴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值