vue工程 axios请求数据传统使用方法介绍+经验优化使用方法

三、axios入口配置

四、axios使用

4.1 get请求

4.1.1 不带参数

4.1.2 带参数

4.2 post请求

4.3 post带token

五、改进优化设置



vue工程 axios请求数据使用传统介绍+经验优化

==========================

一、axios介绍

=========

在vue高版本项目中,很多使用axios进行ajax请求,而不再使用vue-resource了。axios是基于promise的HTTP库,并没有install方法,所以不能使用Vue.use()方法进行使用。

二、axios安装

=========

先安装axios依赖qs依赖(备注:qs依赖是post请求时候才需要,如果不是post请求不需要安装qs)

npm install axios --save

npm install qs --save

备注一个知识点吧:

有些小白可能搞不清楚,–save  --dev  -S -D的区别,简单说下:

npm install X --save 也就是-S,会把依赖包安装在生产环境中,并且把依赖包名称添加到 package.json 文件 dependencies。

npm install X --save-dev ,也就是-D,则会把依赖包安装在开发环境中,并且添加到 package.json 文件 devDependencies

如果vue项目要部署上线,为防止依赖包失效,一般采用–save。

绝大多数项目的开发,应该是需要部署上线的,所以如果记不住,就全部用–save吧

三、axios入口配置

===========

题外话:在vue项目中,插件的使用,其入口文件一般都在main.js中引入,因为main.js是项目运行时候首先运行的文件。

入口配置的目的是,如果不配置的话,任何vue文件中,如果要使用的话,都需要import axios form 'axios’这样先引入再使用,这一般不是我们所希望看到的便捷的使用方式,任何一个项目,请求后台数据的地方都多,所以需要有个一劳永逸的设置,这就需要在入口时候配置下,跟vue属性绑定到一块,可以直接调用。

在main.js中设置:

import qs from ‘qs’;

import axios from “axios”;

//下面是将 a x i o s 和 axios和 axiosqs挂在原型上,以便在实例中能用 this.$axios能够拿到

Vue.prototype.$axios = axios;

Vue.prototype.$qs = qs;

四、axios使用

=========

4.1 get请求


4.1.1 不带参数

this.$axios.get(“url地址”).then(res => {

console.log(res);

})

4.1.2 带参数

this.$axios.get(“url地址”,{

params:{

phone:12345678 //参数,键值对,key值:value值

name:hh

}

}).then(res => {

//获取你需要用到的数据

});

算法刷题

大厂面试还是很注重算法题的,尤其是字节跳动,算法是问的比较多的,关于算法,推荐《LeetCode》和《算法的乐趣》,这两本我也有电子版,字节跳动、阿里、美团等大厂面试题(含答案+解析)、学习笔记、Xmind思维导图均可以分享给大家学习。

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

写在最后

最后,对所以做Java的朋友提几点建议,也是我的个人心得:

  1. 疯狂编程

  2. 学习效果可视化

  3. 写博客

  4. 阅读优秀代码

  5. 心态调整

