应无所住,而生其心
排名
1
文章
869
粉丝
112
评论
163
net core webapi post传递参数
庸人 : 确实坑哈,我也是下班好了好几次,发现后台传递对象是可以的,但...
百度编辑器自定义模板
庸人 : 我建议换个编辑器,因为现在百度富文本已经停止维护了,用tinymec...
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术

vue3使用axios的请求封装与跨域配置

2895人阅读 2022/7/29 18:06 总访问:5403461 评论:0 收藏:0 手机
分类: 前端


以前vue2当中的详细的请求封装以及跨域的可以参考:
https://www.tnblog.net/aojiancc2/article/details/4751
其实逻辑基本都是一致的,里边封装的步骤列得比较详细

先进行请求封装

在src下创建一个common文件夹里边创建一个request.js,加入封装代码。当然文件夹放哪里根据自己的需要来就行了。

加入简单封装的代码
  1. import axios from "axios";
  2. import qs from "qs";
  3. // vue3下的element-plus
  4. import { ElLoading , ElMessage } from "element-plus";
  5. const loading = {
  6. // loading加载对象
  7. loadingInstance: null,
  8. // 打开加载
  9. open(loadtext) {
  10. if (this.loadingInstance === null) {
  11. // 如果实例 为空,则创建
  12. this.loadingInstance = ElLoading.service({
  13. text: loadtext, // '加载中...', // 加载图标下的文字
  14. spinner: "el-icon-loading", // 加载图标
  15. background: "rgba(0, 0, 0, 0.5)", // 背景色
  16. customClass: "loading", // 自定义样式的类名
  17. });
  18. }
  19. },
  20. // 关闭加载
  21. close() {
  22. // 不为空时, 则关闭加载窗口
  23. if (this.loadingInstance !== null) {
  24. this.loadingInstance.close();
  25. }
  26. this.loadingInstance = null;
  27. },
  28. };
  29. axios.defaults.timeout = 300000; // 设置超时时间
  30. // 配置请求头数据格式
  31. // axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded'
  32. // 请求拦截器
  33. // 请求拦截器
  34. axios.interceptors.request.use(
  35. (axiosconfig) => {
  36. // 请求地址统一增加一个webapi,因为后台那个代理配置里边有加上webapi的前缀
  37. //axiosconfig.url = "/webapi" + axiosconfig.url;
  38. //从环境变量读取,线下访问接口增加webapi前缀,上线就不增加
  39. // axiosconfig.url = process.env.VUE_APP_BASE_API + axiosconfig.url;
  40. axiosconfig.url = "" + axiosconfig.url;
  41. //axiosconfig.headers.Authorization = "Bearer " + token;
  42. return axiosconfig;
  43. },
  44. (err) => {
  45. loading.close(); // 关闭加载窗口
  46. return Promise.reject(err);
  47. }
  48. );
  49. // 响应拦截器
  50. axios.interceptors.response.use(
  51. (res) => {
  52. //console.log("统一响应了");
  53. loading.close(); // 关闭加载窗口
  54. // 如果token过期了就直接跳转到登录
  55. // if (
  56. // (res.code === 401 || res.code === 500 || res.code === 403) &&
  57. // !sessionStorage.getItem("401show")
  58. // ) {
  59. // // to re-login
  60. // sessionStorage["401show"] = true;
  61. // ElMessage.confirm("登录状态已过期", "登录提示", {
  62. // confirmButtonText: "重新登录",
  63. // cancelButtonText: "取消",
  64. // type: "warning",
  65. // })
  66. // .then(() => {
  67. // sessionStorage.clear("401show");
  68. // // 跳转到登录页
  69. // location.href = "/#/login?redirect=/school-dashboard#/zuxia/index";
  70. // })
  71. // .catch(() => {
  72. // sessionStorage.clear("401show");
  73. // });
  74. // }
  75. return res;
  76. },
  77. (err) => {
  78. loading.close(); // 关闭加载窗口
  79. return Promise.reject(err);
  80. }
  81. );
  82. const request = {
  83. get(url, data, loadtext) {
  84. // 判断有没有参数,有参数就把参数加上
  85. if (data) {
  86. url = url + "?" + qs.stringify(data);
  87. }
  88. if (loadtext && loadtext.length > 0) {
  89. loading.open(loadtext); // 打开加载窗口
  90. }
  91. return new Promise((resolve, reject) => {
  92. axios
  93. .get(url)
  94. .then(function (response) {
  95. // console.log("封装的方法数据回来了");
  96. // console.log(response)
  97. if (response.status === 200 && response.data.code === 200) {
  98. resolve(response.data);
  99. } else {
  100. // 上面的判断要根据实际情况修改判断对哦,不然使用else里边的reject输出,虽然结果也能正确输出,但是浏览器上会提示Uncaught (in promise),也不能继续正确的向下执行了。
  101. reject(response.data);
  102. }
  103. })
  104. .catch((e) => {
  105. reject(e);
  106. });
  107. });
  108. },
  109. post(url, data, loadtext) {
  110. if (loadtext && loadtext.length > 0) {
  111. loading.open(loadtext); // 打开加载窗口
  112. }
  113. return new Promise((resolve, reject) => {
  114. axios
  115. .post(url, data)
  116. .then(function (response) {
  117. if (response.status === 200 && response.data.code === 200) {
  118. resolve(response.data);
  119. } else {
  120. reject(response.data);
  121. }
  122. })
  123. .catch((e) => {
  124. reject(e);
  125. });
  126. });
  127. },
  128. };
  129. export default request;
