import axios from 'axios' import type { CancelTokenStatic, AxiosRequestConfig, AxiosInstance, AxiosError, InternalAxiosRequestConfig, AxiosResponse, CancelTokenSource } from 'axios' import { useGlobalStore } from '@/stores' import { hasOwn, hasOwnDefault } from '@/utils' import { ElMessage } from 'element-plus' /** * @description: 请求配置 * @param {extendHeaders} {[key: string]: string} 扩展请求头用于不满足默认的 Content-Type、token 请求头的情况 * @param {ignoreLoading} boolean 是否忽略 loading 默认 false * @param {token} boolean 是否携带 token 默认 true * @param {ignoreCR} boolean 是否取消请求 默认 false * @param {ignoreCRMsg} string 取消请求的提示信息 默认 Request canceled * @param {contentType} $ContentType 重新定义 Content-Type 默认 json * @param {baseURL} $baseURL baseURL 默认 horizon * @param {timeout} number 超时时间 默认 10000 * @return {_AxiosRequestConfig} **/ interface _AxiosRequestConfig extends AxiosRequestConfig { extendHeaders?: { [key: string]: string } ignoreLoading?: boolean token?: boolean ignoreCR?: boolean ignoreCRMsg?: string } enum ContentType { html = 'text/html', text = 'text/plain', file = 'multipart/form-data', json = 'application/json', form = 'application/x-www-form-urlencoded', stream = 'application/octet-stream', } const Request: AxiosInstance = axios.create() const CancelToken: CancelTokenStatic = axios.CancelToken const source: CancelTokenSource = CancelToken.source() const globalStore = useGlobalStore() Request.interceptors.request.use( (config: InternalAxiosRequestConfig) => { globalStore.setGlobalState('loading', !hasOwnDefault(config, 'ignoreLoading', true)) config.baseURL = hasOwnDefault(config, 'baseURL', '/api') config.headers = { ...config.headers, ...{ 'Content-Type': ContentType[hasOwnDefault(config, 'Content-Type', 'json')], }, ...hasOwnDefault(config, 'extendHeaders', {}), } hasOwnDefault(config, 'token', true) && (config.headers.token = globalStore.token) config.data = config.data || {} config.params = config.params || {} config.timeout = hasOwnDefault(config, 'timeout', 10000) config.cancelToken = source.token config.withCredentials = true hasOwnDefault(config, 'ignoreCR', false) && source.cancel(hasOwnDefault(config, 'ignoreCRMsg', 'Request canceled')) return config }, (error: AxiosError) => { return Promise.reject(error) } ) Request.interceptors.response.use( (response: AxiosResponse) => { globalStore.setGlobalState('loading', false) const { data, status } = response let obj = { ...data } if (!hasOwn(data, 'status')) obj.status = status return obj }, (error: AxiosError) => { globalStore.setGlobalState('loading', false) ElMessage.error(error.message) return Promise.reject(error) } ) export default (config?: _AxiosRequestConfig) => Request(config)
时间: 2023-12-27 19:05:05 浏览: 21
这是一个使用 Axios 库封装的请求模块,提供了一些请求配置选项,如扩展请求头、是否携带 token 等。还使用了 CancelToken 取消请求和 ElementUI 的 Message 组件进行错误提示。其中,请求拦截器会在请求发送前进行一些处理,如设置请求头、取消请求等;响应拦截器则会在响应返回后进行一些处理,如关闭 loading、处理错误信息等。
相关问题
import * as axios from 'axios'和import axios from 'axios'的区别
import * as axios from 'axios' 和 import axios from 'axios' 的区别在于导入的方式和使用的方式不同。
1. import * as axios from 'axios' 是将整个 axios 模块作为一个对象导入,可以通过 axios.xxx 的方式来使用 axios 提供的各种功能。这种方式会将 axios 模块中的所有方法和属性都导入到一个对象中,需要通过对象名来访问具体的方法或属性。
2. import axios from 'axios' 是将 axios 模块默认导出的内容直接导入,可以直接使用 axios 来调用其中的方法。这种方式只会导入 axios 模块默认导出的内容,不需要通过对象名来访问。
总结一下:
- import * as axios from 'axios' 导入整个 axios 模块作为一个对象,需要通过对象名来访问具体的方法或属性。
- import axios from 'axios' 直接导入 axios 模块默认导出的内容,可以直接使用 axios 来调用其中的方法。
vue 中 import axios from 'axios'时axios爆红
在 Vue.js 中,当你尝试通过 `import axios from 'axios'` 引入 Axios 库时,如果出现红色错误(通常是指语法错误或模块加载失败),可能是由于以下几个原因:
1. **缺少安装**: 如果你首次使用 Axios,确保在项目中安装了 Axios。在命令行中运行 `npm install axios` 或者 `yarn add axios`。
2. **路径问题**: 确认你的导入路径正确。如果是使用 ES6 模块化,确保你的配置文件(如 `main.js` 或者 `src/router/index.js`)位于正确的文件夹结构中。
3. **模块打包工具**: 如果你在使用如 Webpack 或者 Vite 这样的模块打包工具,检查是否配置了正确的规则来处理 Axios。比如,Vue CLI 会自动配置 Axios,但如果手动配置,可能会有额外的配置需求。
4. **全局注册**: Axios 可能没有正确地被 Vue 的全局实例所注册。如果你在 Vue 实例中没有显式注册,你需要确保在 `created()` 或 `mounted()` 生命周期钩子中进行注册。
5. **代码错误**: 检查你的代码中是否有拼写错误或者语法错误,特别是在引入 Axios 的地方。
相关问题:
1. Axios 是什么,它在前端开发中有什么作用?
2. 如何在 Vue 中使用 Axios 发送 HTTP 请求?
3. Vue CLI 中如何自动配置 Axios?
4. Vue 中如何正确全局注册 Axios 以避免此类问题?
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)