vue專案學習05

gaoqiang1112發表於2018-02-27

前情回顧

在上一篇,我們通過配置基本的資訊,已經讓我們的專案能夠正常的跑起來了。但是,這裡還沒有涉及到 AJAX 請求介面的內容。

vue 本身是不支援 ajax 介面請求的,所以我們需要安裝一個介面請求的 npm 包,來使我們的專案擁有這個功能。

這其實是一個重要的 unix 思想,就是一個工具只做好一件事情,你需要額外的功能的時候,則需要安裝對應的軟體來執行。如果你以前是一個 jquery 重度使用者,那麼可能理解這個思想一定要深入的理解。

支援 ajax 的工具有很多。一開始,我使用的是 superagent 這個工具。但是我發現近一年來,絕大多數的教程都是使用的 axios這個介面請求工具。其實,這本來是沒有什麼差別的。但是為了防止你們在看了我的博文和其他的文章之後,產生理念上的衝突。因此,我也就改用 axios 這個工具了。

本身, axios 這個工具已經做了很好的優化和封裝。但是,在使用的時候,還是略顯繁瑣,因此,我重新封裝了一下。當然,更重要的是,封裝 axios 這個工具是為了和我以前寫的程式碼的相容。不過我封裝得很好,也推薦大家使用。

封裝 axios 工具,編輯 src/api/index.js 檔案

首先,我們要使用 axios 工具,就必須先安裝 axios 工具。執行下面的命令進行安裝

npm install axios -D

npm install axios -D

由於宿舍翻牆條件不好,這裡使用 cnpm 替代

這樣,我們就安裝好了 axios 工具了。

還記得我們在第三篇博文中整理的系統結構嗎?我們新建了一個 src/api/index.js 這個空文字檔案,就那麼放在那裡了。這裡,我們給它填寫上內容。

// 配置API介面地址
var root = 'https://cnodejs.org/api/v1'
// 引用axios
var axios = require('axios')
// 自定義判斷元素型別JS
function toType (obj) {
  return ({}).toString.call(obj).match(/\s([a-zA-Z]+)/)[1].toLowerCase()
}
// 引數過濾函式
function filterNull (o) {
  for (var key in o) {
    if (o[key] === null) {
      delete o[key]
    }
    if (toType(o[key]) === 'string') {
      o[key] = o[key].trim()
    } else if (toType(o[key]) === 'object') {
      o[key] = filterNull(o[key])
    } else if (toType(o[key]) === 'array') {
      o[key] = filterNull(o[key])
    }
  }
  return o
}
/*
  介面處理函式
  這個函式每個專案都是不一樣的,我現在調整的是適用於
  https://cnodejs.org/api/v1 的介面,如果是其他介面
  需要根據介面的引數進行調整。參考說明文件地址:
  https://cnodejs.org/topic/5378720ed6e2d16149fa16bd
  主要是,不同的介面的成功標識和失敗提示是不一致的。
  另外,不同的專案的處理方法也是不一致的,這裡出錯就是簡單的alert
*/

function apiAxios (method, url, params, success, failure) {
  if (params) {
    params = filterNull(params)
  }
  axios({
    method: method,
    url: url,
    data: method === 'POST' || method === 'PUT' ? params : null,
    params: method === 'GET' || method === 'DELETE' ? params : null,
    baseURL: root,
    withCredentials: false
  })
  .then(function (res) {
    if (res.data.success === true) {
      if (success) {
        success(res.data)
      }
    } else {
      if (failure) {
        failure(res.data)
      } else {
        window.alert('error: ' + JSON.stringify(res.data))
      }
    }
  })
  .catch(function (err) {
    let res = err.response
    if (err) {
      window.alert('api error, HTTP CODE: ' + res.status)
    }
  })
}

// 返回在vue模板中的呼叫介面
export default {
  get: function (url, params, success, failure) {
    return apiAxios('GET', url, params, success, failure)
  },
  post: function (url, params, success, failure) {
    return apiAxios('POST', url, params, success, failure)
  },
  put: function (url, params, success, failure) {
    return apiAxios('PUT', url, params, success, failure)
  },
  delete: function (url, params, success, failure) {
    return apiAxios('DELETE', url, params, success, failure)
  }
}

好,我們寫好這個檔案之後,儲存。

2017年10月20日補充,刪除了評論中有人反映會出錯的 return ,確實這個 return 是沒有什麼作用的。不過我這邊確實沒出錯。沒關係啦,本來就沒啥用,只是一個以前的不好的習慣程式碼。

有關 axios 的更多內容,請參考官方 github: https://github.com/mzabriskie/axios ,中文資料自行百度。

但就是這樣,我們還不能再 vue 模板檔案中使用這個工具,還需要調整一下 main.js 檔案。

調整 main.js 繫結 api/index.js 檔案

這次呢,我們沒有上來就調整 main.js 檔案,因為原始檔案就配置得比較好,我就沒有刻意的想要調整它。

原始檔案如下:

import Vue from 'vue'
import App from './App'
import router from './router'

Vue.config.productionTip = false

/* eslint-disable no-new */
new Vue({
  el: '#app',
  router,
  template: '<App/>',
  components: { App }
})

我們插入以下程式碼:

// 引用API檔案
import api from './api/index.js'
// 將API方法繫結到全域性
Vue.prototype.$api = api

也就是講程式碼調整為:

import Vue from 'vue'
import App from './App'
import router from './router'

// 引用API檔案
import api from './api/index.js'
// 將API方法繫結到全域性
Vue.prototype.$api = api

Vue.config.productionTip = false

/* eslint-disable no-new */
new Vue({
  el: '#app',
  router,
  template: '<App/>',
  components: { App }
})

好了,這樣,我們就可以在專案中使用我們封裝的 api 介面呼叫檔案了。

測試一下看看能不能調通

我們來修改一下 src/page/index.vue 檔案,將程式碼調整為以下程式碼:

<template>
  <div>index page</div>
</template>
<script>
export default {
  created () {
    this.$api.get('topics', null, r => {
      console.log(r)
    })
  }
}
</script>

好,這裡是呼叫 cnodejs.org 的 topics 列表介面,並且將結果列印出來。

我們在瀏覽器中開啟控制檯,看看 console 下面有沒有輸出入下圖一樣的內容。如果有的話,就說明我們的介面配置已經成功了。

原文連線 http://blog.csdn.net/fungleo/article/details/77601270

相關文章