这个是更完善一点的封装方法

增加了put,delete等方法的封装

  1. import axios from 'axios'
  2. import qs from 'qs'
  3. // vue3下的element-plus
  4. import { ElLoading, ElMessage } from 'element-plus'
  5. // 后台接口返回成功的状态码,需要根据自己的接口修改
  6. const successCode = 200
  7. const loading = {
  8. // loading加载对象
  9. loadingInstance: null,
  10. // 打开加载
  11. open(loadtext) {
  12. if (this.loadingInstance === null) {
  13. // 如果实例 为空,则创建
  14. this.loadingInstance = ElLoading.service({
  15. text: loadtext, // '加载中...', // 加载图标下的文字
  16. spinner: 'el-icon-loading', // 加载图标
  17. background: 'rgba(0, 0, 0, 0.5)', // 背景色
  18. customClass: 'loading' // 自定义样式的类名
  19. })
  20. }
  21. },
  22. // 关闭加载
  23. close() {
  24. // 不为空时, 则关闭加载窗口
  25. if (this.loadingInstance !== null) {
  26. this.loadingInstance.close()
  27. }
  28. this.loadingInstance = null
  29. }
  30. }
  31. axios.defaults.timeout = 300000 // 设置超时时间
  32. // 配置请求头数据格式
  33. // axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded'
  34. // 请求拦截器
  35. axios.interceptors.request.use(
  36. (axiosconfig) => {
  37. // 请求地址统一增加一个webapi,因为后台那个代理配置里边有加上webapi的前缀
  38. //axiosconfig.url = "/webapi" + axiosconfig.url;
  39. //从环境变量读取,线下访问接口增加webapi前缀,上线就不增加
  40. // axiosconfig.url = process.env.VUE_APP_BASE_API + axiosconfig.url;
  41. axiosconfig.url = '' + axiosconfig.url
  42. // console.log("请求的地址2",axiosconfig.url)
  43. // 测试token , 获取token的方法换成自己的写法即可
  44. let token = "eyJhbGciOiJSUzI1NiIsImtpZCI6IkU0QUU1Rk...."
  45. axiosconfig.headers.Authorization = "Bearer " + token;
  46. return axiosconfig
  47. },
  48. (err) => {
  49. loading.close() // 关闭加载窗口
  50. return Promise.reject(err)
  51. }
  52. )
  53. // 响应拦截器
  54. axios.interceptors.response.use(
  55. (res) => {
  56. //console.log("统一响应了",res);
  57. loading.close() // 关闭加载窗口
  58. if(res.data.code!==successCode)
  59. {
  60. ElMessage({
  61. message: res.data.msg,
  62. type: 'error'
  63. })
  64. }
  65. // 如果token过期了就直接跳转到登录
  66. // if (
  67. // (res.code === 401 || res.code === 500 || res.code === 403) &&
  68. // !sessionStorage.getItem("401show")
  69. // ) {
  70. // // to re-login
  71. // sessionStorage["401show"] = true;
  72. // ElMessage.confirm("登录状态已过期", "登录提示", {
  73. // confirmButtonText: "重新登录",
  74. // cancelButtonText: "取消",
  75. // type: "warning",
  76. // })
  77. // .then(() => {
  78. // sessionStorage.clear("401show");
  79. // // 跳转到登录页
  80. // location.href = "/#/login?redirect=/school-dashboard#/zuxia/index";
  81. // })
  82. // .catch(() => {
  83. // sessionStorage.clear("401show");
  84. // });
  85. // }
  86. return res
  87. },
  88. (err) => {
  89. loading.close() // 关闭加载窗口
  90. console.log(err)
  91. ElMessage({
  92. message: err,
  93. type: 'error'
  94. })
  95. return Promise.reject(err)
  96. }
  97. )
  98. const request = {
  99. get(url, data, loadtext) {
  100. // 判断有没有参数,有参数就把参数加上
  101. if (data) {
  102. url = url + '?' + qs.stringify(data)
  103. }
  104. console.log("请求的地址",url)
  105. if (loadtext && loadtext.length > 0) {
  106. loading.open(loadtext) // 打开加载窗口
  107. }
  108. return new Promise((resolve, reject) => {
  109. axios
  110. .get(url)
  111. .then(function (response) {
  112. // console.log("封装的方法数据回来了");
  113. // console.log(response)
  114. if (response.status === 200 && response.data.code === successCode) {
  115. resolve(response.data)
  116. } else {
  117. // 上面的判断要根据实际情况修改判断对哦,不然使用else里边的reject输出,虽然结果也能正确输出,但是浏览器上会提示Uncaught (in promise),也不能继续正确的向下执行了。
  118. reject(response.data)
  119. }
  120. })
  121. .catch((e) => {
  122. reject(e)
  123. })
  124. })
  125. },
  126. post(url, data, loadtext) {
  127. if (loadtext && loadtext.length > 0) {
  128. loading.open(loadtext) // 打开加载窗口
  129. }
  130. return new Promise((resolve, reject) => {
  131. axios
  132. .post(url, data)
  133. .then(function (response) {
  134. if (response.status === 200 && response.data.code === successCode) {
  135. resolve(response.data)
  136. } else {
  137. reject(response.data)
  138. }
  139. })
  140. .catch((e) => {
  141. reject(e)
  142. })
  143. })
  144. },
  145. put(url, data, loadtext) {
  146. if (loadtext && loadtext.length > 0) {
  147. loading.open(loadtext) // 打开加载窗口
  148. }
  149. return new Promise((resolve, reject) => {
  150. axios
  151. .put(url, data)
  152. .then(function (response) {
  153. if (response.status === 200 && response.data.code === successCode) {
  154. resolve(response.data)
  155. } else {
  156. reject(response.data)
  157. }
  158. })
  159. .catch((e) => {
  160. reject(e)
  161. })
  162. })
  163. },
  164. delete(url, data, loadtext) {
  165. if (loadtext && loadtext.length > 0) {
  166. loading.open(loadtext) // 打开加载窗口
  167. }
  168. return new Promise((resolve, reject) => {
  169. axios
  170. .delete(url, data)
  171. .then(function (response) {
  172. if (response.status === 200 && response.data.code === successCode) {
  173. resolve(response.data)
  174. } else {
  175. reject(response.data)
  176. }
  177. })
  178. .catch((e) => {
  179. reject(e)
  180. })
  181. })
  182. }
  183. }
  184. export default request

