Vuex 單狀態庫 與 多模塊狀態庫


之前對 Vuex 進行了簡單的了解。近期在做 Vue 項目的同時重新學習了 Vuex 。本篇博文主要總結一下 Vuex 單狀態庫和多模塊 modules 的兩類使用場景。

本篇所有代碼是基於 Vue-Cli 3.x 版本的腳手架工具進行編寫的。

 

vuex 單狀態庫 Demo

這是一個僅有單個 Vuex store 狀態庫的 Demo。當項目中使用一個 Vuex 狀態庫就已經足夠的時候,可以使用這種方式。

本 Demo 使用了一個 increment 與 decrement 的 增 / 減 事件來體現 store 數據的變化。

 

store.js

由於狀態庫是單一的,僅有一個 store.js 文件管理狀態庫。在該文件中一開始進行 import 的引入,然后使用 Vue.use(Vuex) 使用 Vuex,之后分別定義 statemutations 和 actions,並通過 export default new Vuex.Store({state, mutations, actions}) 模塊化。

// store.js
import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

const state = {
  count: 1
}

const mutations = {
  increment(state) {
    state.count ++
  },
  decrement(state) {
    state.count --
  }
}

const actions = {
  increment:({commit}) => {
    commit('increment')
  },
  decrement:({commit}) => {
    commit('decrement')
  }
}

export default new Vuex.Store({state, mutations, actions})

 

main.js

在入口文件 main.js 中通過 import 引入 store,並注冊到 Vue 的實例上。

import Vue from 'vue'
import App from './App.vue'
import store from './store'

// Vue-Cli 3.x
new Vue({
  render: h => h(App),
  router,
  store
}).$mount('#app')

// Vue-Cli 2.x
// new Vue({
//   el: '#app',
//   router,
//   store,
//   components: { App },
//   template: '<App/>'
// })

 

使用 $store

在相應的組件中如下引入並在 methods 中使用 mapActions

<template>
  <div class="vuex">
    Vuex 全局 Store count {{$store.state.count}}
    <button type="button" name="button" @click="increment"></button>
    <button type="button" name="button" @click="decrement"></button>
  </div>
</template>

<script>
import { mapActions } from 'vuex'
export default {
  methods: mapActions([
    'increment',
    'decrement'
  ])
}
</script>

<style scoped>

</style>

 

Demo

關於單狀態庫的 Demo 請參考此 github
Github Demo

 

vuex 多模塊狀態庫 Demo

當項目變得非常龐大,單個 store 無法滿足需求的時候,可以通過多模塊狀態庫管理多個 store,將各類狀態分類進行維護。

本 Demo 使用了 add 與 reduce 的 增 / 減 事件來體現 store 數據的變化。

 

store

由於需要管理多個 store,因此在項目目錄中創建 store 文件夾,並創建 modules 文件夾用來放置各個 store文件,並使用 index.js 作為入口文件。具體結構請查看 Demo

 

main.js

同樣在 main.js 中通過 import 引入 store,但這里是引入 index.js 這個入口文件。

import Vue from 'vue'
import App from './App.vue'
import store from './store/index'

 

使用 $store

除了使用方式有一定不同之外,methods 中的 mapActions 也更換了書寫方式,第一個參數是對應 store 管理的數據,第二個參數是關於操作事件的數組。

<template lang="html">
  <div class="a">
    page a  {{$store.state.countA.countA}}

    <button type="button" name="button" @click="add">增加</button>
    <button type="button" name="button" @click="reduce">刪減</button>
  </div>
</template>

<script>
import { mapActions } from 'vuex'
export default {
  methods: mapActions('countA',['add','reduce'])
}
</script>

<style lang="css">
</style>

 

Demo

關於多模塊狀態庫的 Demo 請參考此 github
Github Demo


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM