這篇文章帶給大家的內容是關於Vue.js狀態管理模式Vuex的安裝與使用(程式碼範例),有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。
uex 是專為 Vue.js 應用程式開發的狀態管理模式。它採用集中式儲存管理應用的所有元件的狀態,並以相應的規則保證狀態以一種可預測的方式變更。
首先我們在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
從store 實例中讀取狀態最簡單的方法就是在計算屬性中傳回某個狀態:
// 创建一个 Counter 组件 const Counter = { template: `<p>{{ count }}</p>`, computed: { count () { return this.$store.state.count } } }
當一個元件需要取得多個狀態時候,將這些狀態都宣告為計算屬性會有些重複和冗餘。為了解決這個問題,我們可以使用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' ])
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 輔助函數只是將store 中的getter 對應到局部計算屬性:
import { mapGetters } from 'vuex' export default { // ... computed: { // 使用对象展开运算符将 getter 混入 computed 对象中 ...mapGetters([ 'doneTodosCount', 'anotherGetter', // ... ]) } }
如果你想將一個getter 屬性另取一個名字,使用物件形式:
mapGetters({ // 把 `this.doneCount` 映射为 `this.$store.getters.doneTodosCount` doneCount: 'doneTodosCount' })
更改Vuex 的store 中的狀態的唯一方法是提交mutation。
註冊:
const store = new Vuex.Store({ state: { count: 1 }, mutations: { increment (state) { // 变更状态 state.count++ } } })
呼叫:
store.commit('increment')
你可以向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 類似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的安裝與使用(程式碼範例)的詳細內容。更多資訊請關注PHP中文網其他相關文章!