Vuex 學(xué)習(xí)筆記

前言

學(xué)習(xí)vuex之前,我提出了3個(gè)疑問。Vuex 官網(wǎng)

  • vuex 是什么侈玄?
    官方文檔解釋:vuex 是一個(gè)專為 Vue.js 應(yīng)用程序開發(fā)的狀態(tài)管理模式
    通俗點(diǎn)講就是把這個(gè)項(xiàng)目中需要多個(gè)地方或全局使用的狀態(tài)集中管理起來损话。

  • vuex 應(yīng)用場(chǎng)景是什么?
    舉個(gè)栗子
    ①多個(gè)組件依賴一種狀態(tài)槽唾。就是說這個(gè)狀態(tài)一改變丧枪,其他依賴這個(gè)狀態(tài)的組件都要跟著改變。如果是兄弟組件庞萍,使用傳值的方式的話就比較麻煩拧烦。
    ②多個(gè)組件共用同一個(gè)請(qǐng)求的數(shù)據(jù)。我比較懶钝计,又不想在多個(gè)組件寫相同的請(qǐng)求恋博,而且增加重復(fù)代碼,怎么辦私恬?這時(shí)候vuex 就派上用場(chǎng)了债沮。
    從以上兩個(gè)栗子得出:需要集中管理共同狀態(tài)的都可以使用 vuex(不要濫用)

  • vuex 怎么用?

// store.js
import Vue from 'vue';
import Vuex from 'vuex';

Vue.use(Vuex);
export default new Vuex.store({
  state: { ... },
  mutations: { ... },
  actions: { ... },
  getters: { ... },
  modules: { ... } 
})
// index.js
import Vue from 'vue';
import store from '/store';

new Vue({
  // 全局掛載 Vuex
  store
})

在真正使用之前本鸣,你要了解 vuex 擴(kuò)展的幾個(gè)核心概念疫衩。

Vuex 核心概念

第一次看官方文檔的時(shí)候,對(duì)下面幾個(gè)概念不是很理解荣德,認(rèn)真看文檔闷煤,換個(gè)理解方式就好多了。

  • state:管理狀態(tài)的地方涮瞻;可以類比成 vue 里面的 data鲤拿。
    注意:state(狀態(tài)) 不能像 data 的屬性那樣通過賦值改變,只能通過 mutations 改變署咽,這樣的目的是為了更好地追蹤狀態(tài)的變化
export default new Vuex.Store({
  state: {
    count: 1,
    ...
  }
})
  • mutations:改變state(狀態(tài))的地方近顷;可以類比成 vue 里面的 methods
    mutations 里面所有 回調(diào)函數(shù) 接受的第一個(gè)參數(shù)是 state,其余參數(shù)是commit傳的幕庐。
    注意:mutations 是同步觸發(fā)的,無法監(jiān)聽回調(diào)函數(shù)中進(jìn)行的狀態(tài)的改變家淤;那我要寫異步請(qǐng)求改變狀態(tài)怎么辦异剥,actions 才是干這事的。
export default new Vuex.Store({
  state: {
    count: 1
  },
  mutations: {
    increment (state) {
      // 改變狀態(tài)絮重;也就是修改 state 里面 count 的值
      state.count++
    }
  }
})

那怎么調(diào)用mutations方法改變state冤寿?通過commit(提交)的方式。

// ...
mutations: {
  increment (state, n) {
    state.count += n
  },
  increment1 (state, params) {
    state.count += params.amount
  }
}
// ***.vue
// 普通方式提交
this.$store.commit('increment', 10)
// 以對(duì)象形式提交
this.$store.commit({
  type: 'increment1',
  amount: 10
})
  • actions:類似于 mutation青伤,但不同的是actions提交的是 mutation督怜,而不是直接改變state actions可以包含任意異步操作狠角。
    actions 接受的第一個(gè)參數(shù)是 Store實(shí)例具有相同方法和屬性的 context 對(duì)象号杠,其余參數(shù)是dispatch分發(fā)的
export default new Vuex.Store({
  state: {
    count: 0
  },
  mutations: {
    increment (state) {
      state.count++
    }
  },
  actions: {
    incrementAsync(context) {
      context.commit('increment')
    },
    // 參數(shù)解構(gòu)
    incrementAsync1 ({ commit, getters }, params) {
      commit('increment')
    },
    // 回調(diào)方式提交
    incrementAsync2 ({ commit, getters }, params) {
      setTimeout(() => {
        commit('increment')
      }, 1000)
    }
  }
})

那怎么調(diào)用actions的方法? 通過dispatch(分發(fā))的方式丰歌。

// 以普通方式分發(fā)
this.$store.dispatch('incrementAsync')

// 以載荷形式分發(fā)
this.$store.dispatch('incrementAsync1', {
  amount: 10
})

// 以對(duì)象形式分發(fā)
this.$store.dispatch({
  type: 'incrementAsync2',
  amount: 10
})
  • getters:可以看做是Store實(shí)例的計(jì)算屬性姨蟋;用法與vue 的計(jì)算屬性一致。
    getters 的返回值會(huì)根據(jù)它的依賴被緩存起來立帖,且只有當(dāng)它的依賴值發(fā)生了改變才會(huì)被重新計(jì)算眼溶。
    getters 只接受兩個(gè)參數(shù) stategetters晓勇。要是實(shí)現(xiàn)給 getter 傳參堂飞,只能通過讓 getter 返回一個(gè)函數(shù)。
