溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

vue3中封裝Axios請求及在組件中使用的方法是什么

發(fā)布時間:2023-04-25 14:59:49 來源:億速云 閱讀:143 作者:iii 欄目:開發(fā)技術(shù)

本篇內(nèi)容主要講解“vue3中封裝Axios請求及在組件中使用的方法是什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學(xué)習(xí)“vue3中封裝Axios請求及在組件中使用的方法是什么”吧!

一、創(chuàng)建文件夾存放封裝好的js

我是創(chuàng)建在src/request/axios.js

vue3中封裝Axios請求及在組件中使用的方法是什么

二、封裝代碼如下

直接將下面代碼復(fù)制在request.js中,封裝了get,post請求,需要自己配置的是:自己的請求地址,tokenKey是否為token,改為自己存入本地的token名,可以看一下代碼中的注釋,很好看懂。

/**axios封裝
 * 請求攔截、相應(yīng)攔截、錯誤統(tǒng)一處理
 */
import axios from 'axios';
import QS from 'qs';
import router from '../router/index'
//qs.stringify()是將對象 序列化成URL的形式,以&進行拼接
//  let protocol = window.location.protocol; //協(xié)議
//  let host = window.location.host; //主機
//  axios.defaults.baseURL = protocol + "//" + host;
axios.defaults.baseURL = 'http://localhost:8888'
 
axios.interceptors.request.use( //響應(yīng)攔截
        async config => {
            // 每次發(fā)送請求之前判斷vuex中是否存在token        
            // 如果存在,則統(tǒng)一在http請求的header都加上token,這樣后臺根據(jù)token判斷你的登錄情況
            // 即使本地存在token,也有可能token是過期的,所以在響應(yīng)攔截器中要對返回狀態(tài)進行判斷 
            config.headers.token = sessionStorage.getItem('token')
            return config;
        },
        error => {
            return Promise.error(error);
        })
    // 響應(yīng)攔截器
axios.interceptors.response.use(
    response => {
        if (response.status === 200) {
            return Promise.resolve(response); //進行中        
        } else {
            return Promise.reject(response); //失敗       
        }
    },
    // 服務(wù)器狀態(tài)碼不是200的情況    
    error => {
        if (error.response.status) {
            switch (error.response.status) {
                // 401: 未登錄                
                // 未登錄則跳轉(zhuǎn)登錄頁面,并攜帶當(dāng)前頁面的路徑                
                // 在登錄成功后返回當(dāng)前頁面,這一步需要在登錄頁操作。                
                case 401:
                    break
                    // 403 token過期                
                    // 登錄過期對用戶進行提示                
                    // 清除本地token和清空vuex中token對象                
                    // 跳轉(zhuǎn)登錄頁面                
                case 403:
                    sessionStorage.clear()
                    router.push('/login')
                    break
                    // 404請求不存在                
                case 404:
                    break;
                    // 其他錯誤,直接拋出錯誤提示                
                default:
            }
            return Promise.reject(error.response);
        }
    }
);
/** 
 * get方法,對應(yīng)get請求 
 * @param {String} url [請求的url地址] 
 * @param {Object} params [請求時攜帶的參數(shù)] 
 */
const $get = (url, params) => {
        return new Promise((resolve, reject) => {
            axios.get(url, {
                    params: params,
                })
                .then(res => {
                    resolve(res.data);
                })
                .catch(err => {
                    reject(err.data)
                })
        });
    }
    /** 
     * post方法,對應(yīng)post請求 
     * @param {String} url [請求的url地址] 
     * @param {Object} params [請求時攜帶的參數(shù)] 
     */
const $post = (url, params) => {
        return new Promise((resolve, reject) => {
            axios.post(url, QS.stringify(params)) //是將對象 序列化成URL的形式,以&進行拼接   
                .then(res => {
                    resolve(res.data);
                })
                .catch(err => {
                    reject(err.data)
                })
        });
    }
    //下面是vue3必須加的,vue2不需要,只需要暴露出去get,post方法就可以
export default {
    install: (app) => {
        app.config.globalProperties['$get'] = $get;
        app.config.globalProperties['$post'] = $post;
        app.config.globalProperties['$axios'] = axios;
    }
}

三、配置

在main.js中,引入我們第一步封裝的js,然后use()

//引入封裝Axios請求
import Axios from './request/axios';
 
const app = createApp(App).use(VueAxios, axios).use(ElementPlus).use(router).use(Axios)

四、在需要的組件中使用

重點來了,封裝完了,歸根到底我得用。在組件中導(dǎo)入getCurrentInstance。加上如下代碼。

import {  getCurrentInstance } from "vue";
const { proxy } = getCurrentInstance();
  function logout(){
    proxy.$post("/sysStaff/logout",{}).then((response)=>{
      console.log(response)
      if(response.code == 200){
        sessionStorage.clear();
        router.push('/')
        ElMessage({
          message: '退出成功',
          type: 'success',
        })
      }
    })
  }

調(diào)用的時候,當(dāng)中有兩個參數(shù),第一個參數(shù)是路徑,第二個參數(shù)是個對象,里面可以寫要發(fā)送請求的參數(shù),比如:username:shuaibi,password:123456。

補充:通過具體配置解決跨域問題CORS

安裝第三方包webpack-dev-server

不安裝沒有devServer配置項,必須安裝

npm install webpack-dev-server

在根目錄vue.config.js中寫入如下配置

module.exports = {
  // 關(guān)閉語法檢查
  lintOnSave: false,
  // 解決axios發(fā)送請求時的跨域問題,不做配置會報錯如下↓↓↓↓
  // ccess to XMLHttpRequest at 'http://127.0.0.1:23456/webPage/home_notice.post' from origin 'http://localhost:8080' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.
  devServer: {
    // https: false,
    proxy: {
      //  /api 表示攔截以/api開頭的請求路徑
      "/webPage": {
        target: "http://127.0.0.1:23456/", // 跨域的域名(不需要重寫路徑)
        ws: false, // 是否開啟websockede
        changeOrigin: true, // 是否開啟跨域
        // pathRewrite: {
        //   "^/webPage": "",
        // },
      },
    },
  },
};

瀏覽器從一個域名的網(wǎng)頁去請求另一個域名的資源時,域名、端口、協(xié)議任一不同,都是跨域。這里不具體解釋,想了解的可以查資料。

  1. devServer配置項可以開啟一個反向代理,來解決跨域問題。之前所有的地址拼接可以得到
    /webPage/cooperater.post…最終發(fā)起請求時,如果沒有寫pathRewrite則表示查找/webPage并在其前拼接target中的地址。最會向http://127.0.0.1:23456/webPage/cooperater.post口發(fā)起請求。

  2. pathRewrite: {"^/webPage": "***",},表示路由重寫將/webPage替換為***

到此,相信大家對“vue3中封裝Axios請求及在組件中使用的方法是什么”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI