溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

vuejs如何實現(xiàn)全局狀態(tài)管理

發(fā)布時間:2021-09-08 14:04:31 來源:億速云 閱讀:130 作者:小新 欄目:編程語言

這篇文章給大家分享的是有關vuejs如何實現(xiàn)全局狀態(tài)管理的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

在vuejs中可以利用vuex實現(xiàn)全局狀態(tài)管理;Vuex是一個專為Vue.js應用程序開發(fā)的狀態(tài)管理模式,可以用來管理全局數(shù)據(jù),可以管理復雜應用的數(shù)據(jù)狀態(tài),比如兄弟組件的通信、多層嵌套的組件的傳值等等。

本教程操作環(huán)境:windows7系統(tǒng)、vue2.9.6版,DELL G3電腦。

vuex全局狀態(tài)管理

Vuex 是一個專為Vue.js 應用程序開發(fā)的狀態(tài)管理模式??梢怨芾韽碗s應用的數(shù)據(jù)狀態(tài),比如兄弟組件的通信、多層嵌套的組件的傳值等等。

通俗的來說vuex就是全局數(shù)據(jù)管理,用來管理全局數(shù)據(jù)的,vue原本的數(shù)據(jù)管理只能父子組件之間傳遞數(shù)據(jù),并且不方便,使用vuex可以進行全局數(shù)據(jù)管理,將所有數(shù)據(jù)存儲到vuex中,使用時調(diào)用。

vuex的核心:

  • state

  • mutations

  • actions

  • getter

Vuex的用法

安裝并使用vuex

安裝

1.在項目中進行安裝

npm install vuex --save

2.新建一個store.js文件

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

const store = new Vuex.Store({
  state: {
      //存放初始數(shù)據(jù)
    count: 0
  },
  mutations: {
      //存放修改數(shù)據(jù)的方法
    increment (state) {
      state.count++
    }
  }
})

使用數(shù)據(jù)

方法一:使用$store調(diào)用

在組件中直接使用this.$store.state調(diào)用數(shù)據(jù)

this.$store.state.數(shù)據(jù)名

方法二:導入mapState,在組件中將數(shù)據(jù)展開映射,需要寫到計算屬性中,使用的時候直接寫 count就行

//先導入mapState
import {mapState} from 'vuex'

computed:[
    ...mapState(['count'])
]

在對數(shù)據(jù)進行操作時,不能直接調(diào)用state的數(shù)據(jù),如果要修改數(shù)據(jù),需要在mutation里寫方法,目的就是方便查找哪里除了問題

Mutations的作用與使用方法

mutations里面就是寫對數(shù)據(jù)進行操作的方法的

  mutations: {
//存放修改數(shù)據(jù)的方法
   add(state) {
     state.count++
   }
 }

使用方式一:

觸發(fā)mutations函數(shù),使用commit調(diào)用里面的方法名

this.$store.commit這是觸發(fā)mutation的第一種方式

methods:{
   handle(){
       this.$store.commit('add')
   }
}

mutations傳參mutation的方法里可以傳遞兩個參數(shù),第一個就是state,第二個是自定義的參數(shù)payload

  mutations: {
//存放修改數(shù)據(jù)的方法
   addN(state,N) {
     state.count+=N
   }
 }

調(diào)用是在組件的方法里

methods:{
   handle2(){
       //觸發(fā)mutation并傳參
       this.$store.commit('addN',4)
   }
}

使用方法二

在組件中導入vuex里的mapMutations函數(shù)

mapMutations(['sub'])是對里面的方法與store里的方法進行映射

...是展開操作符

import {mapMutations} from 'vuex'

methods:{
   //將方法名寫在[]里  ['addN','sub']
   ...mapMutations(['sub'])
   btnhandle(){
       //調(diào)用時直接寫this.方法名
       this.sub()
       //當傳入?yún)?shù)時,直接寫這個參數(shù),不需要寫state
       this.addN(4)
   }
}

注意:在Mutation函數(shù)里不能寫異步代碼;比如寫定時函數(shù),雖然頁面會改變,但是實際狀態(tài)數(shù)值不會變。于是就有了actions

Actions的用法

Action用于處理異步任務。

如果通過異步操作變更數(shù)據(jù),必須通過Action,而不能使用Mutation,但是在Action中還是要通過觸發(fā)Mutation的方式間接變更數(shù)據(jù).

在store里與mutations同級寫一個actions:{ } 在它里面調(diào)用mutations的方法,然后在組件中觸 發(fā)Actions

  mutations: {
  //存放修改數(shù)據(jù)的方法
    add(state) {
      state.count++
    }
  },
  actions:{
      //context是上下文
      addAsync(context){
          setTimeout(()=>{
              //調(diào)用add方法,actions中不能直接修改state中的數(shù)據(jù),只有mutation有這個權力
              context.commit('add')
          })
      }
  }

使用actions要在組件中使用dispatch進行觸發(fā)

btnHandle(){
    //dispatch專門觸發(fā)action
    this.$store.dispatch('addAsync')
}

actions傳遞參數(shù)

在store的actions里和mutations都要寫形參

  mutations: {
  //傳參
    addN(state,n) {
      state.count+=n
    }
  },
  actions:{
      //context是上下文
      addAsync(context,n){
          setTimeout(()=>{
              //調(diào)用add方法,并傳參
              context.commit('addN',n)
          })
      }
  }

在組件中寫實參

btnHandle(){
    //dispatch專門觸發(fā)action,并傳入?yún)?shù)
    this.$store.dispatch('addAsync',5)
}

第二種是展開并映射引入mapActions

//引入方法
import {mapActions} from 'vuex

methods:{
    //映射actions
    ...mapActions(['addAsync'])
    btnhandle(){
        //調(diào)用對應的actions
        this.addAsync()
    }
}
//也可以不寫btnhandle方法了直接將映射的方法名寫在點擊操作上

注意:在組件中調(diào)用actions方法,在actions中使用commit調(diào)用mutations方法

getters

  • Getter用于對Store中的數(shù)據(jù)進行加工處理形成新的數(shù)據(jù)。不會修改原數(shù)據(jù)

  • Getter可以對Store中已有的數(shù)據(jù)加工處理之后形成新的數(shù)據(jù),類似Vue的計算屬性。

  • Store中數(shù)據(jù)發(fā)生變化,Getter的數(shù)據(jù)也會跟著變化.

state:{
   count:0
},
getters:{
   showNum(state){
       return '當前最新的數(shù)據(jù)是:'+state.count
   }
}

第一種調(diào)用方式:this.$store.getters.方法名

this.$store.getters.showNum

第二種調(diào)用方式:映射展開,在computed中映射

import {mapGetters} from 'vuex'

computed:{
   ...mapGetters(['showNum'])
}

感謝各位的閱讀!關于“vuejs如何實現(xiàn)全局狀態(tài)管理”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI