1. 程式人生 > >詳解vuex

詳解vuex

一、vuex的作用:

  vuex是一個專為Vue.js應用程式開發的狀態管理模式。它採用集中式儲存管理應用的所有元件狀態並以相應的規則保證狀態以一種可預測的方式變化。

  作用:元件之間的通訊,大規模的邏輯程式碼,把元件之間共享的資料給拎出來,在一定的規則下管理這些資料,這就是Vuex的基本思想了。

二、使用和注意

  new Vuex.Store({})表示建立一個Vuex例項,通常情況下,它需要注入到Vue例項裡,Store是Vuex的一個核心方法,字面上理解“倉庫”的意思。Vuex Store是響應式的,

當Vue元件從Store中讀取狀態,(state選項時),若store中的狀態發生更新時,它會及時的響應給其他元件(類似雙向資料繫結)並且不能直接改變store的狀態,改變狀態的唯一方法就是,顯示地提交更改(mutations選項)。

   ***有四個核心選項:state、mutations、getters、actions (一般會在元件的計算屬性computed獲取state的資料,以為計算屬性會監控資料變化,一旦發生改變會響應)

三、state、mutations、getters、actions的使用

  1、state:用來存放元件之間共享的資料,它跟元件的data選項類似,只不過data選項是用來存放元件的私有資料。

  2、getters:有時候,我們需要對data的資料進行篩選,過濾。這些操作都是在元件的計算屬性中進行的,如果多個元件需要用到篩選後的資料,那我們就必須到處重複寫該計算屬性函式,或者將其提取到一個公共的工具函式中,

並將公共函式多處匯入,兩種方法都不是很理想。如果把資料篩選完再傳到計算屬性裡,就不用那麼麻煩了,getters就是幹這個的,你可以把getters看成是store的計算屬性,getters下的函式接受state做為第一個引數。那麼,元件是如何經過getters過濾的資料呢?過濾的資料會存放到$store.getters物件中。

  3、mutations: 前面講到的都是如何獲取state資料,那如何把資料儲存到state中呢?在vuex store中,實際改變state唯一的方式是通過提交commit 一個mutation。mutations下的函式接受tate作為引數,接手一個叫做payload(載荷)的東東作為第二個引數,這個東東用來記錄開發者使用該函式的一些資訊,比如說提交了什麼,提交的懂事是用來幹什麼的,包含多少個欄位,所以載荷一般是物件,(其實這個和git的commit很類似)還有一點很重要mutations的方法必須是同步方法。

    ①在mutayions選項裡,註冊函式裡面裝邏輯程式碼。

    ②在元件裡,this.$store.commit('change', payload) 注意:提交函式名要一 一對應。

    ③觸發函式,state就會響應改變。

    ④在元件的計算屬性裡this.$store.state獲取你想要的資料。

  4、actions既然mutations只能處理同步函式,js基本靠“非同步回撥”,怎麼能沒有非同步?於是actions出現了

  actions和mutations的區別:

    ⑴Actions提交的是mutations,而不是直接變更狀態,也就是說actions會通過mutations,讓mutations幫他提交資料變更。

    ⑵Actions可以包含任意非同步操作。ajax、setTimeout、setInterval不在話下。

  舉個栗子:

  

Vue.use(Vuex);
   var myStore =  new Vuex.Store({
        state:{
            //存放元件之間共享的資料
            name:"jjk",
            age:18,
            num:1
        },
         mutations:{
             //顯式的更改state裡的資料
             change:function(state,a){
                //  state.num++;
               console.log(state.num += a); 
               
             },
             changeAsync:function(state,a){
                 console.log(state.num +=a);
             }
         },
         getters:{
             getAge:function(state){
                 return state.age;
             }
         },
         actions:{
        //設定延時
             add:function(context,value){
                 setTimeout(function(){
           //提交事件
                    context.commit('changeAsync',value);
                 },1000)
                 
             }
         }
    });

    Vue.component('hello',{
        template:`
                <div>
                    <p @click='changeNum'>姓名:{{name}} 年齡:{{age}} 次數:{{num}}</p>
                    <button @click='changeNumAnsyc'>change</button>
                </div>`,
        computed: {
            name:function(){
                return this.$store.state.name
            },
            age:function(){
                return this.$store.getters.getAge
            },
            num:function(){
                return this.$store.state.num
            }
        },
         mounted:function(){
            console.log(this)
        },
        methods: {
            changeNum: function(){
                //在元件裡提交
                // this.num++;
                this.$store.commit('change',10)
            },
        //在元件裡派發事件 當點選按鈕時,changeNumAnsyc觸發-->actions裡的add函式被觸發-->mutations裡的changeAsync函式觸發

            changeNumAnsyc:function(){
                this.$store.dispatch('add', 5);
            }
        },
        data:function(){
            return {
                // num:5
            }
        }
    })
    new Vue({
        el:"#app",
        data:{
            name:"dk"
        },
        store:myStore,
        mounted:function(){
            console.log(this)
        }
    })

 

 先整明白context dispatch是什麼東西:

    context: 是與store例項具有相同的方法和屬性的物件,可以通過context.state和context。getters來獲取state和getters.

    dispatch:  翻譯為“派發、派遣”的意思,觸發事件時,dispatch就會通知actions(跟commit一樣一樣的)。

 

總結:各個型別的API各司其職,mutations只管存,你給我(dispatch)我就存,actions只管中間處理,處理完我就給你,你怎麼存我不管。getters我只管取,我不更改,action放在methods裡面,說明我們應該把它當成函式來用(按道理說鉤子函式應該也可以)mutations是寫在store裡面的,這說明,它就是個半成品,中間量,我們不應該在外面去操作它。getter寫在了computed裡面,這說明雖然getter我們寫的是函式,但是我們應該把它當成計算屬性來用。