我的理解 就是單頁應用中 多個組件之間 共享數據的 狀態機通用管理機制。有點相似於java中的觀察者模式,在android中相似的有eventbus。中大型應用應該都會用到。html
若是你跟我同樣是有移動開發經驗的前端新人,那麼最好仍是學習一下這個東西,之後遇到相似問題就能夠直接哪來用了。前端
固然了,不要濫用vuex,能用參數傳遞的,仍是儘可能參數傳遞vue
好比說 咱們先在compa 中 對一個數據 進行加操做,而後再另一個comb中 就能夠拿到 加加之後的值。 聽起來有一點像java中的單例。 在vuex 中 咱們來實現一下java
首先,咱們來看下簡單的目錄結構:android
而後看下store.jsvuex
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
//要共享的數據
const state = {
count: 1
}
//對共享數據的操做
const mutations = {
add(state) {
state.count++
},
reduce(state) {
state.count--
}
}
//把這個狀態 暴露出去 也就是 數據 和對應數據的操做
export default new Vuex.Store({
state, mutations
})
複製代碼
看看咱們的Count.vue 怎麼對 共享數據進行操做bash
<template>
<div>
<h2>{{msg}}</h2>
<hr>
<h3>{{$store.state.count}}</h3>
<p>
<button v-on:click="$store.commit('add')">+</button>
<button v-on:click="$store.commit('reduce')">-</button>
</p>
</div>
</template>
<script>
import store from "@/vuex/store";
export default {
data() {
return {
msg:'hello vuex'
};
},
store
};
</script>
複製代碼
注意這裏點擊事件的寫法。異步
最後看看觀察者,其實觀察者沒啥好說的,最好寫了。ide
<template>
<div>
<h2>{{msg}}</h2>
<hr>
<h3>{{$store.state.count}}</h3>
</div>
</template>
<script>
import store from "@/vuex/store";
export default {
data() {
return {
msg:'hello vuex 觀察者'
};
},
store
};
</script>
複製代碼
至此,咱們就能夠完成 在count頁面中操做數據 可是其餘頁面也能夠接收到數據的變化通知 這個功能了。模塊化
state 其實就是狀態對象,mutations 就是對狀態對象操做的方法。
來看看上面的例子的缺陷:
換種寫法:
再換一種:
再來一種最簡單的方法:
先來看一下 若是咱們對狀態對象的操做方法裏面 要傳遞參數 應該怎麼作
先定義一下這個函數:
而後看一下 咱們怎麼調用他
<button v-on:click="$store.commit('addN',5)">一次性加5</button>
複製代碼
最後看看咱們調用方法的簡寫 應該怎麼寫
這個地方其實就是一個過濾器的做用,舉個例子,咱們有一組銷售的數據。 可是我取的時候 我想取最近100天銷售的數據 那我確定要對源數據處理之後生成新的數據(不修改源數據的狀況下) 再返回。
舉個例子
定義getters
使用它
最後看一下效果
最後提一下,對於java技術棧的同窗來講,必定不要在 任何屬性裏的get方法中加入特殊的邏輯
前面提到的mutation也能夠修改狀態,只不過他是同步的,而action是異步的。
//通常而言 咱們能夠在actions對象中 處理一些要異步處理的操做
const actions = {
//上下文對象
addAction(context) {
context.commit('add', 10)
setTimeout(() => {
context.commit('reduce')
}, 5000)
},
reduceAction({ commit }) {
commit('reduce')
}
}
複製代碼
而後看一下調用方:
我的以爲 這個module 只有大型項目會用,通常小團隊用這個反而增長複雜度。這裏就知道有這麼個東西便可。 講白了這個東西仍是偏向工程性質的多一點,而不是功能性的。 適用於大項目 進行模塊化開發的。
定義module
使用module
想要簡寫方法也能夠
若是你對module 感興趣,能夠參閱module官方文檔