Nuxt3封装useFetch请求并防止参数自动更新请求方式

 更新时间:2026年03月27日 10:12:31   作者:中规中矩的boy  
这篇文章主要介绍了Nuxt3封装useFetch请求并防止参数自动更新请求方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

前言

useFetch 可组合函数提供了一个方便的包装器,用于useAsyncData和$fetch。

它会自动生成基于URL和fetch选项的键,根据服务器路由提供请求URL的类型提示,并推断API响应类型。

useFetch,应该直接在设置函数、插件或路由中间件中调用。它返回响应式的可组合函数,并处理将响应添加到Nuxt负载中,以便在页面水合期间从服务器传递给客户端而无需重新获取数据。

注意:所有fetch选项都可以使用computed或ref值进行赋值。如果这些值更新,将自动进行新的请求。

以下请求封装脱离了自动请求!!!

第一步 更改配置

1.配置环境变量

//.env.development
NUXT_PUBLIC_API_BASE=http://localhost:8099/v1/api
//.env.production
NUXT_PUBLIC_API_BASE=http://110.110.110.110:8099/v1/api

2.修改package.json配置

//package.json
"dev": "nuxt dev --dotenv .env.development",
"build": "nuxt build --dotenv .env.production",

3.修改nuxt.config.ts配置

//nuxt.config.ts
 // 添加运行时配置
runtimeConfig: {
   apiSecret: process.env.NUXT_API_SECRET,
   public: {
     apiBase: process.env.NUXT_PUBLIC_API_BASE || SERVER_BASE_API,
   }
}
---------------------------------------------------------------------
// 如果存在跨域
nitro: {
   devProxy: {
     '/api': {
       target: process.env.NUXT_PUBLIC_API_BASE,
       changeOrigin: true,
     }
   }
 }

第二步 请求封装

1.在composables目录下新建MyRequest.ts

_nuxt/composables/MyRequest.ts
//MyRequest.ts
import { ElMessage } from 'element-plus';

type UrlType = string | Request | Ref<string | Request> | (() => string | Request);

export interface RequestOptions {
  method?: any;
  params?: any;
}

const request = async (url: UrlType, params: any, options: RequestOptions) => {
  const headers = useRequestHeaders(['cookie']);
  const { apiBase: baseURL } = useRuntimeConfig().public;
  const { method = ((options?.method || 'GET') as string).toUpperCase() } = options;
  return await useFetch(url as string, {
    default: () => [],
    baseURL,
    method,
    params:{...params},//temp hook
    headers,
    // lazy: true,
    credentials: 'include',
    body: method === 'POST' ? JSON.stringify(params) : undefined,
    onRequest({ request, options }) {
      // Set the request headers
      //   options.headers = options.headers || {};
    },
    onRequestError({ request, options, error }) {
      ElMessage.closeAll()
      error && ElMessage.error('Sorry, The Data Request Failed');
      // Handle the request errors
    },
    onResponse({ request, response, options }) {
      // Process the response data
      return response._data;
    },
    onResponseError({ request, response, options }) {
      console.log('🚀 ~ file: MyRequest.ts:42 ~ onResponseError ~ request:', request);
      // Handle the response errors
    },
  });
};

export const useDefaultRequest = {
  get: (url: UrlType, params?: any, option?: RequestOptions) => {
    return request(url, params, { method: 'GET', ...option });
  },
  post: (url: UrlType, params?: any, option?: RequestOptions) => {
    return request(url, params, { method: 'POST', ...option });
  },
};

2.API封装

_nuxt/composables/Api.ts
export const useApiProductList = (params: any): any => {
  return useDefaultRequest.get('/request', params);
};
export const useApiProductList = (params: any): any => {
  return useDefaultRequest.get('/request1', params);
};
export const useApiProductList = (params: any): any => {
  return useDefaultRequest.post('/request2', params);
};

第三步 使用

const { data: response } = useApiSetContact(inquiryForm);

type UseFetchOptions = {
  key?: string
  method?: string
  query?: SearchParams
  params?: SearchParams
  body?: RequestInit['body'] | Record<string, any>
  headers?: Record<string, string> | [key: string, value: string][] | Headers
  baseURL?: string
  server?: boolean
  lazy?: boolean
  immediate?: boolean
  default?: () => DataT
  transform?: (input: DataT) => DataT
  pick?: string[]
  watch?: WatchSource[]
}

type AsyncData<DataT, ErrorT> = {
  data: Ref<DataT | null>
  pending: Ref<boolean>
  refresh: (opts?: AsyncDataExecuteOptions) => Promise<void>
  execute: (opts?: AsyncDataExecuteOptions) => Promise<void>
  error: Ref<ErrorT | null>
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Vue3使用video-player实现视频播放

    Vue3使用video-player实现视频播放

    video-player是一个基于video.js的视频播放器组件,本文主要介绍了Vue3使用video-player实现视频播放,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • 利用vue组件自定义v-model实现一个Tab组件方法示例

    利用vue组件自定义v-model实现一个Tab组件方法示例

    这篇文章主要给大家介绍了关于利用vue组件自定义v-model实现一个Tab组件的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-12-12
  • vue3中使用jsx的实现步骤

    vue3中使用jsx的实现步骤

    本文主要介绍了vue3中使用jsx的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • Vue3.0 axios跨域请求代理服务器配置方式

    Vue3.0 axios跨域请求代理服务器配置方式

    这篇文章主要介绍了Vue3.0 axios跨域请求代理服务器配置方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-04-04
  • Vue实现点击按钮下载文件的操作代码(后端Java)

    Vue实现点击按钮下载文件的操作代码(后端Java)

    最近项目中需要实现点击按钮下载文件的需求,前端用的vue后端使用的java代码,今天通过本文给大家分享vue点击按钮下载文件的实现代码,需要的朋友参考下吧
    2021-08-08
  • vue router的基本使用和配置教程

    vue router的基本使用和配置教程

    这篇文章主要介绍了vue-router的基本使用和配置教程,非常不错,具有一定的参考借鉴价值,需要的朋友参考下吧,需要的朋友可以参考下
    2018-11-11
  • Vue $attrs & inheritAttr实现button禁用效果案例

    Vue $attrs & inheritAttr实现button禁用效果案例

    这篇文章主要介绍了Vue $attrs & inheritAttr实现button禁用效果案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • 详解vuex数据传输的两种方式及this.$store undefined的解决办法

    详解vuex数据传输的两种方式及this.$store undefined的解决办法

    这篇文章主要介绍了vuex数据传输的两种方式 及 this.$store undefined的解决办法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • 详解axios 全攻略之基本介绍与使用(GET 与 POST)

    详解axios 全攻略之基本介绍与使用(GET 与 POST)

    本篇文章主要介绍了axios 全攻略之基本介绍与使用(GET 与 POST),详细的介绍了axios的安装和使用,还有 GET 与 POST方法,有兴趣的可以了解一下
    2017-09-09
  • Nuxt不同环境如何区分的方法

    Nuxt不同环境如何区分的方法

    在一般情况下,我们的项目肯定需要区分不同环境,那么Nuxt提供给我们这样的基本能力了么,下面我们就一起来了解一下
    2021-05-05

最新评论