export default new Vuex.Store({
  state: {
    todos: [
      { id: 1, text: '...', done: true },
      { id: 2, text: '...', done: false }
    ]
  },
  getters: {
    doneTodos: state => {
      return state.todos.filter(todo => todo.done)
    },
    // 接收兩個(gè)參數(shù)
    doneTodos1: (state, getters) => {
      return getters.doneTodos.length
    },
    // 返回一個(gè)函數(shù)
    doneTodos2: (state) => (id) => {
      return state.todos.find(todo => todo.id === id)
    }
  }
})

調(diào)用 getters
注意:getter 在通過方法訪問時(shí)绑咱,每次都會(huì)去進(jìn)行調(diào)用绰筛,而不會(huì)緩存結(jié)果。

// 通過屬性調(diào)用
this.$store.getters.doneTodos1
// 通過方法調(diào)用
this.$store.getters.doneTodos2(1)
  • modules:模塊的意思描融;每個(gè)模塊擁有自己的 state别智、mutationactions稼稿、getters薄榛、甚至是嵌套子模塊。
    當(dāng)項(xiàng)目非常復(fù)雜時(shí)候让歼,將 Store 分割成多個(gè)module(模塊)管理的話維護(hù)起來就方便多了敞恋。
// ...
export default new Vuex.Store({
  modules: {
    moduleA,
    moduleB
  }
})

總結(jié)

  • 如果認(rèn)真看完就會(huì)發(fā)現(xiàn)與官網(wǎng)給的核心概念的目錄順序不同,我建議看文檔的順序是先看 state谋右、mutation硬猫、actions,然后再看 gettersmodules啸蜜,這樣相對(duì)容易理解坑雅。
  • 詳情請(qǐng)移步 Vuex 官網(wǎng)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市衬横,隨后出現(xiàn)的幾起案子裹粤,更是在濱河造成了極大的恐慌,老刑警劉巖蜂林,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件遥诉,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡噪叙,警方通過查閱死者的電腦和手機(jī)矮锈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來睁蕾,“玉大人苞笨,你說我怎么就攤上這事∽涌簦” “怎么了猫缭?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)壹店。 經(jīng)常有香客問我猜丹,道長(zhǎng),這世上最難降的妖魔是什么硅卢? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任射窒,我火速辦了婚禮,結(jié)果婚禮上将塑,老公的妹妹穿的比我還像新娘脉顿。我一直安慰自己,他們只是感情好点寥,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布艾疟。 她就那樣靜靜地躺著,像睡著了一般敢辩。 火紅的嫁衣襯著肌膚如雪蔽莱。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天戚长,我揣著相機(jī)與錄音盗冷,去河邊找鬼。 笑死同廉,一個(gè)胖子當(dāng)著我的面吹牛仪糖,可吹牛的內(nèi)容都是我干的柑司。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼锅劝,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼攒驰!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起故爵,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤玻粪,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后稠集,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體奶段,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡饥瓷,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年剥纷,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片呢铆。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡晦鞋,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出棺克,到底是詐尸還是另有隱情悠垛,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布娜谊,位于F島的核電站确买,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏纱皆。R本人自食惡果不足惜湾趾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望派草。 院中可真熱鬧搀缠,春花似錦、人聲如沸近迁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鉴竭。三九已至歧譬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間搏存,已是汗流浹背缴罗。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留祭埂,地道東北人面氓。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓兵钮,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親舌界。 傳聞我的和親對(duì)象是個(gè)殘疾皇子掘譬,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • Vuex 是什么? ** 官方解釋:Vuex 是一個(gè)專為 Vue.js 應(yīng)用程序開發(fā)的狀態(tài)管理模式**呻拌。它采用集中...
    Rz______閱讀 2,303評(píng)論 1 10
  • vuex理解藐握。 Vuex是一個(gè)專為Vue.js應(yīng)用程序開發(fā)的狀態(tài)管理模式靴拱。它采用集中式存儲(chǔ)管理應(yīng)用的所有組件狀態(tài),...
    GXW_Lyon閱讀 274評(píng)論 0 0
  • vuex 狀態(tài)管理器 作為應(yīng)用中所有組件的中央儲(chǔ)存 只能以預(yù)定的方式去操作狀態(tài) 把所有組件共享的狀態(tài)抽取出來作為全...
    一只大椰子閱讀 789評(píng)論 0 1
  • 學(xué)習(xí)目的 了解和熟練使用 VueX猾普,能夠在實(shí)際項(xiàng)目中運(yùn)用袜炕。 VueX介紹 Vuex 是一個(gè)專為 Vue.js ...
    _1633_閱讀 2,791評(píng)論 0 7
  • 概要 官方解釋Vuex是一個(gè)專為Vue.js 應(yīng)用程序開發(fā)的狀態(tài)管理模式。它采用集中式存儲(chǔ)管理應(yīng)用的所有組件的狀態(tài)...
    許小花花閱讀 449評(píng)論 0 0