Vuex 經過 store 選項,提供了一種機制將狀態從根組件「注入」到每個子組件中(需調用 Vue.use(Vuex)):經過在根實例中註冊 store 選項,該 store 實例會注入到根組件下的全部子組件中,且子組件能經過 this.$store 訪問到
computed: { f1() { return this.$store.state.xxxx } }, watch: { f1(curVal, oldVal) { //這裏的curVal就是須要監聽的值 } }
computed 裏通常寫個函數,這個函數裏必定是return一個結果。 這裏你能夠直接用f1做爲本組件監聽$store.state.xxxx, 也能夠在本組件裏聲明一個變量而後再經過watch監聽,將watch中的curVal賦值給該變量從而達到使用的目的。
當一個組件須要獲取多個狀態時候,將這些狀態都聲明爲計算屬性會有些重複和冗餘。爲了解決這個問題,咱們可使用 mapState 輔助函數幫助咱們生成計算屬性,讓你少按幾回鍵:vue
// 在單獨構建的版本中輔助函數爲 Vuex.mapStatevuex
import { mapState } from 'vuex' export default { // ... computed: mapState({ // 箭頭函數可以使代碼更簡練 count: state => state.count, // 傳字符串參數 'count' 等同於 `state => state.count` countAlias: 'count', // 爲了可以使用 `this` 獲取局部狀態,必須使用常規函數 countPlusLocalState (state) { return state.count + this.localCount } }) }
當映射的計算屬性的名稱與 state 的子節點名稱相同時,咱們也能夠給 mapState 傳一個字符串數組。數組
computed: mapState([ // 映射 this.count 爲 store.state.count 'count' ])
對象展開運算符
mapState 函數返回的是一個對象。咱們如何將它與局部計算屬性混合使用呢?一般,咱們須要使用一個工具函數將多個對象合併爲一個,以使咱們能夠將最終對象傳給 computed 屬性。可是自從有了對象展開運算符(現處於 ECMAScript 提案 stage-4 階段),咱們能夠極大地簡化寫法:函數
computed: { localComputed () { /* ... */ }, // 使用對象展開運算符將此對象混入到外部對象中 ...mapState({ // ... }) }