vue2.0學(xué)習(xí)02之vuex

上次學(xué)習(xí)了vue-router的使用拓劝,讓我能夠在各個(gè)頁(yè)面間切換底循,將頁(yè)面搭建了起來(lái)仿滔。這次則要學(xué)習(xí)vue的狀態(tài)管理模式——vuex惠毁。

:本文只是個(gè)人對(duì)vuex學(xué)習(xí)的一些理解,要深刻掌握還需要認(rèn)真查閱官方文檔崎页。

一鞠绰、基本介紹

Vuex 是一個(gè)專為 Vue.js 的SPA單頁(yè)組件化應(yīng)用程序開發(fā)的狀態(tài)管理模式插件。
由于Vue SPA應(yīng)用的模塊化飒焦,每個(gè)組件都有它各自的數(shù)據(jù)(state)蜈膨、界面(view)、和方法(actions)牺荠。這些數(shù)據(jù)翁巍、界面和方法分布在各個(gè)組件中,當(dāng)項(xiàng)目?jī)?nèi)容變得越來(lái)越多時(shí)休雌,每個(gè)組件中的狀態(tài)會(huì)變得很難管理灶壶。這是vuex就派上用場(chǎng)啦~下面我們看一個(gè)簡(jiǎn)單的vuex例子。

1. 單個(gè)組件中的狀態(tài)

假如只是在單個(gè)組件中要改變界面view很簡(jiǎn)單杈曲,只需要改變state數(shù)據(jù)源即可驰凛。如下代碼:

<template>
    <div>
      view: {{ count }}
      <button @click="increment">increment</button>
    </div>
</template>

<script>
export default {
  // state
  data () {
    return {
      count: 0
    }
  },
  // actions
  methods: {
    increment () {
      this.count++
    }
  }
}
</script>

所以,單個(gè)組件中的原理圖是這樣的:

image.png

2. 多個(gè)組件中的狀態(tài)

然而担扑,我們作為組件化的SPA應(yīng)用洒嗤,必定會(huì)牽扯到多個(gè)組件間的通信。
比如有兩個(gè)相同的組件A和B魁亦,它們共享一個(gè)數(shù)據(jù)count渔隶,并且都有一個(gè)方法可以操作這個(gè)count,我們使用vuex來(lái)寫洁奈。
A組件和B組件的代碼(代碼相同)

<template>
  <div>
    {{ $store.state.count }}
    <button @click="increment">increment</button>
  </div>
</template>

<script>
  export default {
    methods: {
      increment () {
        this.$store.commit('increment')
      }
    }
  }
</script>

image.png
image.png

可以看到间唉,這里的兩個(gè)increment按鈕點(diǎn)擊都會(huì)同時(shí)改變兩個(gè)count的數(shù)據(jù),因?yàn)閿?shù)據(jù)源count和方法increment都是全局的呈野。
正如下面官方原理圖所畫的印叁,我們把全局?jǐn)?shù)據(jù)源state、改變數(shù)據(jù)源的方法mutations昨悼、異步操作方法actions都放提取出來(lái)放到store中率触,實(shí)現(xiàn)全局?jǐn)?shù)據(jù)狀態(tài)單獨(dú)管理的功能。

image.png

二、安裝&配置

1. 安裝vuex

使用npm安裝并保存到package.json中:

npm install vuex --save

package.json

  "devDependencies": {
    ...
    "vuex": "^2.1.1",
    ...
  },

2. 配置

配置方式和路由的配置方式差不多

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)
//創(chuàng)建Store實(shí)例
const store = new Vuex.Store({
  // 存儲(chǔ)狀態(tài)值
  state: {
    ...
  },
  // 狀態(tài)值的改變方法,操作狀態(tài)值
  // 提交mutations是更改Vuex狀態(tài)的唯一方法
  mutations: {
    ...
  },
  // 在store中定義getters(可以認(rèn)為是store的計(jì)算屬性)皂甘。Getters接收state作為其第一個(gè)函數(shù)
  getters: {
    ...
  },
  actions: { 
    ...
  }
})
// 要改變狀態(tài)值只能通過(guò)提交mutations來(lái)完成

/* eslint-disable no-new */
new Vue({
  el: '#app',
  template: '<App/>',
  components: { App },
  // 將store實(shí)例注入到根組件下的所有子組件中
  store
  // 子組件通過(guò)this.$store來(lái)方位store
})

三叮贩、核心概念

1. state

state就是全局的狀態(tài)(數(shù)據(jù)源)佛析,我們可以用以下方式在Vue 組件中獲得Vuex的state狀態(tài)
template

  <div>
    {{ $store.state.count }}
  </div>

script

console.log(this.$store.state.count)

2. getters

getters其實(shí)可以認(rèn)為是 store 的計(jì)算屬性寸莫,用法和計(jì)算屬性差不多档冬。
定義getter:

  getters: {
    done(state) {
      return state.count + 5;
    },
  }

使用getter

console.log(this.$store.getters.done)

3. mutations

mutations是操作state的唯一方法,即只有mutations方法能夠改變state狀態(tài)值披坏。

3.1 基本操作

mutations對(duì)state的操作

const store = new Vuex.Store({
  state: {
    count: 1
  },
  mutations: {
    increment (state) {
      // 變更狀態(tài)
      state.count++
    }
  }
})

組件通過(guò)commit提交mutations的方式來(lái)請(qǐng)求改變state

this.$store.commit('increment')

這樣的好處是我們可以跟蹤到每一次state的變化盐数,以便及時(shí)分析和解決問(wèn)題。

3.2 提交載荷(Payload)

mutations方法中是可以傳參的帚屉,具體用法如下:

  mutations: {
    // 提交載荷 Payload
    add(state, n) {
      state.count += n
    }
  },

this.$store.commit('add', 10)

這里只是傳了一個(gè)數(shù)字漾峡,在大多數(shù)情況下,載荷應(yīng)該是一個(gè)對(duì)象牢屋,這樣可以包含多個(gè)字段并且記錄的 mutation 會(huì)更易讀烙无。

3.3 注意

mutations方法必須是同步方法皱炉!

4. actions

4.1 基本操作

之前說(shuō)mutations方法必須只能是同步方法,為了處理異步方法多搀,actions出現(xiàn)了康铭。關(guān)于action和mutations的區(qū)別有以下幾點(diǎn):

  • Action 提交的是 mutation赌髓,而不是直接變更狀態(tài)调衰。
  • Action 可以包含任意異步操作拇泛。
  • Action 還是得通過(guò) mutation 方法來(lái)修改state
    同樣是之前的increment方法,我們分別用同步和異步的action來(lái)驗(yàn)證上面所說(shuō)的與mutations的不同之處:
  actions: {
    increment (context) {
      context.commit('increment')
    },
    incrementAsync (context) {
      // 延時(shí)1秒  
      setTimeout(() => {
        context.commit('increment')
      }, 1000)
    }
  },

不同于mutations使用commit方法悯搔,actions使用dispatch方法舌仍。

this.$store.dispatch('incrementAsync')

4.2 context

context是與 store 實(shí)例具有相同方法和屬性的對(duì)象妒貌。可以通過(guò)context.statecontext.getters來(lái)獲取 state 和 getters。

4.3 以載荷形式分發(fā)

    incrementAsyncWithValue (context, value) {
      setTimeout(() => {
        context.commit('add', value)
      }, 1000)
    }

this.$store.dispatch('incrementAsyncWithValue', 5)

5. module

使用單一狀態(tài)樹铸豁,導(dǎo)致應(yīng)用的所有狀態(tài)集中到一個(gè)很大的對(duì)象。但是节芥,當(dāng)應(yīng)用變得很大時(shí)在刺,store 對(duì)象會(huì)變得臃腫不堪头镊。
為了解決以上問(wèn)題增炭,Vuex 允許我們將 store 分割到模塊(module)。每個(gè)模塊擁有自己的 state拧晕、mutation、action厂捞、getters输玷、甚至是嵌套子模塊——從上至下進(jìn)行類似的分割:

const moduleA = {
  state: { ... },
  mutations: { ... },
  actions: { ... },
  getters: { ... }
}

const moduleB = {
  state: { ... },
  mutations: { ... },
  actions: { ... }
}

const store = new Vuex.Store({
  modules: {
    a: moduleA,
    b: moduleB
  }
})

store.state.a // -> moduleA 的狀態(tài)
store.state.b // -> moduleB 的狀態(tài)