tip:其他的封装方法比如ts版本的请求封装可以参考下面的写法

在配置好跨域

vue3的跨域配置在vite.config.js中,配置方法和以前几乎完全一致,根据自己的需求修改即可。

直接使用封装的代码调用接口

在需要使用的组件引入封装的js:

  1. import request from '@/common/request'

把onMounted这些也引入一下:

  1. import { reactive, toRefs, onMounted } from 'vue'

在onMounted中调用接口

  1. const initData = () =>{
  2. //测试接口访问
  3. request.get('/api/v1/Home/1',{}).then(res => {
  4. console.log("测试数据返回")
  5. console.log(res)
  6. })
  7. }
  8. onMounted(() => {
  9. initData()
  10. })

数据被成功输出了:

注意要把跨域配置好,不然会报跨域相关的错误。

全局引入封装的请求js

在main.js中加入相关代码

vue2中的写法:

  1. import request from "./common/request.js";
  2. Vue.prototype.$http = request;

vue3不能这样写了,应该这样写:

  1. import request from "./common/request.js";
  2. const app = createApp(App)
  3. // vue3中要使用下面的写法
  4. app.config.globalProperties.$http = request

调用方法

先引入:

  1. import { reactive, toRefs, getCurrentInstance, onMounted } from 'vue'
  2. let internalInstance = getCurrentInstance() as any
  3. const $http = internalInstance.appContext.config.globalProperties.$http

