在vue中應用vuex(一)

vuex 是一個專為 vue.js 應用程序開發(fā)的狀態(tài)管理模式,在構建一個中大型單頁應用中使用vuex可以幫助我們更好地在組件外部管理狀態(tài),我們知道組件之間是獨立的,組件之間想要實現(xiàn)通信需要使用props或者bus,可以實現(xiàn)父子組件及兄弟組件之間的數(shù)據(jù)傳送,如果一個項目中要使用很多組件之間的數(shù)據(jù)交換,我們再使用props就會變得雜亂不堪,還有一大堆的邏輯代碼,不利于代碼的維護。那么有沒有更方便、更簡潔的方法呢?我們能否把這些組件之間共享的數(shù)據(jù)給“拎”出來,能否在一定的規(guī)則下管理這些數(shù)據(jù)呢?有的,由于狀態(tài)零散地分布在許多組件和組件之間的交互中,大型應用復雜度也經(jīng)常逐漸增長。為了解決這個問題,Vue 提供 vuex

什么是vuex?

官方解釋:

Vuex 是一個專為 Vue.js應用程序開發(fā)的狀態(tài)管理模式。它采用集中式存儲管理應用的所有組件的狀態(tài),并以相應的規(guī)則保證狀態(tài)以一種可預測的方式發(fā)生變化

按我的理解,vuex是一個單例,類似于線程池、全局緩存、瀏覽器中的window對象等,他將所有組件的數(shù)據(jù)都拿出來放在一個叫store‘倉庫’中,在需要用的時候,調(diào)用特有的方法進行存值和取值,vuex提供了五個屬性:store,mutations,actions,getters,modules

在vue-cli中創(chuàng)建vuex

當我們使用vue-cli搭建項目時,使用npm install --save-dev vuex 把vuex添加到依賴,那么我們怎么使用vuex呢

通過store選項

vue-cli搭建成功,在src目錄下會有一個main.js文件,main.js的主要作用是把項目中最頂層的app.vue組件掛載到DOM中,其他所有的組件都可以看做是app.vue的子組件。
在main.js中添加store

import Vue from 'vue'
import App from './App'
import router from './router'
import axios from 'axios'

import store from './Store/index.js'

Vue.config.productionTip = false
Vue.prototype.$http = axios
/* eslint-disable no-new */
new Vue({
  el: '#app',
  router,
  store,
  components: { App },
  template: '<App/>'
})

src文件下新建一個Store文件夾,創(chuàng)建index.js文件



此例中我把五個屬性寫到了同一個文件中,如果項目中需要配置的vuex選項很多,可以把vuex的相關代碼分割到不同模塊中

import Vue from 'vue'
import vuex from 'vuex'
Vue.use(vuex)
const state = {
    
}
const mutations = {
    
}
const actions = {

}
const getters = {

}
const modules = {

}

export default new vuex.Store({
    state,
    mutations,
    actions,
    getters,
    modules
})

將vuex實例掛載到vue原型鏈上

上述例子中我們引入axios時,不能用use方法,只能使用vue的原型鏈,因此,當我們要引用vuex模塊時,原理同axios,需要在vue原型上引入。

import Vue from 'vue'
import App from './App'
import router from './router'
import axios from 'axios'
import vuex from 'vuex'
import store from './Store/index.js'

Vue.config.productionTip = false
Vue.prototype.$http = axios
Vue.use(vuex);
Vue.prototype.$store = new vuex.Store({
    state: {},
    getters: {},
    actions: {},
    mutations: {}
});
/* eslint-disable no-new */
new Vue({
  el: '#app',
  router,
  components: { App },
  template: '<App/>'
})
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容