module其實(shí)還是對(duì)于大型的SPA應(yīng)用來(lái)說(shuō)的队丝,暫時(shí)對(duì)module的應(yīng)用和理解并沒有太多欲鹏,之后會(huì)補(bǔ)上這一塊兒的內(nèi)容机久。
想要了解更多module知識(shí),請(qǐng)查閱官方module文檔

作者:VioletJack
鏈接:http://www.reibang.com/p/d6f7e11f18af
來(lái)源:簡(jiǎn)書
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán)尤误,非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末尤勋,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌暖哨,老刑警劉巖赌朋,帶你破解...
    沈念sama閱讀 216,692評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異鹿蜀,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)服球,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門茴恰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人斩熊,你說(shuō)我怎么就攤上這事往枣。” “怎么了粉渠?”我有些...
    開封第一講書人閱讀 162,995評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵分冈,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我霸株,道長(zhǎng)雕沉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,223評(píng)論 1 292
  • 正文 為了忘掉前任去件,我火速辦了婚禮坡椒,結(jié)果婚禮上扰路,老公的妹妹穿的比我還像新娘。我一直安慰自己倔叼,他們只是感情好汗唱,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,245評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著丈攒,像睡著了一般哩罪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上巡验,一...
    開封第一講書人閱讀 51,208評(píng)論 1 299
  • 那天际插,我揣著相機(jī)與錄音,去河邊找鬼深碱。 笑死腹鹉,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的敷硅。 我是一名探鬼主播功咒,決...
    沈念sama閱讀 40,091評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼绞蹦!你這毒婦竟也來(lái)了力奋?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,929評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤幽七,失蹤者是張志新(化名)和其女友劉穎景殷,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體澡屡,經(jīng)...
    沈念sama閱讀 45,346評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡猿挚,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,570評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了驶鹉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片绩蜻。...
    茶點(diǎn)故事閱讀 39,739評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖室埋,靈堂內(nèi)的尸體忽然破棺而出办绝,到底是詐尸還是另有隱情,我是刑警寧澤姚淆,帶...
    沈念sama閱讀 35,437評(píng)論 5 344
  • 正文 年R本政府宣布孕蝉,位于F島的核電站,受9級(jí)特大地震影響腌逢,放射性物質(zhì)發(fā)生泄漏降淮。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,037評(píng)論 3 326
  • 文/蒙蒙 一搏讶、第九天 我趴在偏房一處隱蔽的房頂上張望骤肛。 院中可真熱鬧纳本,春花似錦、人聲如沸腋颠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)淑玫。三九已至巾腕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間絮蒿,已是汗流浹背尊搬。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留土涝,地道東北人佛寿。 一個(gè)月前我還...
    沈念sama閱讀 47,760評(píng)論 2 369
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像但壮,于是被迫代替她去往敵國(guó)和親冀泻。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,647評(píng)論 2 354

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

  • 上一章總結(jié)了 Vuex 的框架原理蜡饵,這一章我們將從 Vuex 的入口文件開始弹渔,分步驟閱讀和解析源碼。由于 Vuex...
    你的肖同學(xué)閱讀 1,786評(píng)論 3 16
  • 安裝 npm npm install vuex --save 在一個(gè)模塊化的打包系統(tǒng)中溯祸,您必須顯式地通過(guò)Vue.u...
    蕭玄辭閱讀 2,934評(píng)論 0 7
  • vuex 場(chǎng)景重現(xiàn):一個(gè)用戶在注冊(cè)頁(yè)面注冊(cè)了手機(jī)號(hào)碼肢专,跳轉(zhuǎn)到登錄頁(yè)面也想拿到這個(gè)手機(jī)號(hào)碼,你可以通過(guò)vue的組件化...
    sunny519111閱讀 8,015評(píng)論 4 111
  • Vuex 是一個(gè)專為 Vue.js 應(yīng)用程序開發(fā)的狀態(tài)管理模式焦辅。它采用集中式存儲(chǔ)管理應(yīng)用的所有組件的狀態(tài)博杖,并以相應(yīng)...
    白水螺絲閱讀 4,667評(píng)論 7 61
  • Vuex 是一個(gè)專為 Vue 服務(wù),用于管理頁(yè)面數(shù)據(jù)狀態(tài)筷登、提供統(tǒng)一數(shù)據(jù)操作的生態(tài)系統(tǒng)剃根。它專注于 MVC 模式中的 ...
    你的肖同學(xué)閱讀 2,137評(píng)論 7 35