Vuex Demo 講解

混元霹靂手發表於2017-04-26

作者: 混元霹靂手-ziksang

vuex官網的專業術語,讓有些人還是感覺,摸不著頭腦,做一些實用場景給大家看

  • state 用來資料共享資料儲存
  • mutation 用來註冊改變資料狀態
  • getters 用來對共享資料進行過濾操作
  • action 解決非同步改變共享資料

這個四大特徵就是核心,如何用怎麼用

接下來還是按著我們約定的來

此時採用的演示方式還是用官方提供的vue-cli webpack版本

在src目錄下我們創一個vuex資料夾,分別建立index.js,mutations.js,state.js,getters.js,actions.js

好處:

這樣我們可對四種特性進行分檔案,這樣可以更加明確,清楚

Vuex Demo 講解

我們分別把這四個特性放入index.js中進行store的實列化

Vuex Demo 講解

再把實列化的store引入就是所謂的index.js資料夾引入到main.js中,也可以同時把store註冊到每一個元件中

Vuex Demo 講解

state如何用?

在頁面中,title肯定是必備,那每個元件頁面的title都肯定不一樣,那我們如何去拿到title,title適合放在那裡,根據每個頁面切換,而改變title,這個牽扯的就是元件與元件中的通訊

我們可以在state.js中先宣告一資料值

export default{
    title : "首頁"
}複製程式碼

那我們如何在首頁中拿到這個title值

Vuex Demo 講解

那我們在mian.js中再加入new Vue,繫結title作用域的例項程式碼
我們在computed裡進行資料監聽,
此時我們就可以從store裡拿到state.title
最後一步,我們在index.html中我們再進行{{title}}繫結

index.html

<title>{{title}}</title>複製程式碼

此時我們執行一下,開啟dev-tools你會發現

Vuex Demo 講解

title這個資料已經在全域性被共享了

matutions如何使用

應用場景:
如果我們要改變頂層的共享資料,我們應該要用matutions來進行改變,如果你做公眾號,後臺一般會在連線的上給你一些引數,比方說sid,ck,tm,或者一些其它東西,你想把他存在state中,如果去做,那我們就通過matutions來進行註冊事件,為了演示,我才這麼做

注意:
對於vuex,我只推薦state狀態儲存只在一個頁面中元件與元件這間的通訊,不適合誇頁在, 放一些狀態

state.js

export default{
    START_PARMA : {},
    title : "首頁"
}複製程式碼

START_PARMA用來存放我以上連線引數的資料,我們先前一定要定意好

mutations.js

export default{
    getParam (state,Object) {
       state.START_PARMA = Object
    }
}複製程式碼

我們對改變state資料進行一個事件註冊,第一個引數是拿到state物件,第二個是傳入的引數

  • getParam官方說是type,其實就是註冊的事件名
  • 可以是單個引數
  • 如果是多個引數,我們則用物件放入,如果你寫兩個引數,會報錯
  export default {
        name : 'advertisement',
        created () {
            const keyCode = sessionStorage.keyCode = getQueryString('keyCode')
            const keyWord = sessionStorage.keyWord =  keyCode.split("_")[0]
            const hunterCode = sessionStorage.hunterCode = keyCode.split("_")[1]
            const sid = sessionStorage.sid= getQueryString('sid')
            const ck = sessionStorage.ck = getQueryString('ck')
            const tm = sessionStorage.tm = getQueryString('tm')
            this.$store.commit('getParam',{
                keyCode,
                keyWord,
                hunterCode,
                sid,
                ck,
                tm
            })
        }
    }複製程式碼

我們自己建立一個檢視,然後在created裡進行擷取引數,因為store是註冊到每個元件中的,所以我們要用this.$store來訪問,那commit就是一個觸發器,第一個是type類形名,第二個參我們用物件的方式傳入,裡面用的是es6的語法

此時你會發現

Vuex Demo 講解

此時的擷取的狀態放到了一個物件裡,我們就可以使用了

getters如何使用

如果說getter就是對state裡的資料進行一些過濾,改造等等

那比方說State裡有一些這樣的資料

state.js

people : [
        {name : 'ziksang1',age:21},
        {name : 'ziksang2',age:10},
        {name : 'ziksang3',age:30},
        {name : 'ziksang4',age:40},
        {name : 'ziksang5',age:50},
        {name : 'ziksang6',age:30},
        {name : 'ziksang7',age:80}
    ]複製程式碼