调用:

  1. const initData = () => {
  2. //测试接口访问
  3. $http.get('/api/v1/Home/1').then(res => {
  4. console.log("测试数据返回")
  5. console.log(res)
  6. })
  7. }
  8. onMounted(() => {
  9. initData()
  10. })

也可以使用异步的方式调用接口

  1. const fetchData = async () => {
  2. const res = await $http.get('/api/v1/Home/1')
  3. console.log("测试数据返回了")
  4. console.log(res);
  5. }
  6. onMounted(() => {
  7. fetchData()
  8. })

直接使用axios调用接口也是可以异步使用的

  1. const fetchData = async () => {
  2. // const res = await $http.get('/api/v1/Home/1')
  3. // console.log("测试数据返回了")
  4. // console.log(res);
  5. const res = await axios.get('/api/v1/Home/1')
  6. console.log("测试数据返回了.")
  7. console.log(res.data);
  8. }
  9. onMounted(() => {
  10. fetchData()
  11. })

单独提出来api方法

其实现在调用api也可以不用做成全局的方式,更多的是使用把api请求的方法单独提出来写

首先在src文件夹下面创建好api,然后加入需要的js文件:

封装好需要调用api的方法:

  1. import request from '@/common/request'
  2. /**
  3. * @method getArticle 获取文章信息
  4. * @param {*} data
  5. * @returns
  6. */
  7. export function getArticle(data) {
  8. return request.get('/api/v1/Home/1',data)
  9. }

调用:
先引入封装的js:

  1. import { getArticle } from '@/api/article'

使用异步的方式调用方法:

  1. const fetchData = async () => {
  2. const res = await getArticle({})
  3. console.log("测试数据返回了..")
  4. console.log(res);
  5. }
  6. onMounted(() => {
  7. fetchData()
  8. })

使用then的方式调用

  1. const fetchData = () => {
  2. getArticle({}).then(res => {
  3. console.log("测试数据返回了...")
  4. console.log(res)
  5. })
  6. }
  7. onMounted(() => {
  8. fetchData()
  9. })

如果返回的数据是这种格式

取list和total可以这种取:

  1. const fetchData = async () => {
  2. const {
  3. data: { list, total },
  4. } = await getInquiryInfo({})
  5. console.log("测试数据返回了..")
  6. console.log(list);
  7. console.log(total);
  8. }

