Vue.js 学习笔记十六:Axios 之 Axios 封装

2023-10-28

目录

Axios 封装


Axios 封装

src/plugins/http.js

import axios from 'axios'
import router from '../router'
import store from '../store'
import Vue from "vue"
// 创建axios实例
let instance = axios.create({
	timeout: 1000 * 12
})
// 设置post请求头
// instance.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded'

// 请求拦截器
instance.interceptors.request.use(config => {
		// 登录流程控制中,根据本地是否存在 `token` 判断用户的登录情况
		// 但是即使 token 存在,也有可能token是过期的,所以在每次的请求头中携带token
		// 后台根据携带的token判断用户的登录情况,并返回给我们对应的状态码
		// 而后我们可以在响应拦截器中,根据状态码进行一些统一的操作。
		const token = store.state.token
		token && (config.headers.access_token = token)
		return config;
	},
	error => Promise.error(error)
)
// 响应拦截器
instance.interceptors.response.use(
	// 请求成功
	res => {
		store.commit('changeNetwork', true)
		return	(res.status === 200 ? Promise.resolve(res) : Promise.reject(res))
	},
	// 请求失败
	error => {
		const { response } = error
		if (response) {
			// 请求已发出,但是不在2xx的范围
			errorHandle(response.status, response.data.message)
			return Promise.reject(response)
		} else {
			// 处理断网的情况
			// eg:请求超时或断网时,更新state的network状态
			// network状态在App.vue中控制着一个全局的断网提示组件的显示隐藏
			// 关于断网组件中的刷新重新获取数据,会在断网组件中说明
			store.commit('changeNetwork', false)
		}
	})

// 一些方法的封装

/**
 * 跳转登录页
 * 携带当前页面路由,以便在登录页面完成登录后返回当前页面
 */
const toLogin = () => {
	router.replace({
		path: '/login',
		query: {
			redirect: router.currentRoute.fullPath
		}
	})
}
/**
 * 请求失败后的错误统一处理
 * @param {Number} status 请求失败的状态码
 * @param {string} message 请求失败的信息
 */
const errorHandle = (status, message) => {
	// 状态码判断
	switch (status) {
		// 401: 未登录状态,跳转登录页   
		case 401:
			toLogin()
			break;
			// 403 token过期
			// 清除token并跳转登录页
		case 403:
			console.error('登录过期,请重新登录')
			localStorage.clear()
			setTimeout(() => {
				toLogin()
			}, 1000);
			break;
			// 404请求不存在
		case 404:
			console.error('请求的资源不存在')
			break;
		default:
			console.error(message);
	}
}

Vue.prototype.$http = instance

添加到 main.js 中:

import './plugins/http'

在组件中使用:

	methods: {
        async getUerInfo(id) {		
            const { data: res } = await this.$http.get('http://127.0.0.1:8000/user?id=' + id)
            console.log(res)
        },
	},

