中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

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

發布時間:2023-04-25 14:59:49 來源:億速云 閱讀:155 作者:iii 欄目:開發技術

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

一、創建文件夾存放封裝好的js

我是創建在src/request/axios.js

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

二、封裝代碼如下

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

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

四、在需要的組件中使用

重點來了,封裝完了,歸根到底我得用。在組件中導入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',
        })
      }
    })
  }

調用的時候,當中有兩個參數,第一個參數是路徑,第二個參數是個對象,里面可以寫要發送請求的參數,比如:username:shuaibi,password:123456。

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

安裝第三方包webpack-dev-server

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

npm install webpack-dev-server

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

module.exports = {
  // 關閉語法檢查
  lintOnSave: false,
  // 解決axios發送請求時的跨域問題,不做配置會報錯如下↓↓↓↓
  // 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": "",
        // },
      },
    },
  },
};

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

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

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

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

樟树市| 庆安县| 保靖县| 葫芦岛市| 建阳市| 上虞市| 绩溪县| 中江县| 磐安县| 衡南县| 环江| 福泉市| 霞浦县| 甘德县| 乌拉特中旗| 金阳县| 南昌市| 小金县| 湟中县| 岱山县| 湛江市| 炉霍县| 壤塘县| 江达县| 特克斯县| 罗田县| 博兴县| 民乐县| 军事| 大荔县| 陆河县| 自贡市| 社旗县| 隆回县| 安阳县| 台安县| 九龙城区| 康平县| 陆丰市| 抚宁县| 江安县|