Vuex 單狀態(tài)庫與多模塊狀態(tài)庫詳解
什么情況下使用vuex
Vuex 是一個(gè)專為 Vue.js 應(yīng)用程序開發(fā)的狀態(tài)管理模式。它采用集中式存儲管理應(yīng)用的所有組件的狀態(tài),如果您不打算開發(fā)大型單頁應(yīng)用,使用 Vuex 可能是繁瑣冗余的。如果您需要構(gòu)建是一個(gè)中大型單頁應(yīng)用,您很可能會(huì)考慮如何更好地在組件外部管理狀態(tài),Vuex 將會(huì)成為自然而然的選擇。
之前在做旅游頁的時(shí)候?qū)?Vuex 進(jìn)行了簡單的了解。近期在做 Vue 項(xiàng)目的同時(shí)重新學(xué)習(xí)了 Vuex 。本篇博文主要總結(jié)一下 Vuex 單狀態(tài)庫和多模塊 modules 的兩類使用場景。
本篇所有代碼是基于 Vue-Cli 3.x 版本的腳手架工具進(jìn)行編寫的。
vuex 單狀態(tài)庫 Demo
這是一個(gè)僅有單個(gè) Vuex store 狀態(tài)庫的 Demo。當(dāng)項(xiàng)目中使用一個(gè) Vuex 狀態(tài)庫就已經(jīng)足夠的時(shí)候,可以使用這種方式。
本 Demo 使用了一個(gè) increment 與 decrement 的 增 / 減 事件來體現(xiàn) store 數(shù)據(jù)的變化。
store.js
由于狀態(tài)庫是單一的,僅有一個(gè) store.js 文件管理狀態(tài)庫。在該文件中一開始進(jìn)行 import 的引入,然后使用 Vue.use(Vuex) 使用 Vuex,之后分別定義 state、mutations 和 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 的實(shí)例上。
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
在相應(yīng)的組件中如下引入并在 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
關(guān)于單狀態(tài)庫的 Demo 請參考此 github
vuex 多模塊狀態(tài)庫 Demo
當(dāng)項(xiàng)目變得非常龐大,單個(gè) store 無法滿足需求的時(shí)候,可以通過多模塊狀態(tài)庫管理多個(gè) store,將各類狀態(tài)分類進(jìn)行維護(hù)。
本 Demo 使用了 add 與 reduce 的 增 / 減 事件來體現(xiàn) store 數(shù)據(jù)的變化。
store
由于需要管理多個(gè) store,因此在項(xiàng)目目錄中創(chuàng)建 store 文件夾,并創(chuàng)建 modules 文件夾用來放置各個(gè) store文件,并使用 index.js 作為入口文件。具體結(jié)構(gòu)請查看 Demo。
main.js
同樣在 main.js 中通過 import 引入 store,但這里是引入 index.js 這個(gè)入口文件。
import Vue from 'vue' import App from './App.vue' import store from './store/index'
使用 $store
除了使用方式有一定不同之外,methods 中的 mapActions 也更換了書寫方式,第一個(gè)參數(shù)是對應(yīng) store 管理的數(shù)據(jù),第二個(gè)參數(shù)是關(guān)于操作事件的數(shù)組。
<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
關(guān)于多模塊狀態(tài)庫的 Demo 請參考此 github
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
解決ant design vue中樹形控件defaultExpandAll設(shè)置無效的問題
這篇文章主要介紹了解決ant design vue中樹形控件defaultExpandAll設(shè)置無效的問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-10-10
解決antd的Form組件setFieldsValue的警告問題
這篇文章主要介紹了解決antd的Form組件setFieldsValue的警告問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-10-10
使用keep-alive時(shí),數(shù)據(jù)無法刷新的問題及解決
這篇文章主要介紹了使用keep-alive時(shí),數(shù)據(jù)無法刷新的問題及解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07
Vue實(shí)現(xiàn)動(dòng)態(tài)路由的示例詳解
這篇文章主要為大家詳細(xì)介紹了Vue實(shí)現(xiàn)動(dòng)態(tài)路由的相關(guān)知識,主要涉及到兩個(gè)方面:一是路由的動(dòng)態(tài)添加,二是基于路由的參數(shù)變化來動(dòng)態(tài)渲染組件,下面就跟隨小編一起深入學(xué)習(xí)一下動(dòng)態(tài)路由的實(shí)現(xiàn)吧2024-02-02
vue如何給element-ui中的el-tabs動(dòng)態(tài)設(shè)置label屬性
這篇文章主要介紹了vue如何給element-ui中的el-tabs動(dòng)態(tài)設(shè)置label屬性,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08
vue中實(shí)現(xiàn)在外部調(diào)用methods的方法(推薦)
下面小編就為大家分享一篇vue中實(shí)現(xiàn)在外部調(diào)用methods的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-02-02
vue2?使用echarts實(shí)現(xiàn)地圖點(diǎn)擊進(jìn)入下一層級+點(diǎn)擊空白處回退功能
這篇文章主要介紹了vue2?使用echarts實(shí)現(xiàn)地圖點(diǎn)擊進(jìn)入下一層級+點(diǎn)擊空白處回退,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2024-05-05

