首頁  >  文章  >  web前端  >  Vue.js狀態管理模式Vuex的安裝與使用(程式碼範例)

Vue.js狀態管理模式Vuex的安裝與使用(程式碼範例)

不言
不言原創
2018-09-01 16:44:021801瀏覽

這篇文章帶給大家的內容是關於Vue.js狀態管理模式Vuex的安裝與使用(程式碼範例),有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。

Vue.js狀態管理模式Vuex的安裝與使用(程式碼範例)

uex 是專為 Vue.js 應用程式開發的狀態管理模式。它採用集中式儲存管理應用的所有元件的狀態,並以相應的規則保證狀態以一種可預測的方式變更。

安裝、使用vuex

首先我們在vue.js 2.0 開發環境中安裝vuex :

npm install vuex --save

然後, 在main.js 中加入:

import vuex from 'vuex'
Vue.use(vuex);
const store = new vuex.Store({//store对象
    state:{
        show:false,
        count:0
    }
})

再然後, 在實例化Vue物件時加入store 物件:

new Vue({
  el: '#app',
  router,
  store,//使用store
  template: '<app></app>',
  components: { App }
})

現在,你可以透過store.state 來取得狀態對象,以及透過store.commit 方法觸發狀態變更:

store.commit('increment')

console.log(store.state.count) // -> 1

State

在Vue 元件中獲得Vuex 狀態

從store 實例中讀取狀態最簡單的方法就是在計算屬性中傳回某個狀態:

// 创建一个 Counter 组件
const Counter = {
  template: `<p>{{ count }}</p>`,
  computed: {
    count () {
      return this.$store.state.count
    }
  }
}

mapState 輔助函數

當一個元件需要取得多個狀態時候,將這些狀態都宣告為計算屬性會有些重複和冗餘。為了解決這個問題,我們可以使用mapState 輔助函數來幫助我們產生計算屬性:

// 在单独构建的版本中辅助函数为 Vuex.mapState
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'
])

Getter

getters 和vue 中的computed 類似, 都是用來計算state 然後產生新的資料( 狀態) 的,就像計算屬性一樣,getter 的回傳值會根據它的依賴被緩存起來,並且只有當它的依賴值發生了改變才會被重新計算。

Getter 接受state 作為其第一個參數:

const store = new Vuex.Store({
  state: {
    todos: [
      { id: 1, text: '...', done: true },
      { id: 2, text: '...', done: false }
    ]
  },
  getters: {
    doneTodos: state => {
      return state.todos.filter(todo => todo.done)
    }
  }
})

透過屬性存取

Getter 會暴露為store.getters 對象,你可以以屬性的形式存取這些值:

store.getters.doneTodos // -> [{ id: 1, text: '...', done: true }]

Getter 也可以接受其他getter 作為第二個參數:

getters: {
  // ...
  doneTodosCount: (state, getters) => {
    return getters.doneTodos.length
  }
}

store.getters.doneTodosCount // -> 1

元件中使用:

computed: {
  doneTodosCount () {
    return this.$store.getters.doneTodosCount
  }
}

注意,getter 在透過屬性存取時是作為Vue 的響應式系統的一部分快取其中的。

透過方法存取

透過方法存取

你也可以讓 getter 回傳一個函數,來實作給 getter 傳參。在你對 store 裡的陣列進行查詢時非常有用:

getters: {
  // ...
  getTodoById: (state) => (id) => {
    return state.todos.find(todo => todo.id === id)
  }
}
store.getters.getTodoById(2) // -> { id: 2, text: '...', done: false }

注意,getter 在透過方法存取時,每次都會去進行調用,而不會快取結果。

mapGetters 輔助函數

mapGetters 輔助函數只是將store 中的getter 對應到局部計算屬性:

import { mapGetters } from 'vuex'

export default {
  // ...
  computed: {
  // 使用对象展开运算符将 getter 混入 computed 对象中
    ...mapGetters([
      'doneTodosCount',
      'anotherGetter',
      // ...
    ])
  }
}

如果你想將一個getter 屬性另取一個名字,使用物件形式:

mapGetters({
  // 把 `this.doneCount` 映射为 `this.$store.getters.doneTodosCount`
  doneCount: 'doneTodosCount'
})

Mutation

更改Vuex 的store 中的狀態的唯一方法是提交mutation。

註冊:

const store = new Vuex.Store({
  state: {
    count: 1
  },
  mutations: {
    increment (state) {
      // 变更状态
      state.count++
    }
  }
})

呼叫:

store.commit('increment')

提交負載(Payload)

你可以向store.commit 傳入額外的參數,即mutation 的載重(payload):

// ...
mutations: {
  increment (state, n) {
    state.count += n
  }
}
store.commit('increment', 10)

如果提交多個參數,必須使用物件的形式進行提交

// ...
mutations: {
  increment (state, payload) {
    state.count += payload.amount
  }
}
store.commit('increment', {
  amount: 10
})

註:mutations裡的操作必須是同步的;

Action

Action 類似mutation,不同在於:

  • Action 提交的是mutation,而不是直接變更狀態。

  • Action 可以包含任意非同步操作。

const store = new Vuex.Store({
  state: {
    count: 0
  },
  mutations: {
    increment (state) {
      state.count++
    }
  },
  actions: {
    increment (context) {
      context.commit('increment')
    }
  }
})

Action 透過store.dispatch 方法觸發:

store.dispatch('increment')

在action 內部執行非同步操作:

actions: {
  incrementAsync ({ commit }) {
    setTimeout(() => {
      commit('increment')
    }, 1000)
  }
}

物件形式傳參:

// 以载荷形式分发
store.dispatch('incrementAsync', {
  amount: 10
})

相關推薦:

Vue.js之vuex(狀態管理)

##Vuex狀態管理應如何使用

#關於Vuex的全家桶狀態管理#

以上是Vue.js狀態管理模式Vuex的安裝與使用(程式碼範例)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn