一個簡單的demo來理解vuex

相比接觸vue的同學們已經(jīng)看了官方文檔了试读。這里我用一個簡單的demo來闡述下vuex的知識點杠纵,雖然簡單,但是容易理解钩骇。也加深自己的記憶比藻。

用腳手架建立個項目vue init webpakc-simple ,安裝下vuex倘屹,這里我新建2個組件productOne,productTwo.
好银亲,如果想在2個組件中引用同一組數(shù)據(jù),笨方法就是在每個組件的data里寫上數(shù)據(jù)纽匙,聰明點可以在根組件中建立數(shù)據(jù)务蝠,通過props傳給子組件。那么這里烛缔,我用vuex來儲存數(shù)據(jù)馏段。通過在根實例中注冊 store 選項赠尾,該 store 實例會注入到根組件下的所有子組件中,且子組件能通過 this.$store 訪問到毅弧。

新建個store文件夾气嫁,里面新建個store.js。這里就是vuex狀態(tài)管理作用的地方够坐。
store.js中

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

Vue.use(Vuex)

export const store = new Vuex.Store({
    state: {
    }
})

main.js中寸宵,引入store模塊并注冊。

import Vue from 'vue'
import App from './App.vue'
import {store} from './store/store.js'
new Vue({
  el: '#app',
  store,
  render: h => h(App)
})

state

官網(wǎng)上說元咙,state是作為一個單一狀態(tài)樹梯影,用一個對象來包含了全部的應用層級狀態(tài)。至此它便作為一個唯一數(shù)據(jù)源的存在庶香。這也意味著甲棍,每個應用將僅僅包含一個 store 實例。單一狀態(tài)樹讓我們能夠直接地定位任一特定的狀態(tài)片段赶掖,在調(diào)試的過程中也能輕易地取得整個當前應用狀態(tài)的快照感猛。

由于vuex的狀態(tài)存儲是響應式的,那么在組件中奢赂,我們就可以用計算屬性來獲取state狀態(tài)头遭。每當 store.state.count 變化的時候, 都會重新求取計算屬性庭惜,并且觸發(fā)更新相關聯(lián)的 DOM敞峭。

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

Vue.use(Vuex)

export const store = new Vuex.Store({
    state: {
        products:[
            {name:'apple', price: '2'},
            {name:'banana', price: '3'},
            {name:'pear', price: '4'},
            {name:'melon', price: '5'},
        ]
    }
})

兩個組件中的結構大概如下:用計算屬性用this.$state來返回這個狀態(tài)赃磨。

<template>
    <div class="product-one">
        <h2>product-one</h2>
        <ul>
            <li v-for="item in product">
                <div class="name">{{item.name}}</div>
                <div class="price">{{item.price}}</div>
            </li>
        </ul>
    </div>
</template>
<script>
    export default {
        computed: {
            product() {
                return this.$store.state.products
            }
        }
    }
</script>

這樣2個組件中的數(shù)據(jù)就可以統(tǒng)一在store.js中管理了。效果如下:


好轧钓,如果現(xiàn)在想改變下數(shù)據(jù)的一些內(nèi)容序厉,比如價格都漲2倍,那該怎么做呢毕箍,此時就用到getters

getter

官網(wǎng)上說弛房,getters就相當于是store的計算屬性,可以處理state的數(shù)據(jù)霉晕,它接受第一個參數(shù)就是state庭再。那么接下來就簡單了,把計算邏輯寫在getters里牺堰,在組件中再獲取getters就行了拄轻。

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

Vue.use(Vuex)

export const store = new Vuex.Store({
    state: {
        products:[
            {name:'apple', price: '2'},
            {name:'banana', price: '3'},
            {name:'pear', price: '4'},
            {name:'melon', price: '5'},
        ]
    },

    getters: {
        changeProduct: (state) => {
            return state.products.map(val => {
                return {
                    name: '**' + val.name + '--',
                    price: val.price*2
                }
            })
            return state.products
        }
    }
})

在子組件中,用計算屬性來獲取getters,并在DOM中遍歷這個計算屬性。

    export default {
        computed: {
            product() {
                return this.$store.state.products
            },
            changeProduct(){
                return this.$store.getters.changeProduct
            }
        }
    }

<li v-for="item in changeProduct">
    <div class="name">{{item.name}}</div>
    <div class="price">{{item.price}}</div>
</li>

可以看到伟葫,2個組件的數(shù)據(jù)都改變了恨搓。


mutation

更改 Vuex 的 store 中的狀態(tài)的唯一方法是提交 mutation。Vuex 中的 mutation 非常類似于事件:每個 mutation 都有一個字符串的 事件類型 (type) 和 一個 回調(diào)函數(shù) (handler)。這個回調(diào)函數(shù)就是我們實際進行狀態(tài)更改的地方斧抱,并且它會接受 state 作為第一個參數(shù)
你不能直接調(diào)用一個 mutation handler常拓。這個選項更像是事件注冊:“當觸發(fā)一個類型為 increment 的 mutation 時,調(diào)用此函數(shù)辉浦∨В”要喚醒一個 mutation handler,你需要以相應的 type 調(diào)用 store.commit 方法宪郊。
簡單來說掂恕,就是mutations就類似事件,子組件中用this.$store.commit('事件名')來獲取弛槐。

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