以上封装方法,仅限于借鉴,也可以直接使用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Vue.js 学习笔记十六:Axios 之 Axios 封装 的相关文章

  • 如何为 VueJS 项目设置根/基 URL

    我已经部署了一个VueJS项目到像这样的域www example com 但是 我想将其移动到子文件夹 以便我可以像这样访问它www example com v1 如何设置基础 URL 或根 URLVueJS项目 注意 这与基本 URL 无
  • 如何使用vue.js获取点击时按钮的值

    我在页面上有几个按钮 它们连接到相同的方法webcamSendRequestButton
  • Vuejs ssr 检查用户是否针对每个请求进行了身份验证

    我正在为我的应用程序使用这个 ssr 样板 https github com vuejs vue hackernews 2 0 https github com vuejs vue hackernews 2 0 我不知道如何实现逻辑来检查每
  • 如何在Vue3中对setup的内部函数(不是返回)进行单元测试?

    我想这样测试 情况1 错误 无法监视内部属性 因为它不是函数 改为未定义 组件 vue export default setup function outer inner function inner do something for on
  • 使用 vue.js 显示 json 结果

    您好 我尝试使用 vue js 显示 json 文件结果 目标是结果将显示在值上 这是我的代码 data return fetchData function var self this self http get api casetotal
  • Web 扩展中共享 vuex 状态(死对象问题)

    我正在尝试在网络扩展中使用共享的 vue js 状态 状态存储在后台脚本的 DOM 中并呈现在弹出页面中 第一次尝试 我的第一次尝试是使用一个没有 vuex 的简单商店 背景 js var store count 0 popup js br
  • Asyncdata 与 Fetch 之间的区别

    获取数据和异步数据之间的确切区别是什么 官方文档是这么说的 异步数据 您可能想要获取数据并在服务器端呈现它 Nuxt js 添加 asyncData 方法 让您可以在之前处理异步操作 设置元件数据 异步数据每次在加载组件之前调用 仅适用于
  • 可以用vue-chartjs打印图表吗?

    我正在使用 vue chartjs 在网络应用程序上渲染图表 我知道如果您使用原始版本 您可以打印图表library https canvasjs com docs charts methods chart print 但是我不知道如何使用
  • 如何在 vuex nuxt 中获取嵌套 getter

    i have store index js像这样 new Vuex Store modules nav namespaced true modules message namespaced true state count 0 conver
  • vue如何检测页面是否刷新?

    我尝试这样 created window addEventListener beforeunload function event event returnValue Write something this router push 像这样
  • FontAwesome SVG 图标与 Vuetify - 如何在 v-icon/prepend-icon 中使用?

    我是 Vue 新手 找不到如何在 v icon 和 prepend icon 中使用 FA SVG 图标的确切答案 如果我使用
  • 用变量字符串设置槽的简单方法?

    有许多slot例子 但没有克莱尔和简单 因为我需要 我需要类似的东西 var x Hello slot x 这就是我需要的 在一个具体的例子中 https jsfiddle net 2qdh3x3v https jsfiddle net 2
  • 左侧导航菜单上部隐藏

    当滚动到页面最底部时 左侧导航菜单的顶部将被隐藏 The image before scrolling is shown below 滚动后的效果如下图 我不确定此问题的确切原因 因此我将不胜感激任何有关识别和解决该问题的建议或帮助 为了确
  • 不知道如何预览我生成的 Nuxt3 应用程序

    我刚刚在静态模式下创建了一个 Nuxt3 但我不想每次都将其推送到 Netlify 进行预览 这是我的nuxt config js 没有改变 import defineNuxtConfig from nuxt export default
  • 在重复内容区域添加

    我有一个菜单组件 简单地说 它接受一个带有一系列选项的道具 并为每个选项在菜单中呈现一个项目 我希望能够根据用例自定义每个菜单项内的标记 因此我在菜单项元素内使用了占位符 你可以在这个中看到一个例子fiddle https jsfiddle
  • 如何在生产模式下为 Chrome 扩展启用 Vue 开发工具?

    我正在构建一个 chrome 扩展 并使用 vue cli webpack 配置 我希望能够在运行后使用 vue devtoolsnpm 运行构建命令 我尝试添加Vue config devtools true 在 main js 中 或者
  • 分页在服务器端好还是前端好? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我正在构建 Laravel Vue 应用程序 我想知道在后端使用分页还是在前端使用分页更好 我认为最好在每页发送尽可能少的数据的请求 但我想听听
  • Javascript:更改输入值时设置光标位置

    当您输入公式时 我试图在我的应用程序中重现类似于 Microsoft Excel Google Sheets 的用户体验 并且您可以使用不同的公式和变量来自动完成下拉菜单 为此 在验证自动完成功能后 我希望能够控制光标的位置 例如 如果我输
  • 模块构建失败(来自 ./node_modules/babel-loader/lib/index.js)Vue Js

    我从 GitHub 下载了一个我和我的朋友正在开发的项目 但是当我尝试运行时 npm run serve 我收到这个错误 src main js 中的错误 Module build failed from node modules babe
  • 简单的 Vue.js 计算属性说明

    我对 Vue js 并不陌生 但我会再次浏览文档 试图找出我第一次错过的任何内容 我在以下地方看到了这个声明使用计算属性的基本示例部分 https v2 vuejs org v2 guide computed html Basic Exam

随机推荐