天天看點

vue+axios全局注冊環境變量和全局接口攔截黑科技

axios 用了有一段時間了,可能對于剛入手的同學來說,和vue-resource沒啥差別。但是有沒有相關,為啥那麼多人喜歡用axios,而不用vue-resource啦。axios有很多的黑科技,比如全局注冊變量,全局攔截等等,對于開發來說,可以節省很多事兒!!!

一、安裝axios

老規矩,要想使用axios,我們得安裝它,安裝方式:npm install axios --save

二,在入庫檔案main.js(我的是main.js)中引入axios

import axios from 'axios'

然後注冊到vue的全局變量上,就可以在别的任何元件中使用了。 

Vue.prototype.$axios = axios

三,在元件HelloWorld.vue中使用axios

這裡我用的csdn的一個接口"https://www.csdn.net/api/articles?type=more&category=home&shown_offset=1531884384612144"

如果拿來直接用,會報跨域錯誤,我想大家應該都知道原因吧!!!

那麼怎麼辦啦,可能你首先會想到jsonp,或者代理的方式。不過這裡jsonp就行不通了。具體原因自己思考。

下面用代理的方式解決這個跨域的問題。

首先,在config目錄下的index檔案中dev下找到proxyTable 這個地方,添加如下代碼:

proxyTable: { // 在這裡配置如下代碼
        '/api': {
            target:'https://www.csdn.net/api/articles?type=more&category=home&shown_offset=1531884384612144', // 你請求的第三方接口
            changeOrigin:true, // 在本地會建立一個虛拟服務端,然後發送請求的資料,并同時接收請求的資料,這樣服務端和服務端進行資料的互動就不會有跨域問題
            pathRewrite:{  // 路徑重寫,
                '^/api': '/api'  // 替換target中的請求位址,也就是說以後你在請求http://api.jisuapi.com/XXXXX這個位址的時候直接寫成/api即可。
            }
        }
    },
           

然後在元件中調用接口:

<template>
  <div class="hello">
    <h1>{{ msg }}</h1>
    <ul>
      <li v-for="(item,index) in allData" :key="index">{{item.title}}</li>
    </ul>
  </div>
</template>

<script>
export default {
  name: 'HelloWorld',
  data () {
    return {
      msg: 'axios 黑科技',
      allData:[]
    }
  },
  created(){
    this.axiosTest();
  },
  methods:{
      axiosTest(){
        this.$axios({
          method: 'get',
          url: "/api",
        }).then((response) => {
            var data=response.data;
            this.allData = data.articles;       
     
        }).catch(err =>{
          console.log(err);
        })
      },
  }
}
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
h1, h2 {
  font-weight: normal;
  font-size: 20px;
}
ul {
  list-style-type: none;
  padding: 0;
}
li {
  width: 100%;
  text-align: left;
  display: inline-block;
  margin: 0 10px;
  font-size: 30px;
  list-style: decimal;
}
a {
  color: #42b983;
}
</style>
           

這時在浏覽器檢視發現正常傳回了資料,樣式沒做處理,自己做可以美化一下。

vue+axios全局注冊環境變量和全局接口攔截黑科技

 四,本文的重點:接口全局注冊參數變量和添加全局攔截

第一步,axios全局注冊參數變量,本文以登入為例,通常最常用的token形式。為了安全,通常token都是放在header中的,做過的同學都知道。

首先在入口檔案mian.js中添加如下代碼

//添加全局token
Vue.prototype.$axios.defaults.headers['authorization'] = "my token";
           

然後重新開機,在浏覽器檢視,header中已經有了這個參數authorization。

vue+axios全局注冊環境變量和全局接口攔截黑科技

第二步,axios添加全局接口攔截

同樣也是在入口檔案mian.js中添加代碼:

//添加全局攔截
Vue.prototype.$axios.interceptors.response.use(function (response) {
  let rps = response.data;
  //假設token失效 傳回的code是401
  console.log(rps);
  if(rps.ret == 401){
    //具體的處理邏輯代碼寫在此處

  }
  return response;
}, function (err) {
  console.log(err);
});
           

到此,本文的重點全部講完了,是不是覺得axios很強大。

源碼下載下傳位址github:https://github.com/catbea/px2rem

看了此文,有收貨的話,可以關注一下。後面還有很多黑科技哦