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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...