完善请求封装

把请求封装修改为ts版本
  1. import axios from 'axios'
  2. import qs from 'qs'
  3. // vue3下的element-plus
  4. import { ElLoading, ElMessage } from 'element-plus'
  5. // 后台接口返回成功的状态码,需要根据自己的接口修改
  6. const successCode = 0
  7. // loading加载对象
  8. // let loadingInstance: any
  9. const loading = {
  10. // loading加载对象
  11. loadingInstance:null as any,
  12. // 打开加载
  13. open(loadtext: any) {
  14. //if (this.loadingInstance === null) {
  15. // 如果实例 为空,则创建
  16. this.loadingInstance = ElLoading.service({
  17. text: loadtext, // '加载中...', // 加载图标下的文字
  18. // spinner: 'el-icon-loading', // 加载图标
  19. background: 'rgba(0, 0, 0, 0.6)', // 背景色
  20. customClass: 'loading' // 自定义样式的类名
  21. })
  22. //}
  23. },
  24. // 关闭加载
  25. close() {
  26. // 不为空时, 则关闭加载窗口
  27. if (this.loadingInstance) {
  28. this.loadingInstance.close()
  29. }
  30. // this.loadingInstance = null
  31. }
  32. }
  33. axios.defaults.timeout = 300000 // 设置超时时间
  34. // 配置请求头数据格式
  35. // axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded'
  36. // 请求拦截器
  37. axios.interceptors.request.use(
  38. (axiosconfig) => {
  39. // 请求地址统一增加一个webapi,因为后台那个代理配置里边有加上webapi的前缀
  40. //axiosconfig.url = "/webapi" + axiosconfig.url;
  41. //从环境变量读取,线下访问接口增加webapi前缀,上线就不增加
  42. // axiosconfig.url = process.env.VUE_APP_BASE_API + axiosconfig.url;
  43. axiosconfig.url = '' + axiosconfig.url
  44. // console.log("请求的地址2",axiosconfig.url)
  45. // 测试token , 获取token的方法换成自己的写法即可
  46. let token = "eyJhbGciOiJSUzI1NiIsImtpZCI"
  47. axiosconfig.headers.Authorization = "Bearer " + token;
  48. return axiosconfig
  49. },
  50. (err) => {
  51. loading.close() // 关闭加载窗口
  52. return Promise.reject(err)
  53. }
  54. )
  55. // 响应拦截器
  56. axios.interceptors.response.use(
  57. (res) => {
  58. //console.log("统一响应了",res);
  59. loading.close() // 关闭加载窗口
  60. if (res.data.code !== successCode) {
  61. ElMessage({
  62. message: res.data.msg,
  63. type: 'error'
  64. })
  65. }
  66. // 如果token过期了就直接跳转到登录
  67. // if (
  68. // (res.code === 401 || res.code === 500 || res.code === 403) &&
  69. // !sessionStorage.getItem("401show")
  70. // ) {
  71. // // to re-login
  72. // sessionStorage["401show"] = true;
  73. // ElMessage.confirm("登录状态已过期", "登录提示", {
  74. // confirmButtonText: "重新登录",
  75. // cancelButtonText: "取消",
  76. // type: "warning",
  77. // })
  78. // .then(() => {
  79. // sessionStorage.clear("401show");
  80. // // 跳转到登录页
  81. // location.href = "/#/login?redirect=/school-dashboard#/zuxia/index";
  82. // })
  83. // .catch(() => {
  84. // sessionStorage.clear("401show");
  85. // });
  86. // }
  87. return res
  88. },
  89. (err) => {
  90. loading.close() // 关闭加载窗口
  91. console.log(err)
  92. ElMessage({
  93. message: err,
  94. type: 'error'
  95. })
  96. return Promise.reject(err)
  97. }
  98. )
  99. const request = {
  100. get(url: any, data: any, loadtext: any="") {
  101. // 判断有没有参数,有参数就把参数加上
  102. if (data) {
  103. url = url + '?' + qs.stringify(data)
  104. }
  105. if (loadtext && loadtext.length > 0) {
  106. loading.open(loadtext) // 打开加载窗口
  107. }
  108. return new Promise((resolve, reject) => {
  109. axios
  110. .get(url)
  111. .then(function (response) {
  112. // console.log("封装的方法数据回来了");
  113. // console.log(response)
  114. if (response.status === 200 && response.data.code === successCode) {
  115. resolve(response.data)
  116. } else {
  117. // 上面的判断要根据实际情况修改判断对哦,不然使用else里边的reject输出,虽然结果也能正确输出,但是浏览器上会提示Uncaught (in promise),也不能继续正确的向下执行了。
  118. reject(response.data)
  119. }
  120. })
  121. .catch((e) => {
  122. reject(e)
  123. })
  124. })
  125. },
  126. post(url: any, data: any, loadtext: any="") {
  127. if (loadtext && loadtext.length > 0) {
  128. loading.open(loadtext) // 打开加载窗口
  129. }
  130. return new Promise((resolve, reject) => {
  131. axios
  132. .post(url, data)
  133. .then(function (response) {
  134. if (response.status === 200 && response.data.code === successCode) {
  135. resolve(response.data)
  136. } else {
  137. reject(response.data)
  138. }
  139. })
  140. .catch((e) => {
  141. reject(e)
  142. })
  143. })
  144. },
  145. put(url: any, data: any, loadtext: any="") {
  146. if (loadtext && loadtext.length > 0) {
  147. loading.open(loadtext) // 打开加载窗口
  148. }
  149. return new Promise((resolve, reject) => {
  150. axios
  151. .put(url, data)
  152. .then(function (response) {
  153. if (response.status === 200 && response.data.code === successCode) {
  154. resolve(response.data)
  155. } else {
  156. reject(response.data)
  157. }
  158. })
  159. .catch((e) => {
  160. reject(e)
  161. })
  162. })
  163. },
  164. delete(url: any, data: any, loadtext: any="") {
  165. if (loadtext && loadtext.length > 0) {
  166. loading.open(loadtext) // 打开加载窗口
  167. }
  168. return new Promise((resolve, reject) => {
  169. axios
  170. .delete(url, data)
  171. .then(function (response) {
  172. if (response.status === 200 && response.data.code === successCode) {
  173. resolve(response.data)
  174. } else {
  175. reject(response.data)
  176. }
  177. })
  178. .catch((e) => {
  179. reject(e)
  180. })
  181. })
  182. }
  183. }
  184. export default request