<think>好的,用户之前问过如何在Vue 3和TypeScript中全局挂载Axios,现在他们又提出了类似的问题,但这次引用了之前提供的三个参考资料。我需要仔细分析这些引用,并结合之前的回答,确保给出准确且符合用户需求的解决方案。 首先,用户引用了三个资料: 1. 第一个引用提到Vue CLI使用的TypeScript插件,以及如何配置ts-loader和fork-ts-checker-webpack-plugin。这可能与项目的初始配置有关,但用户当前的问题是关于Axios的全局挂载,所以这个引用可能是在提醒要确保TypeScript环境正确配置,避免类型检查错误。 2. 第二个引用来自用户之前的回答,提到在TypeScript下直接挂载可能会报错,建议使用useCurrentInstance的hook来获取全局属性。这可能意味着用户之前尝试过直接挂载,但遇到了类型错误,需要解决如何正确访问全局属性。 3. 第三个引用提到在Vue 2中使用vue-axios插件,但用户现在使用的是Vue 3,所以可能需要避免使用vue-axios,而是采用Vue 3的方法。 用户现在的问题是如何在Vue 3和TypeScript中正确挂载Axios并全局使用。需要结合之前的回答和引用中的信息,确保解决方案在TypeScript环境下不会报错,同时符合Vue 3的最佳实践。 首先,用户可能需要明确的步骤:安装Axios,创建实例,全局挂载,类型声明,以及如何在组件中使用。根据引用2,用户之前可能遇到类型错误,因此需要强调类型声明部分,可能还要引入useCurrentInstance的hook来安全地访问全局属性。 另外,用户可能对在组合式API中如何访问全局属性感到困惑,因为在setup中无法直接使用this,所以需要演示如何使用getCurrentInstance或直接导入实例。 需要检查之前的回答是否已经涵盖了这些内容,并根据引用进行补充。例如,在之前的回答中提到了三种使用方式:选项式API、组合式API和直接导入。但根据引用2,用户可能在组合式API中遇到问题,需要更详细的说明如何使用useCurrentInstance来获取proxy,确保类型安全。 同时,需要避免推荐vue-axios,因为引用3提到的是Vue 2的解决方案,而Vue 3可能需要不同的方法。因此,在回答中应明确说明Vue 3不再需要vue-axios,而是通过globalProperties或provide/inject来实现。 最后,确保所有步骤都包含TypeScript的类型声明,避免出现类型错误,并强调在组合式API中推荐直接导入Axios实例而不是依赖全局属性,以保持代码的可维护性和类型安全。</think>#### Vue 3 + TypeScript 全局挂载 Axios 完整方案(基于最佳实践优化) 根据你的需求和引用[2][3]的实践经验,以下是兼容TypeScript的终极实现方案: --- ### 一、标准实现流程(解决类型校验问题) #### 1. 创建Axios实例(`src/utils/request.ts`) ```typescript import axios, { AxiosInstance, AxiosRequestConfig } from 'axios' const createService = (): AxiosInstance => { const service = axios.create({ baseURL: import.meta.env.VITE_API_BASEURL, // 推荐使用环境变量 timeout: 10000, headers: { 'Content-Type': 'application/json' } }) // 请求拦截器 service.interceptors.request.use(config => { config.headers.Authorization = localStorage.getItem('token') || '' return config }) // 响应拦截器 service.interceptors.response.use(response => { return response.data // 直接返回核心数据 }, error => { return Promise.reject(error) }) return service } export default createService() ``` #### 2. 全局挂载 + 类型声明(`main.ts`) ```typescript import { createApp } from 'vue' import App from './App.vue' import service from '@/utils/request' const app = createApp(App) // 核心挂载逻辑 app.config.globalProperties.$axios = service // TypeScript类型扩展声明(解决引用[2]的报错) declare module '@vue/runtime-core' { interface ComponentCustomProperties { $axios: typeof service } } app.mount('#app') ``` --- ### 二、安全访问方案(解决组合式API访问问题) #### 方案1:专用Hook方法(推荐) ```typescript // src/hooks/useAxios.ts import { ComponentInternalInstance, getCurrentInstance } from 'vue' export default function useAxios() { const { appContext } = getCurrentInstance() as ComponentInternalInstance return appContext.config.globalProperties.$axios } // 组件中使用 import useAxios from '@/hooks/useAxios' const $axios = useAxios() $axios.get('/api/data') // 完全类型支持 ``` #### 方案2:直接导入(最佳实践) ```typescript // 任意组件中直接导入 import axiosInstance from '@/utils/request' // 使用完全类型化的实例 axiosInstance.post('/login', { username: 'user', password: 'pass' }).then(res => { console.log(res.data) // 完整类型推断 }) ``` --- ### 三、方案对比与选型建议 | 方式 | 适用场景 | TypeScript支持 | 可维护性 | |------------------|-----------------|----------------|--------| | 全局属性(`$axios`) | 传统选项式API | 需类型声明[^2] | 一般 | | 直接导入 | 组合式API/TypeScript | 完全支持 | 优秀 | | Provide/Inject | 跨层级组件 | 需额外类型声明 | 中等 | **推荐选择:** 现代Vue 3项目建议优先使用**直接导入方式**,可避免上下文依赖问题,配合TypeScript能获得最佳开发体验[^1] --- ### 四、常见问题解决方案 #### 问题1:TS报错`Property '$axios' does not exist` ```typescript // 确保已添加类型声明(引用[2]解决方案) declare module '@vue/runtime-core' { interface ComponentCustomProperties { $axios: typeof import('@/utils/request').default } } ``` #### 问题2:无法访问响应拦截器处理后的数据 ```typescript // 拦截器应返回完整响应结构 service.interceptors.response.use(response => { return { data: response.data, status: response.status, headers: response.headers } }) ``` --- ### 五、工程化推荐结构 ``` src/ ├── types/ │ └── vue.d.ts # 全局类型扩展声明 ├── utils/ │ ├── request.ts # Axios核心配置 │ └── interceptors/ # 拆分拦截器模块 └── hooks/ └── useAxios.ts # 全局访问Hook ``` [^1]: Vue CLI的TypeScript插件通过分离类型检查线程保证开发体验 [^2]: Vue 3全局属性需配合类型声明实现TS支持 [^3]: 直接导入方式可避免原型链污染问题
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值