如果我們定義這些資料,然後我們要從,這些資料中篩選出年紀大於30的人,再進行返回,我們就可以用到getter,這裡的getter的意思就是對vuex頂層資料進行過濾,而不改動state裡原本的資料

getters.js

export default{
    changePeople: (state) =>{
        return state.people.filter(item=>{
            if(item.age>30){
                return true
            }
        })
    }
}複製程式碼

好我們如何應用呢,我們在元件中裡只要寫入

created () {
   console.log(this.changePeople)
},
computed : {
            changePeople () {
                return this.$store.getters.changePeople
            }
        },複製程式碼

那我們可以開啟命臺看一下,看回的資料,

Vuex Demo 講解

接下來你如何想對資料進行操作那就看你自己的了

action 如何使用?

action.是用來解決非同步流程來改變state資料的,有想人說,那我直接在matution裡面進行寫進不就行了麻,那你可以試一下,因為matution是直接進行同步操作的

mutations.js

export default{
    getParam (state,Object) {
       setTimeout(()=>{
            state.START_PARMA = Object
       },1000)
    }
}複製程式碼

還是拿上面例子,如果你在mutations裡進行非同步操作,你會發現沒用,並不會起任何效果,那怎麼辦,只有通過action->mutations->states,這個流程進行操作

action.js

export default {
    getParamSync (context,Object) {
        setTimeout(()=>{
            context.commit('getParam',Object)
        },3000)
    }
}複製程式碼

寫一個getParamSync函靈敏,第一個引數就是上下文,context是一個store物件,你也可以用解構的方式寫出來,第二個引數還是我們要寫入的接收到的引數,來改變觸發mutations事件,再通過mutation來改變state,很好理解不難

然後我們就在元件裡這麼呼叫就可以了

 this.$store.dispatch('getParamSync',{
                keyCode,
                keyWord,
                hunterCode,
                sid,
                ck,
                tm
            })複製程式碼

那組合action又是怎麼玩呢?我們有時候向後臺請求時,要通過第一個AJAX返回值來進行下一個action分發

我們可以用promise來進行非同步處理

actions.js

export default {
    getParamSync (context,Object) {
        return new Promise((reslove,reject)=>{
            setTimeout(()=>{
                context.commit('getParam',Object)
                return reslove('成功')
            },3000)
        })

    },
    changetitleSync ({commit},title){
        setTimeout(()=>{
            commit('changetitle',title)
        },3000)
    }
}複製程式碼

在getParamSync使用new promise之後,在resolve裡返回‘成功’,再分發一個changetitleSync改變title的action方法

Vuex Demo 講解

mutations.js

export default{
    getParam (state,Object) {
       state.START_PARMA = Object
    },
    changetitle (state,title){
        state.title = title
    }
}複製程式碼

再在註冊一個改變title的changetitle的type型別

組中間呼叫

created(){
 this.$store.dispatch('getParamSync',{
                keyCode,
                keyWord,
                hunterCode,
                sid,
                ck,
                tm
            }).then((res)=>{
                this.$store.dispatch('changetitleSync',res)
            })
}複製程式碼

我們就可以在元件中進行一種鏈式呼叫,解決非同步回撥,來action套action,就成了一個組合action

關於其它輔助用法

  • mapState 輔助函式
  • mapGetters 輔助函式
  • mapMutations 輔助函式
  • mapActions 輔助函式

尤大神已經寫的很全面了,大家可以參考vuex的官網,進行閱讀一下。我在這裡就沒有必要再進行重新講解了

總結

在vuex中,我認為vuex用在那裡比較好?

只適合運用於一個檢視內元件與元件之間的組合傳遞,不適用於跨頁面,但是可以共用,為了不因使用者重新整理頁面,要進行初始化再次呼叫。

不適合運用在那裡

在自己寫一些Ui元件給大家或者開源用的話,不適用於寫在vuex中,應該暴露所接收的Props,通過$emit來進行觸發事件,一些關鍵性全域性狀態,不也適合存vuex中,你可以選擇localStorage,sessionStorage

想了解vue更多知識歡迎訂閱我的掘金專欄

渣渣前端開發工程師,喜歡鑽研,熱愛分享和講解教學請 微信 zzx1994428 QQ494755899

支援我繼續創作和感到有收穫的話,請向我打賞點吧

Vuex Demo 講解

如果轉載請標註出自@混元霹靂手ziksang

相關文章