在ts中使用封装的请求也是一样的

引入封装的request之后使用方法如下。其实都是一样的,就是要注意一下ts中的类型检查,类型不确定时使用可以使用any,unknown等类型来处理,或者使用类型断言。

  1. const getTasksList = async () => {
  2. const result: any = await request.get('/growing/api/Tasks/GetTasksPage', state.pageParam, "请求")
  3. console.log(result)
  4. state.tasksList = result.data.data
  5. // 请求的api地址,以及返回数据的格式自己根据自己的修改
  6. // request.get('/education/api/Feedback/GetSchools', state.pageParam).then((res: any) => {
  7. // console.log('获取任务')
  8. // console.log(res)
  9. // state.tasksList = res.data.data
  10. // })
  11. }

vue3的一个模板vue3-admin-template里边自带封装的request请求

贴一下他这个封装的代码,也可以考虑借鉴:

  1. import axios from 'axios'
  2. import { ElMessage, ElMessageBox } from 'element-plus'
  3. import { useUserStore } from '@/store/user'
  4. import { getCookies } from '@/utils/storage'
  5. import defaultSettings from '@/settings'
  6. // 业务请求
  7. const request = axios.create({
  8. baseURL: defaultSettings.isMockData ? '' : import.meta.env.VITE_APP_BASE_API, // url = base url + request url
  9. // withCredentials: true, // send cookies when cross-domain requests
  10. timeout: 5000 // request timeout
  11. })
  12. // const request = axios.create({
  13. // baseURL: "", // url = base url + request url
  14. // // withCredentials: true, // send cookies when cross-domain requests
  15. // timeout: 5000 // request timeout
  16. // })
  17. // request interceptor
  18. request.interceptors.request.use(
  19. (config) => {
  20. // do something before request is sent
  21. const userStore = useUserStore()
  22. if (userStore.token) {
  23. // let each request carry token
  24. // ['X-Token'] is a custom headers key
  25. // please modify it according to the actual situation
  26. config.headers['X-Token'] = getCookies('Fanqie-Token')
  27. }
  28. return config
  29. },
  30. (error) => {
  31. // do something with request error
  32. console.log(error) // for debug
  33. return Promise.reject(error)
  34. }
  35. )
  36. // response interceptor
  37. request.interceptors.response.use(
  38. /**
  39. * If you want to get http information such as headers or status
  40. * Please return response => response
  41. */
  42. /**
  43. * Determine the request status by custom code
  44. * Here is just an example
  45. * You can also judge the status by HTTP Status Code
  46. */
  47. (response) => {
  48. const res = response.data
  49. // if the custom code is not 20000, it is judged as an error.
  50. if (res.code !== 20000 && res.code!=200) {
  51. ElMessage({
  52. message: res.message || 'Error',
  53. type: 'error',
  54. duration: 5 * 1000
  55. })
  56. // 50008: Illegal token; 50012: Other clients logged in; 50014: Token expired;
  57. if (res.code === 50008 || res.code === 50012 || res.code === 50014) {
  58. // to re-login
  59. ElMessageBox.confirm(
  60. 'You have been logged out, you can cancel to stay on this page, or log in again',
  61. 'Confirm logout',
  62. {
  63. confirmButtonText: 'Re-Login',
  64. cancelButtonText: 'Cancel',
  65. type: 'warning'
  66. }
  67. ).then(() => {
  68. const userStore = useUserStore()
  69. userStore.resetToken.then(() => {
  70. location.reload()
  71. })
  72. })
  73. }
  74. return Promise.reject(new Error(res.message || 'Error'))
  75. } else {
  76. return res
  77. }
  78. },
  79. (error) => {
  80. console.log('err' + error) // for debug
  81. ElMessage({
  82. message: error.message,
  83. type: 'error',
  84. duration: 5 * 1000
  85. })
  86. return Promise.reject(error)
  87. }
  88. )
  89. /**
  90. * 用于请求 gitee 的数据
  91. */
  92. const requestA = axios.create({
  93. baseURL: import.meta.env.VITE_APP_GITEE_BASE_API, // url = base url + request url
  94. timeout: 60 * 1000
  95. })
  96. requestA.interceptors.request.use(
  97. (config) => {
  98. return config
  99. },
  100. (error) => {
  101. console.log(error)
  102. return Promise.reject(error)
  103. }
  104. )
  105. requestA.interceptors.response.use(
  106. (response) => {
  107. const { data, status, statusText } = response
  108. if (status === 200) {
  109. return data
  110. } else {
  111. ElMessage({
  112. message: statusText || 'Error',
  113. type: 'error',
  114. duration: 5 * 1000
  115. })
  116. return false
  117. }
  118. },
  119. (error) => {
  120. console.log('err' + error)
  121. ElMessage({
  122. message: error.message,
  123. type: 'error',
  124. duration: 5 * 1000
  125. })
  126. return Promise.reject(error)
  127. }
  128. )
  129. export { request, requestA }

他这个封装的api接口请求示例:
也是像上面说的那样单独提出来一个文件写的

  1. import { request } from '@/utils/request'
  2. /**
  3. * @method addUserLogin 登录
  4. * @param {*} data
  5. * @returns
  6. */
  7. export function addUserLogin(data) {
  8. return request({
  9. url: '/user-login',
  10. method: 'post',
  11. data
  12. })
  13. }
  14. /**
  15. * @method addUserInfo 用户信息
  16. * @param {*} data
  17. * @returns
  18. */
  19. export function addUserInfo(data) {
  20. return request({
  21. url: '/user-info',
  22. method: 'post',
  23. data
  24. })
  25. }

调用方法和前面的一样就不在累述了


欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739。有需要软件开发,或者学习软件技术的朋友可以和我联系~(Q:815170684)

评价

vue3,vue组件,props给一个对象参数。vue组件间传参数vue父组件给子组件传参数。组件参数类型。父组件调用子组件的方法。vue组件事件监听,给子组件传递方法,子组件调用父组件方法

[TOC]组件可以使用props给组件传值,可以同时传递多个,可以是任意类型,比如字符串或者对象。 下面是个简单的例子: &lt...

vue3最基础的数据加载,表格table

vue3表格加载一点静态数据 <template> <el-table :data="tableData" style="width: 100%&quot...

