Vuex + axios

Vue 爬坑之路(六)—— 使用 Vuex + axios 發(fā)送請求

Vue 原本有一個官方推薦的 ajax 插件 vue-resource卸奉,但是自從 Vue 更新到 2.0 之后怎顾,官方就不再更新 vue-resource

目前主流的 Vue 項目溉仑,都選擇 axios 來完成 ajax 請求去枷,而大型項目都會使用 Vuex 來管理數據,所以這篇博客將結合兩者來發(fā)送請求

前言:

Vuex 的安裝將不再贅述闭专,可以參考之前的博客 Vue 爬坑之路(四)—— 與 Vuex 的第一次接觸

使用 cnpm 安裝 axios

<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">cnpm install axios -S</pre>

安裝其他插件的時候影钉,可以直接在 main.js 中引入并 Vue.use()平委,但是 axios 并不能 use,只能每個需要發(fā)送請求的組件中即時引入

為了解決這個問題夺谁,有兩種開發(fā)思路廉赔,一是在引入 axios 之后肉微,修改原型鏈,二是結合 Vuex蜡塌,封裝一個 aciton碉纳。具體的實施請往下看~

方案一:改寫原型鏈

首先在 main.js 中引入 axios

<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">import axios from 'axios'</pre>

這時候如果在其它的組件中,是無法使用 axios 命令的岗照。但如果將 axios 改寫為 Vue 的原型屬性村象,就能解決這個問題

<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">Vue.prototype.$ajax = axios</pre>

在 main.js 中添加了這兩行代碼之后,就能直接在組件的 methods 中使用 $ajax 命令

[
復制代碼

](javascript:void(0); "復制代碼")

<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">methods: {
submitForm () { this.$ajax({
method: 'post',
url: '/user',
data: {
name: 'wise',
info: 'wrong'
}
})
}</pre>

[
復制代碼

](javascript:void(0); "復制代碼")

****方案二:在 Vuex 中封裝

之前的文章中用到過 Vuex 的 mutations攒至,從結果上看,mutations 類似于事件躁劣,用于提交 Vuex 中的狀態(tài) state

action 和 mutations 也很類似迫吐,主要的區(qū)別在于,action 可以包含異步操作账忘,而且可以通過 action 來提交 mutations

另外還有一個重要的區(qū)別:

mutations 有一個固有參數 state志膀,接收的是 Vuex 中的 state 對象

action 也有一個固有參數 context,但是 context 是 state 的父級鳖擒,包含 state溉浙、getters

Vuex 的倉庫是 store.js,將 axios 引入蒋荚,并在 action 添加新的方法

[
復制代碼

](javascript:void(0); "復制代碼")

<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">// store.js
import Vue from 'Vue' import Vuex from 'vuex'

// 引入 axios
import axios from 'axios' Vue.use(Vuex)

const store = new Vuex.Store({ // 定義狀態(tài)
state: {
test01: {
name: 'Wise Wrong' },
test02: {
tell: '12312345678' }
},
actions: { // 封裝一個 ajax 方法
saveForm (context) {
axios({
method:
'post',
url: '/user'****,
data: context.state.test02
})

}
}
})

export default store </pre>

[
復制代碼

](javascript:void(0); "復制代碼")

注意:即使已經在 main.js 中引入了 axios戳稽,并改寫了原型鏈,也無法在 store.js 中直接使用 $ajax 命令

換言之期升,這兩種方案是相互獨立的

在組件中發(fā)送請求的時候惊奇,需要使用 **this.$store.dispatch **來分發(fā)

<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">methods: {
submitForm () {
this.$store.dispatch('saveForm')
}
}</pre>

submitForm 是綁定在組件上的一個方法,將觸發(fā) saveForm播赁,從而通過 axios 向服務器發(fā)送請求

附錄:配置 axios

上面封裝的方法中颂郎,使用了 axios 的三個配置項,實際上只有 url 是必須的容为,完整的 api 可以參考使用說明

為了方便乓序,axios 還為每種方法起了別名,比如上面的 saveForm 方法等價于:

<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">axios.post('/user', context.state.test02)</pre>

完整的請求還應當包括 .then 和 .catch

<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">.then(function(res){
console.log(res)
})
.catch(function(err){
console.log(err)
})</pre>

當請求成功時坎背,會執(zhí)行 .then替劈,否則執(zhí)行 .catch

這兩個回調函數都有各自獨立的作用域,如果直接在里面訪問 this沼瘫,無法訪問到 Vue 實例

這時只要添加一個 .bind(this) 就能解決這個問題

<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">.then(function(res){
console.log(this.data)
}.bind(****this))</pre>

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末抬纸,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子耿戚,更是在濱河造成了極大的恐慌湿故,老刑警劉巖阿趁,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異坛猪,居然都是意外死亡脖阵,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門墅茉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來命黔,“玉大人,你說我怎么就攤上這事就斤『纺迹” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵洋机,是天一觀的道長坠宴。 經常有香客問我,道長绷旗,這世上最難降的妖魔是什么喜鼓? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮衔肢,結果婚禮上庄岖,老公的妹妹穿的比我還像新娘。我一直安慰自己角骤,他們只是感情好隅忿,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著启搂,像睡著了一般硼控。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上胳赌,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天牢撼,我揣著相機與錄音,去河邊找鬼疑苫。 笑死熏版,一個胖子當著我的面吹牛,可吹牛的內容都是我干的捍掺。 我是一名探鬼主播撼短,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼挺勿!你這毒婦竟也來了曲横?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎禾嫉,沒想到半個月后灾杰,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡熙参,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年艳吠,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片孽椰。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡昭娩,死狀恐怖,靈堂內的尸體忽然破棺而出黍匾,到底是詐尸還是另有隱情栏渺,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布膀捷,位于F島的核電站迈嘹,受9級特大地震影響,放射性物質發(fā)生泄漏全庸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一融痛、第九天 我趴在偏房一處隱蔽的房頂上張望壶笼。 院中可真熱鬧,春花似錦雁刷、人聲如沸覆劈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽责语。三九已至,卻和暖如春目派,著一層夾襖步出監(jiān)牢的瞬間坤候,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工企蹭, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留白筹,地道東北人。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓谅摄,卻偏偏與公主長得像徒河,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子送漠,可洞房花燭夜當晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內容