Vue2.0 + Vux案例:愛柯南之五、引入axios

來源:互聯網
上載者:User

標籤:targe   登入   response   ams   row   catch   簡單   reject   request   

轉載請註明出處:http://www.cnblogs.com/shamoyuu/p/vue_vux_app_5.html

 

項目github地址:https://github.com/shamoyuu/vue-vux-iconan

 

我們引入vux的toast外掛程式,為了能在任何地方使用toast(不僅僅是在組件中,比如store.js中),我們修改main.js

import Vue from "vue"import App from "./App"import router from "./tools/router"import store from "./tools/store"import { ToastPlugin } from "vux"import TestDirective from "./directives/common/TestDirective"import api from "./tools/api"import errorHandle from ".//tools/errorHandle"Vue.config.productionTip = false;const FastClick = require("fastclick");FastClick.attach(document.body);Vue.use(ToastPlugin, { type: "text", position: ‘bottom‘, width: "70vw" });Vue.use(TestDirective);Vue.use(api);Vue.use(errorHandle);Vue.prototype.instance = new Vue({    el: ".app",    router: router,    store: store,    template: "<App/>",    components: { App }});

修改的地方就圖中紅色的部分,最後一句比較重要,這樣我們可以在任何地方引用到vue的執行個體,從而達到任何地方都使用toast的目的。

只要能擷取到Vue對象,就可以通過下面的方式來彈出toast

Vue.prototype.instance.$vux.toast.show("message")

 

 

 

然後我們添加axios

npm install --save-dev axios

然後我們建立一個檔案tools/axios.js檔案

import axios from "axios"import Vue from "vue"//設定全域請求為ajax請求axios.interceptors.request.use((config) => {    config.headers["X-Requested-With"] = "XMLHttpRequest";    return config;});//錯誤處理axios.interceptors.response.use(    (response) => {        const result = response.data;
//stateCode為0表示正常返回資料,其他情況表示有錯誤,錯誤資訊由message提供 switch (result.stateCode) { case 0: return result.data; case 1: //沒有登入 break; case 2: //其他錯誤 break; default: break; } const err = new Error(result.message); err.data = result; err.response = response; throw err; }, (err) => { if (err && err.response) { switch (err.response.status) { case 400: err.message = "請求錯誤"; break case 404: err.message = "請求地址不存在"; break case 408: err.message = "網路異常,請稍後重試[408]"; break case 500: err.message = "網路異常,請稍後重試[500]"; break case 501: err.message = "網路異常,請稍後重試[501]"; break case 502: err.message = "網路異常,請稍後重試[502]"; break case 503: err.message = "網路異常,請稍後重試[503]"; break case 504: err.message = "網路異常,請稍後重試[504]"; break case 505: err.message = "網路異常,請稍後重試[505]"; break default: } } else { err.message = "網路異常,請稍後重試"; } Vue.prototype.instance.$vux.toast.show(err.message); return Promise.reject(err); });export default axios;

這個檔案的內容很簡單,唯一需要注意的是攔截response請求的那部分,我們約定使用下面的格式

{    "stateCode": 0,    "data": "當stateCode為0時有效,表示正常返回的資料"    "message": "當stateCode不為0時有效,表示錯誤資訊"}

所以在stateCode==0的時候,我們直接返回了result.data,其他的資訊直接丟棄了,因為頁面不需要關心。

這裡如果正常返回了資料(200狀態),那麼是否需要彈出message資訊由頁面決定,而其他非200的異常都會預設彈出toast提示。

 

然後我們建立一個錯誤處理的檔案tools/errorHandle.js

export default {    install(Vue) {        Vue.prototype.$errorHandle = function (errorData) {            //如果返回200,則彈出message            if (errorData.response && errorData.response.status == 200) {                if (errorData.data && errorData.data.message) {                    Vue.prototype.instance.$vux.toast.show(errorData.data.message);                }            }            else {                //如果是非200,其他錯誤在這裡處理            }        }    }}

然後我們建立一個tools/api.js檔案,將axios再封裝一下,順便讓它變成全域對象。

import axios from "@/tools/axios"export default {    install(Vue) {        Vue.prototype.$api = {            get(url, params) {                return axios.get(url, {                    params: params                })            },            post(url, params) {                return axios.post(url, params);            }        }    }}

 

至此,我們成功地引入了axios,來寫個例子,在任意組件添加下面的代碼

mounted: function() {
this.$api.get("http://xxx.xx.com/xxxx/getlist", { id: "1" }) .then(function(data) { console.info("成功", arguments); }) .catch(this.$errorHandle);}

這裡對錯誤的處理並沒有放到then的第二個參數上,而是單獨寫了catch,這樣寫比較清晰一點。

如果不寫這個catch,對狀態200且stateCode != 0的錯誤不會有任何提示(某些情況下可能真的不需要提示)。

 

 

這個是狀態404的錯誤提示,不管寫不寫catch都會彈出來。

 

這個是狀態200,但是stateCode != 0時的錯誤提示,必須寫了.catch(this.$errorHandle)才會觸發。

 

Vue2.0 + Vux案例:愛柯南之五、引入axios

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.