vue3 Element Plus 表单输入框放到一行

当垂直方向空间受限且表单较简单时,可以在一行内放置表单。 通过设置 inline 属性为 true 可以让表单域变为行内的表单域...

vue3 Element ui Plus 表格 分页,vue3 el-pagination分页

其实就是el-pagination控件的使用而已 <template> <div> <el-table :data="tableData" ...

vue触发a标签的点击事件。vue3 dom操作 触发点击事件 。文件选择库只会触发一次change事件的问题

[TOC]vue触发a标签的点击事件直接操作dom节点的方式比较简单 <button @click="handleBtnClick">点击按钮&...

vue3 ref的使用多个ref的使用。通过ref触发点击事件

多个ref获取的方法可以使用一样的,通过变量名来区分就行了 const vabUploadRef = ref() const multipleTableRef = ref() ...

vue elementui,vue3 element plus 文件上传的时候设置其他参数。后台.net接收传递的额外参数。图片上传

比如上传文件的时候额外传递两个select选择的值 前台前面上传文件的时候要提供默认参数很简单,el-upload绑定一个data即可...

vue,vue3 打开新页面,页面跳转。vue跳转到一个新页面。vue路由传参,vue3路由传参,vue3 获取路由参数

[TOC]VUE页面跳转本地页面跳转 goApplicationCenter() { //进行页面跳转 let path = "/application-center&quo...

vuevue3组件封装,vue组件模板。简单组件模板。基础组件模板。vue引入自定义的组件。vue使用自定义的组件。插槽slot使用。vue封装格子效果,一块一块的grid布局效果

[TOC]vue封装组件的简单模板贴一个简单模板方便自定义组件的时候直接复制 <template> <div class="app...

.net6 Signalr+vue3 的运用(上)

.net6 Signalr+Vue3 的运用(上)[TOC] 什么是 SignalR?ASP.NET Core SignalR 是一个开放源代码库,可用于简化向应用添加...

.net6 Signalr+vue3 的运用(下)

.net6 Signalr+Vue3 的运用(下)[TOC] 上篇链接:https://www.tnblog.net/hb/article/details/7961SignalR 中的用户 Sig...

.net6 Signalr+vue3 配合Ingress Nginx的运用

.net6 Signalr+Vue3 配合Ingress Nginx的运用[TOC] 结合上篇:https://www.tnblog.net/hb/article/details/7963 项目打...

vue3 Element Plus 表格使用vue3常用界面搭配。vue3基础模板使用

一个简单的表格加时间搜索界面效果如下: 代码如下: <template> <div class="app-container"&g...

vue3 如何加prototype。vue3使用globalProperties

在2.X版本中创建一个vue 实例是通过 new Vue()来实现的,到了3.X中则是通过使用createApp这个 API返回一个应用实例,并且可...