"Vuex 是一個專爲 Vue.js 應用程序開發的狀態管理模式。它採用集中式存儲管理應用的全部組件的狀態,並以相應的規則保證狀態以一種可預測的方式發生變化"。這句話是截取vuex官網上對vuex介紹的一句話,對於不少新手朋友,剛接觸vuex的時候,確定被它這麼多的專業詞彙搞得一臉懵逼,不知所云。那麼做爲新手該如何學習vuex呢,個人建議就是「理解」,用通俗易懂的話和比喻來講明vuex是個幹啥的,是個什麼東西。html
上面的前言,說了要用通俗易懂的話來介紹vuex,那麼該怎麼理解呢?個人理解就是,你把vuex當成一個項目頂層的全局對象來看待,有了這樣的認識,你在學習vuex確定會事半功倍的。vue
首先咱們要安裝:vuex
`npm
npm install vuex --save
複製代碼
`app
其次就是建立vuex,建立這一塊建議你們按照官方的文檔命名來,這樣作的目的嗎,顯而易見,你們都知道開發當中有一些潛在的規範,遵照這些規範就是爲了讓你們好理解,我這裏是幹嗎的。在這裏我就建議你們在項目裏單首創建一個store
的文件夾,並在裏面建立一個index.js
的文件吧,而後在index.js
裏引入vuex:異步
`函數
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(vuex);
// 這個是store文件夾下的index.js文件
export default new Vuex.Store({ // 導出這個對象
state: {
},
getters: {
},
mutations: {
},
actions: {
}
})
複製代碼
`工具
最後在main.js
的文件裏引入咱們剛建立的store
文件夾裏的index.js
文件:學習
`this
import Vue from 'vue';
import App from './App';
import router from './router';
import store from './store/index'; // 引入vuex
new Vue({
el: '#app',
router,
store, // 注入vuex
components: { App },
template: '<App/>'
})
複製代碼
`
到這一步,咱們的vuex就算是搭建完畢了,下面咱們就針對vuex裏的各個功能模塊進行探討,vuex下面有四個功能模塊state, getters, mutations, actions
,也就是四個子對象。
前面咱們說了vuex其實就是一個全局對象,而這個對象呢包含有四個子對象,子對象一:state
,state
是幹嗎的呢?,state
就是這個全局對象專門用來存儲數據的地方,也就是公共的數據源:
`
export default new Vuex.Store({
state: { // 這裏是存儲數據的地方,公共的數據源
animals: [{num: 1, animal: '老虎'}, {num: 2, animal: '獅子'},
{num: 3, animal: '大象'}]
}
})
複製代碼
`
那麼如何使用這個數據呢?使用很簡單,直接在vue裏的computed
對象裏書寫便可:
`
// 組建裏調用
<template>
<div>
<ul>
<li v-for="(item,index) in animals" :key="index">
<label>{{item.num}}</label>
<span>{{item.animal}}</span>
</li>
</ul>
</div>
</template>
// ...其餘代碼省略
computed: {
animals () {
return this.$store.state.animals;
}
}
複製代碼
`
注意:this.$store
就是咱們整個vuex實例,也就是咱們說的那個全局對象,state
就是存儲公共數據的容器。 這樣咱們就成功的使用到了vuex state
裏的數據了。
子對象二:getter
,它的功能和做用就相似於vue裏的computed
,也就是說vuex裏的計算屬性,vue裏的computed
是用來對數據進行額外操做的,vuex裏的getter
也是同樣的:
`
export default new Vuex.Store({
state: { // 這裏是存儲數據的地方,公共的數據源
animals: [{num: 1, animal: '老虎'}, {num: 2, animal: '獅子'},
{num: 3, animal: '大象'}]
},
getter: {
filterAnimal: state => { // 這是個方法
return state.animals.filter(item => {
return item.num > 1
})
}
}
})
複製代碼
`
注意:getter
裏面filterAnimal
是個方法,方法名字隨你本身定義,state
這個參數就是vuex存儲數據裏的state
,getter
裏全部的方法都默認傳入了該參數。 使用也是直接在vue裏的computed
對象裏書寫:
`
// 組建裏調用
<template>
<div>
<ul>
<li v-for="(item,index) in filterAnimal" :key="index">
<label>{{item.num}}</label>
<span>{{item.animal}}</span>
</li>
</ul>
</div>
</template>
// ...其餘代碼省略
computed: {
filterAnimal () {
return this.$store.getters.filterAnimal;
}
}
複製代碼
`
子對象三:mutations
,官網裏是這樣介紹的:「更改 Vuex 的 store 中的狀態的 惟一 方法是提交 mutation
」,在這段話裏面請你們注意那個「惟一」。這也就是說,對vuexstate
裏面的數據,你要想進行修改,必須經過mutations
方式才能夠,只有mutations
這個對象裏的方法才能夠修改state
裏的數據,也就是狀態:
`
export default new Vuex.Store({
state: { // 這裏是存儲數據的地方,公共的數據源
animals: [{num: 1, animal: '老虎'}, {num: 2, animal: '獅子'},
{num: 3, animal: '大象'}]
},
mutations: {
addAnimal (state, params) { // params是來自你調用這個方法時傳入的參數
state.animals.push(params)
}
}
})
複製代碼
`
注意:mutations
裏定義的方法能夠接收兩個參數,state
就是數據對象,params
就是調用時傳遞過來的數據
組建裏調用mutations
裏的方法,使用this.$store.commit()
觸發,參數一是你要觸發的mutations
裏的哪一個方法,參數二就是你要傳遞過去的數據: `
// 組建裏調用
<template>
<div>
<button @click="addAnimal()">增長動物</button>
<ul>
<li v-for="(item,index) in filterAnimal" :key="index">
<label>{{item.num}}</label>
<span>{{item.animal}}</span>
</li>
</ul>
</div>
</template>
// ...其餘代碼省略
methods: {
addAnimal () {
let animal = {num: 4, animal: '熊貓'}
this.$store.commit('addAnimal', animal);
}
}
複製代碼
`
mutations
操做注意事項:mutations
屬於同步操做,因此你在操做時請記得提早聲明好你要操做的數據,也就是state
裏的數據。
子對象四:actions
相似於mutations
,actions
的不一樣點有兩點:
action
提交的是 mutation
,而不是直接變動狀態;action
能夠包含任意異步操做;你們請記住上面這兩點,上面介紹mutations
時說過,要想改變state
裏面的數據,惟一的方法就是經過mutations
,因此action
這裏也是經過mutation
: `
export default new Vuex.Store({
state: { // 這裏是存儲數據的地方,公共的數據源
animals: []
},
mutations: {
initAnimal (state, params) { // 初始化state裏animals數據
state.animals = params;
}
},
actions: {
initAnimals (context) {
return new Promise((resolve, reject) => {
let animals = [{num: 1, animal: '老虎'}, {num: 2, animal: '獅子'},
{num: 3, animal: '大象'}]
context.commit('initAnimal', animals); //調用mutations裏的方法
resolve(animals);
})
}
}
})
複製代碼
`
組建裏面調用,使用vuex裏的this.$store.dispatch()
方法執行,上面例子中的Promise
並無實際意義,只是爲了演示特地寫出來的,你方法體裏直接寫context.commit()
也是能夠的:
`
// 組建裏調用
// ...其餘代碼省略
created() {
this.$store.dispatch('initAnimals');
}
複製代碼
` 在本示例中,調用是在組建生命週期鉤子函數裏調用,具體在什麼地方調用,根據實際的業務需求去實現便可。
mapState、mapGetters、mapActions
這三個是vuex裏簡化調用而提供的方法,你若是須要使用,須要在你使用的組建單獨引入這三個方法:
`
// 組建裏調用
<template>
<div>
<ul>
<li v-for="(item,index) in animals" :key="index">
<label>{{item.num}}</label>
<span>{{item.animal}}</span>
</li>
</ul>
</div>
</template>
// ...其餘代碼省略
import {mapState, mapGetters, mapActions} from 'vuex';
computed: {
// 使用擴展運算符
...mapState({
animals:state => state.animals
}),
}
複製代碼
`
這裏暫且只示例mapState
了,其餘留給你們本身嘗試,稍微說明應用的地方,mapGetters
通常也是在computed
裏調用,mapActions
通常是在methods
的方法裏調用。
看完上面的內容,其實你們已經會使用vuex了,那麼這個Module
是幹嗎的呢,上面咱們說過,vuex是老頂層的全局對象,若是全部的數據狀態若是都寫在這個index的文件裏面,代碼體會愈來愈大,因此,vuex容許咱們把store
分割成各自獨立的模塊,每一個獨立模塊都有本身的state, getters, mutations, actions
,注意哦,分割出去的各個模塊,他們的state
裏的數據都是獨立,各自是各自的。:
`
import Vue from 'vue';
import Vuex from 'vuex';
import module1 from './modules/module1';
import module2 from './modules/module2';
// 這個是vuex的主模塊,也就是index.js這個文件
export default new Vuex.Store({
state,
mutations,
actions,
modules: {
module1,
module2
}
複製代碼
}) `
獨立出去的模塊使用import
引入進來,在主模塊裏在modules
裏注入便可。
在本篇文章的思路里,是以全局對象的思惟方式來學習vuex,其目的也是爲了讓你們更快速的理解和認識vuex,那麼vuex是否就是全局對象呢,在vuex的官方文檔裏就已經給出了答案和解釋:
vuex的主要應用就是對多組建或者多頁面使用同一個數據源,也就是說共用同一個數據,當咱們在某一個組建改變這個數據的某一個狀態或者值時,相應的也讓其餘組建和頁面發生相同的變化。 最後也把vuex官網的連接貼在這裏,你們看完後能夠在去官網查看實際API。