vue專案學習05
前情回顧
在上一篇,我們通過配置基本的資訊,已經讓我們的專案能夠正常的跑起來了。但是,這裡還沒有涉及到 AJAX
請求介面的內容。
vue
本身是不支援 ajax
介面請求的,所以我們需要安裝一個介面請求的 npm
包,來使我們的專案擁有這個功能。
這其實是一個重要的
unix
思想,就是一個工具只做好一件事情,你需要額外的功能的時候,則需要安裝對應的軟體來執行。如果你以前是一個jquery
重度使用者,那麼可能理解這個思想一定要深入的理解。
支援 ajax
的工具有很多。一開始,我使用的是 superagent
這個工具。但是我發現近一年來,絕大多數的教程都是使用的 axios
這個介面請求工具。其實,這本來是沒有什麼差別的。但是為了防止你們在看了我的博文和其他的文章之後,產生理念上的衝突。因此,我也就改用 axios
這個工具了。
本身, axios
這個工具已經做了很好的優化和封裝。但是,在使用的時候,還是略顯繁瑣,因此,我重新封裝了一下。當然,更重要的是,封裝 axios
這個工具是為了和我以前寫的程式碼的相容。不過我封裝得很好,也推薦大家使用。
封裝 axios 工具,編輯 src/api/index.js 檔案
首先,我們要使用 axios
工具,就必須先安裝 axios
工具。執行下面的命令進行安裝
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
下面有沒有輸出入下圖一樣的內容。如果有的話,就說明我們的介面配置已經成功了。
相關文章
- Vue 學習筆記 (三) -- VueCli 3 專案配置Vue筆記
- 20 個值得學習的 Vue 開源專案Vue
- 小白學習Vue(11)--環境安裝及專案構建 | webstorm構建vue專案VueWebORM
- VUE2 第六天學習--- vue單檔案專案構建Vue
- TpyeScript+VUE3.x學習之路01 建立專案Vue
- 忽略某些檔案 —— Git 學習筆記 05Git筆記
- 05.ElementUI原始碼學習:專案釋出配置(github pages&npm package)UI原始碼GithubNPMPackage
- 學習不一樣的vue實戰(2): 專案分析Vue
- vue大型電商專案尚品彙(後臺篇)day05Vue
- vue大型電商專案尚品彙(前臺篇)day05Vue
- 我練習專案眼中的 vueVue
- 【學習圖片】05:GIF
- 專案學習Graphql(一)
- 專案學習經驗
- 學習Java的Day05Java
- VUE專案Vue
- vue大型電商專案尚品彙(前臺篇)day05終結篇Vue
- 學習不易,用vue寫了一個入門專案——知乎日報Vue
- Qt學習- (掃雷專案初學)QT
- Halo 開源專案學習(一):專案啟動
- vue 學習Vue
- 學習vueVue
- Vue學習Vue
- Vue 2.5 從零開始學習 - 利用 Vue cli 腳手架工具快速建立 工程化的 Vue 專案Vue
- [譯] TensorFlow 教程 #05 - 整合學習
- Java基礎-學習筆記05Java筆記
- Nginx部署Vue前端專案,部署多個Vue專案NginxVue前端
- vue專案配置Vue
- vue專案流程Vue
- 建立vue專案Vue
- Rust 程式設計小專案:WebServer 05Rust程式設計WebServer
- 05 常見微服務專案結構微服務
- 個人部落格專案筆記_05筆記
- 從0開始學VUE - 執行第一個VUE專案Vue
- 學習開源 java 專案 gunsJava
- 開源專案學習方法ABC
- 【轉】UCM專案管理配置學習專案管理
- [VUE]vue3新建專案Vue