Vuex是一個專爲vue.js應用程序開發的狀態管理庫。它採用集中式存儲管理應用的全部組件的狀態,並以相應的規則保證狀態以一種可預測的方式發生變化。vue
經過定義和隔離狀態管理中的各類概念並經過強制規則維持視圖和狀態間的獨立性,咱們的代碼將會變得更結構化且易維護,這就是 Vuex 背後的基本思想。vue-router
安裝Vuex依賴包 npm install vuex --savevuex
在項目中引入Vuex。在src目錄下,新建一個store文件夾,用來存放vuex相關文件。npm
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
const store = new Vuex.Store()
export default store
複製代碼
4. 在main.js裏面引入store,進行全局注入
import Vue from 'vue'
import App from './App'
import router from './router'
import store from './store/store'
Vue.config.productionTip = false
/* eslint-disable no-new */
new Vue({
el: '#app',
router,
store, // 使用store
components: { App },
template: '<App/>'
})
複製代碼
state是單一狀態樹,用一個對象就包含了所有的應用層級狀態。單一狀態樹讓咱們可以直接地定位任一特定的狀態片斷,在調試的過程當中也能輕易地取得整個當前應用狀態的快照。緩存
const state = {
num: 0
}
export default state
複製代碼
更改vuex的store中的狀態的惟一方法是提交mutation。vuex中的mutation很是相似於事件:每一個mutation都有一個字符串的事件類型(type)和一個回調函數(handler)。這個回調函數就是咱們實際進行狀態更改的地方,而且它會接受 state 做爲第一個參數。bash
import state from './state'
const mutations = {
addNum () {
state.num++
}
}
export default mutations
複製代碼
vuex容許咱們在store中定義「getter」(能夠認爲是store的計算屬性)。就像計算屬性同樣,getter的返回值會根據它的依賴被緩存起來,且只有當它的依賴值發生了改變纔會被從新計算app
import state from './state'
const getters = {
getNum () {
return state.num
}
}
export default getters
複製代碼
Action相似於mutation,不一樣在於:Action提交的是mutation,而不是直接變動狀態。Action 能夠包含任意異步操做。Action函數接受一個與store實例具備相同方法和屬性的context對象,所以你能夠調用context.commit提交一個 mutation,或者經過context.state和context.getters來獲取state和getters。異步
const actions = {
addNumAction (context, num) {
context.commit('addNum', num)
}
}
export default actions
複製代碼
import Vue from 'vue'
import Vuex from 'vuex'
import state from './state'
import mutations from './mutations'
import getters from './getters'
import actions from './actions'
Vue.use(Vuex)
const store = new Vuex.Store({
state,
mutations,
getters,
actions
})
export default store
複製代碼
在src文件夾下新建views文件夾,在views文件夾下新建vuex文件夾,並在vuex文件夾新建index.vue文件函數
index.vue文件的內容post
<template>
<div class="app">
<p>{{ num }}</p>
<button @click="addNumAction">+ADD</button>
</div>
</template>
<script>
import { mapActions, mapState, mapGetters } from 'vuex'
export default {
data () {
return {
}
},
computed: {
...mapState([
'num'
])
},
methods: {
...mapActions([
'addNumAction'
]),
...mapGetters([
'getNum'
])
}
}
</script>
複製代碼
import Vue from 'vue'
import Router from 'vue-router'
import VueX from '@/views/vuex/index'
Vue.use(Router)
export default new Router({
routes: [
{
path: '/vuex',
name: 'vuex',
component: VueX
}
]
})複製代碼
最終效果