Vue.use(Vuex)

export const store = new Vuex.Store({
    state: {
        products:[
            {name:'apple', price: '2'},
            {name:'banana', price: '3'},
            {name:'pear', price: '4'},
            {name:'melon', price: '5'},
        ]
    },

    getters: {
        changeProduct(state){
            return state.products.map(val => {
                return {
                    name: '**' + val.name + '--',
                    price: val.price*2
                }
            })
            return state.products
        }
    },

    mutations: {
        decrePrice(state){
            state.products.forEach(val => {
                val.price -= 1
            })
        }
    }
})

子組件中

methods: {
            decrePrice(){
                return this.$store.commit('decrePrice')
            }
}

action

action和mutation類似懊亡,不同的是,Action 提交的是 mutation乎串,而不是直接變更狀態(tài)店枣。而且Action支持異步。mutation必須同步執(zhí)行叹誉。
Action 函數(shù)接受一個與 store 實例具有相同方法和屬性的 context 對象鸯两,因此你可以調(diào)用 context.commit 提交一個 mutation,或者通過 context.state 和 context.getters 來獲取 state 和 getters桂对。

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

Vue.use(Vuex)

export const store = new Vuex.Store({
    state: {
        products:[
            {name:'apple', price: '2'},
            {name:'banana', price: '3'},
            {name:'pear', price: '4'},
            {name:'melon', price: '5'},
        ]
    },

    getters: {
        changeProduct(state){
            return state.products.map(val => {
                return {
                    name: '**' + val.name + '--',
                    price: val.price*2
                }
            })
            return state.products
        }
    },

    mutations: {
        decrePrice(state){
            state.products.forEach(val => {
                val.price -= 1
            })
        }
    },

    actions: {
        decrePriceAction(context){
            setTimeout(()=>{
                context.commit('decrePrice')
            }, 2000)
        }
    }
})

子組件中,用this.$store.dispatch('action的名字')來獲取甩卓。

        methods: {
            decrePrice(){
                // return this.$store.commit('decrePrice')
                return this.$store.dispatch('decrePriceAction')
            }
        }

好鸠匀,一些基本的就這樣蕉斜,其它的可以去官網(wǎng)看哦~

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市缀棍,隨后出現(xiàn)的幾起案子宅此,更是在濱河造成了極大的恐慌,老刑警劉巖爬范,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件父腕,死亡現(xiàn)場離奇詭異,居然都是意外死亡青瀑,警方通過查閱死者的電腦和手機璧亮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來斥难,“玉大人枝嘶,你說我怎么就攤上這事⊙普铮” “怎么了群扶?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我竞阐,道長缴饭,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任骆莹,我火速辦了婚禮颗搂,結果婚禮上,老公的妹妹穿的比我還像新娘幕垦。我一直安慰自己峭火,他們只是感情好,可當我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布智嚷。 她就那樣靜靜地躺著卖丸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪盏道。 梳的紋絲不亂的頭發(fā)上稍浆,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天,我揣著相機與錄音猜嘱,去河邊找鬼衅枫。 笑死,一個胖子當著我的面吹牛朗伶,可吹牛的內(nèi)容都是我干的弦撩。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼论皆,長吁一口氣:“原來是場噩夢啊……” “哼益楼!你這毒婦竟也來了?” 一聲冷哼從身側響起点晴,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤感凤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后粒督,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體陪竿,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年屠橄,在試婚紗的時候發(fā)現(xiàn)自己被綠了族跛。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡锐墙,死狀恐怖礁哄,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情贮匕,我是刑警寧澤姐仅,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響掏膏,放射性物質發(fā)生泄漏劳翰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一馒疹、第九天 我趴在偏房一處隱蔽的房頂上張望佳簸。 院中可真熱鬧,春花似錦颖变、人聲如沸生均。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽马胧。三九已至,卻和暖如春衔峰,著一層夾襖步出監(jiān)牢的瞬間佩脊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工垫卤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留威彰,地道東北人。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓穴肘,卻偏偏與公主長得像歇盼,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子评抚,可洞房花燭夜當晚...
    茶點故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 安裝 npm npm install vuex --save 在一個模塊化的打包系統(tǒng)中豹缀,您必須顯式地通過Vue.u...
    蕭玄辭閱讀 2,926評論 0 7
  • Vuex是什么? Vuex 是一個專為 Vue.js應用程序開發(fā)的狀態(tài)管理模式盈咳。它采用集中式存儲管理應用的所有組件...
    蕭玄辭閱讀 3,106評論 0 6
  • Vuex 是一個專為 Vue.js 應用程序開發(fā)的狀態(tài)管理模式耿眉。它采用集中式存儲管理應用的所有組件的狀態(tài),并以相應...
    白水螺絲閱讀 4,652評論 7 61
  • vuex 場景重現(xiàn):一個用戶在注冊頁面注冊了手機號碼鱼响,跳轉到登錄頁面也想拿到這個手機號碼,你可以通過vue的組件化...
    sunny519111閱讀 8,008評論 4 111
  • vuex是一個狀態(tài)管理模式组底,通過用戶的actions觸發(fā)事件丈积,然后通過mutations去更改數(shù)據(jù)(你也可以說狀態(tài)...
    Ming_Hu閱讀 2,016評論 3 3