vue中axios的使用與封裝

来源:https://www.cnblogs.com/wangwBlogs/archive/2019/03/04/10471826.html
-Advertisement-
Play Games

分享下我自己的axios封裝axios是個很好用的插件,都是一些params對象,所以很方便做一些統一處理 當然首先是npm安裝axios 很簡單$ npm install axios --save在src下新建文件夾 service / index.js接著上代碼 以上請求之前的一些處理就完成了下 ...


分享下我自己的axios封裝
axios是個很好用的插件,都是一些params對象,所以很方便做一些統一處理

當然首先是npm安裝axios 很簡單$ npm install axios --save
在src下新建文件夾 service / index.js
接著上代碼

 1 import axios from 'axios';
 2 import { Toast} from 'mint-ui';// 我用的mint的框架來彈出我的錯誤返回 大家可以用別的提示
 3 import router from '../router'
 4 
 5 // 預設超時設置
 6 axios.defaults.timeout = 50000;
 7 
 8 // 相對路徑設置
 9 axios.defaults.baseURL ='';
10 
11 //http request 攔截器
12 axios.interceptors.request.use(
13   config => {
14     // 獲取token
15     const token = localStorage.getItem('cc_token');
16     // 設置參數格式
17     if(!config.headers['Content-Type']){
18       config.headers = {
19         'Content-Type':'application/json',
20       };
21     }
22     // 添加token到headers
23     if(token){
24       config.headers.token = token
25     }
26     // 鑒權參數設置
27     if(config.method === 'get'){
28        //get請求下 參數在params中,其他請求在data中
29       config.params = config.params || {};
30       let json = JSON.parse(JSON.stringify(config.params));
31       //一些參數處理
32     }else{
33       config.data = config.data || {};
34       //一些參數處理
35     }
36     return config;
37   },
38   err => {
39     return Promise.reject(err);
40   }
41 );

 

以上請求之前的一些處理就完成了
下麵是獲得返回的一些處理

//http response 攔截器
axios.interceptors.response.use(
  response => {
    //一些統一code的返回處理
    if(response.data.code === 501){
      // 登錄驗證
      //做了個示例跳轉項目中登錄,並記錄下相對路徑
      router.push({
        name:'login',//從哪個頁面跳轉
        query:{
          retUrl:window.location.href.split('#')[1] || '',
          is_new_user_url:1
        }
      })
    }
    return response;
  },
  error => {
    return Promise.reject(error)
  }
);

 

接著把所有請求類型都做下簡單封裝

/**
 * 封裝get方法
 * @param url
 * @param params
 * @returns {Promise}
 */
export function fetch(url,params={}){
  return new Promise((resolve,reject) => {
    axios.get(url,{
      params:params
    })
      .then(response => {
        if(response.data.code === 200){
        //返回成功處理  這裡傳的啥 後續調用的時候 res就是啥
          resolve(response.data.data);//我們後臺所有數據都是放在返回的data里所以這裡統一處理了
        }else{
        //錯誤處理
          Toast(response.data.msg)
        }
      })
      .catch(err => {
        reject(err);
        let message = '請求失敗!請檢查網路';
        //錯誤返回
        if(err.response)message=err.response.data.message;
        Toast(message)
      })
  })
}

/**
 * 封裝post請求
 * @param url
 * @param data
 * @returns {Promise}
 */

export function post(url,data = {}){
  return new Promise((resolve,reject) => {
    axios.post(url,data)
      .then(response => {
        if(response.data.code === 200){
          resolve(response.data.data);
        }else{
          Toast(response.data.msg)
        }
      },err => {
        reject(err);
        let message = '請求失敗!請檢查網路';
        if(err.response)message=err.response.data.message;
        Toast(message)
      })
  })
}

/**
 * 封裝patch請求
 * @param url
 * @param data
 * @returns {Promise}
 */

export function patch(url,data = {}){
  return new Promise((resolve,reject) => {
    axios.patch(url,data)
      .then(response => {
        if(response.data.code === 200){
          resolve(response.data.data);
        }else{
          Toast(response.data.msg)
        }
      },err => {
        reject(err);
        let message = '請求失敗!請檢查網路';
        if(err.response)message=err.response.data.message;
        Toast(message)
      })
  })
}

/**
 * 封裝put請求
 * @param url
 * @param data
 * @returns {Promise}
 */

export function put(url,data = {}){
  return new Promise((resolve,reject) => {
    axios.put(url,data)
      .then(response => {
        if(response.data.code === 200){
          resolve(response.data.data);
        }else{
          Toast(response.data.msg)
        }
      },err => {
        reject(err);
        let message = '請求失敗!請檢查網路';
        if(err.response)message=err.response.data.message;
        Toast(message)
      })
  })
}

export function del(url,data = {}){
  return new Promise((resolve,reject) => {
    axios.delete(url,data)
      .then(response => {
        if(response.data.code === 200){
          resolve(response.data.data);
        }else{
          Toast(response.data.msg)
        }
      },err => {
        reject(err);
        let message = '請求失敗!請檢查網路';
        if(err.response)message=err.response.data.message;
        Toast(message)
      })
  })
}

 

好了 主要的文件編輯好 然後在service中新建api.js文件並引入對應組件方法

import Vue from 'vue';
import {post,fetch,patch,put,del,upload,ret2} from './index'
Vue.prototype.$post=post;
Vue.prototype.$fetch=fetch;
Vue.prototype.$patch=patch;
Vue.prototype.$put=put;
Vue.prototype.$del=del;

 

接著就可以開始寫各個API方法了

//也可以不需要
const _baseUrl=process.env.API_URL;//這裡我在項目配置文件裡面設置了相對路徑
//登錄方法
const loginURL = `${_baseUrl}api/admin/login`;
export const loginApi = function(json) {
  return Vue.prototype.$post(loginURL,{"username":json.username,"passwd":json.password})
};
//修改賬號信息RESTful
const editAdminUrl = `${_baseUrl}api/admin/user/info`;
export const editAdminListApi = function (id,json) {
  return Vue.prototype.$put(`${editAdminUrl}/${id}`,json)
};
//等等...

 

最後是使用,非常簡單方便,在vue文件中引入並使用

  import { loginApi ,editAdminListApi } from "../../service/api";
    export default {
        methods:{
            //登錄
            login(){
                let json = {
                    userName:'xx',
                    password:'xx'
                }
                loginApi().then(res=>{
                    console.log(res)
                })
            },
            // RESTful 修改信息
            editAdminList(){
                let id = 1;
                let json = {name:11};
                editAdminListApi(id,json).then(res=>{
                    console.log(res)
                })
            }
        }
    }

使用方便簡潔。

over


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 其實js的this指向很簡單。我們記住下麵3種情況。 當我們執行fn()的時候,這個普通函數中的this指向到底是什麼?答案就是指向的是瀏覽器中的window.(這裡說明,這裡實在瀏覽器下,如果是node環境不是)。 fn類(這裡使用了構造函數new方式生成,這個時候函數fn可以看做是一個類),生成 ...
  • 最近公司的新項目。前端樣式採用的螞蟻金服的antDesign。 比較喜歡antDesign、BootStrap一類簡約大方的前端樣式庫。 但是在頁面佈局上、包括一些選擇框。預設的scroll樣式簡直醜爆。 遂度娘資料,通過css3進行修改。 ::-webkit-scrollbar 滾動條整體部分 : ...
  • 首先設置meta屬性,如下代碼: 使用如下代碼就能實現移動端的適配: 100vw相當於瀏覽器的window.innerWidth,是瀏覽器的內部寬度,註意,滾動條寬度也計算在內!那麼1vw就是表示1%的屏幕寬度。 其中的13.33333333vw是怎麼來的呢?就是你的設計稿是750px,那麼設計稿的 ...
  • 昨天主要介紹了原型,在js中,原型,原型鏈和繼承是三個很重要的概念,而這幾個概念也是面試中經常會被問到的問題,今天,就把昨天還沒總結的原型鏈和繼承繼續做一個整理,希望大家一起學習,一起進步呀O(∩_∩)O 一、原型鏈 學過java的同學應該都知道,繼承是java的重要特點之一,許多面向對象的語言都支 ...
  • 一、定義一個文本框,一個按鈕和一個盒子 id分別設為text,btn,warp,定義的變數名分別為otext,obtn,owarp 註:定義變數 var var obtn=document.getElementById(" "); 二、調用一個function()函數 為obtn加一個點擊事件onc ...
  • px:像素,相對長度單位,相對於顯示器屏幕的解析度而言(其實我個人認為可以理解為固定單位); rem:這是個web前端中的新成員,是CSS3中新增的一個相對單位。相對的只是html根元素; 1、設定兩個盒子(舉例) 2、簡單設定樣式(px形式) 3、簡單設定樣式(px轉rem形式) 4、兩種形式顯示 ...
  • 這是新版本 webpack-dev-server 出於安全考慮, 預設檢查 hostname,如果hostname不是配置內的,將中斷訪問。顧僅存在於開發環境: npm run dev,打包之後不會。 在 build/webpack.base.conf.js 的 配置: ...
  • 本來今天想記錄一下Flow在vue源碼中的應用,結果臨時觸發了個bug。。。 bug描述: elementUi + Vue 技術 需求:一個表格中有至少兩條數據,每條數據都有input框,在失去焦點後需要一個彈框給出提示信息。 觸發:在點擊一個input框後接著點擊另一個input框,使第一個inp ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...