Vuex學(xué)習(xí)

官方文檔

1飘痛、思想:基于響應(yīng)式的原理:所有的狀態(tài)的變更都是因?yàn)閿?shù)據(jù)的變化引起的汽绢。

2、背景:在傳統(tǒng)的vue應(yīng)用中卷玉,我們可能定義許多component,而每個(gè)component可能是這樣的:


var component_library_title = {
    props: ['text'],
        data:{
            a:'',
            b:''
        },
        template: '<div>{{text}}</div>'
    };

這樣哨颂,在不用的component中,就會出現(xiàn)屬于不用vue的組件管理的data數(shù)據(jù)相种,這樣威恼,如果在父子component或者兄弟component中進(jìn)行數(shù)據(jù)傳遞的時(shí)候,會比較混亂寝并。

3箫措、解決:將所有的data交給vuex管理。

  • 如何獲取數(shù)據(jù):

因?yàn)樵趘ue的computed鉤子中衬潦,其中的方法會在管理的數(shù)據(jù)源發(fā)生變更的時(shí)候蒂破,主動調(diào)用并更新數(shù)據(jù),所以這樣正好别渔,我們可以知道vuex管理的store發(fā)生變更的時(shí)候,數(shù)據(jù)如何變化。

  • 如何更改數(shù)據(jù):

通過commit或者dispatch去發(fā)送事件更改數(shù)據(jù)源哎媚,而不建議直接調(diào)用類似store.data.a去更改數(shù)據(jù)喇伯。

核心概念

State

單一狀態(tài)樹:一個(gè)應(yīng)用只對應(yīng)一個(gè)狀態(tài)樹逝段,且這種思想和組件化并不沖突士骤!

1、將State注冊到所有的子組件中

const app = new Vue({
  el: '#app',
  // 把 store 對象提供給 “store” 選項(xiàng)衬鱼,這可以把 store 的實(shí)例注入所有的子組件
  store,
  components: { Counter },
  template: `
    <div class="app">
      <counter></counter>
    </div>
  `
})

如果想直接訪問store實(shí)例中的屬性买喧,可以這樣:this.$store.state.屬性進(jìn)行訪問捻悯。

2、使用mapState

3淤毛、在子component中使用store中的state

你需要在子component中的computed鉤子中創(chuàng)建方法

computed: {
    count () {
      return this.$store.state.count
    }
  }

然后在需要使用的地方今缚,直接{{count}}就可以了。

Getters

其實(shí)是一種規(guī)范吧:

本來我們在子component中就能夠通過如上的方法獲取store的state的屬性低淡,但是姓言,假設(shè)我們希望對直接定義在store中的屬性進(jìn)行一些操作(這里官方網(wǎng)站說的是一些filter操作等),我們希望不要再修改mapState或者直接通過return this.$store.state.count來進(jìn)行數(shù)據(jù)的獲取或者修改蔗蹋。

于是就使用getter進(jìn)行數(shù)據(jù)的操作并裝換何荚。

注意到,我們在修改一個(gè)的時(shí)候猪杭,可能需要同時(shí)和其他的store中的state下面的數(shù)據(jù)進(jìn)行以前操作餐塘,這就意味著,我們需要拿到state這個(gè)對象皂吮。

而的確是這樣的戒傻,getters中允許我們在定義的方法中帶有state參數(shù)

1、定義

getters: {
    count(state){
            return state.count + 1;
            },
    }

2涮较、使用

computed: {
    getMessage(){
            return this.$store.state.count;
            },
    }

你需要在子component中的computed鉤子中定義方法稠鼻,這樣就能直接使用了。

Mutations

我們會返現(xiàn)狂票,在Vuex中候齿,只有Getter的定義,而沒有類似于Setter的定義.

其實(shí)闺属,這里的Mutations就是Setter的實(shí)現(xiàn).

雖然我們能夠通過this.$store.state.屬性獲取到某個(gè)屬性慌盯,并進(jìn)行修改,但是掂器,vuex強(qiáng)烈建議我們不要這樣做亚皂。

1、直接修改在$store.state中的值

我們直接在子component中定義了一個(gè)方法国瓮,用來直接$store.state中的值灭必。

  • html中
template: '<div>{{getMessage}}并且:{{getMessage1}}' +'<button @click="changeMessage">修改</button>' +'</div>',
  • js中
methods: {
    changeMessage(){
            console.log(this.$store.state.count);
                this.$store.state.count = 100;
            }
}

我們發(fā)現(xiàn)狞谱,在調(diào)用changeMessage后,this.$store.state.count變成了100禁漓。

說明我們本身是能夠直接調(diào)用this.$store.state.count進(jìn)行state中值得修改的跟衅。

Note:但是,Vuex建議我們不要這樣做播歼,如果需要修改this.$store.state中的值伶跷,建議在store中的Mutations鉤子中進(jìn)行方法的定義來完成。

2秘狞、使用Mutations

mutations: {
    increment (state) {
      // 變更狀態(tài)
      state.count++
    }
  }

注意在定義方法的時(shí)候叭莫,可以攜帶state參數(shù)。

3烁试、觸發(fā)方法

方法一:使用方法名稱

在本component中

store.commit('方法名稱');

在子component中

this.$store.commit('方法名稱');

方法二:使用對象

store.commit({
 type:'方法名稱'雇初,
 ...
});

4、使用常量定義mutations中的方法名

mutations: {
    [INCREMENT](state){
            state.count++;
            },
        [DECREMENT](state){
            state.count--;
            },
    },

這樣廓潜,就會比較方便的進(jìn)行管理了抵皱。

Actions

顧名思義,這也是一個(gè)可以改變state中屬性的方法集辩蛋。但是mutations中不是已經(jīng)提供了可用的方法集合了嘛呻畸?!

但是悼院,如果你在Mutations中寫就的方法集合中某個(gè)方法是異步的伤为,那么我們不建議將異步方法寫在Mutations中(雖然的確是可以的)。

那么据途,我們需要將這些方法寫在Actions中绞愚。

1、寫法

actions: {    asyncIncrement(context){        console.log('asyncIncrement');        context.commit('INCREMENT');    }}

2颖医、調(diào)用

這里稱之為“分發(fā)”位衩。

asyncIncrement(){
    store.dispatch({
            type: 'asyncIncrement',
                amount: 4,
            });
    }

3、在模塊中分發(fā)消息

changeMessageAsync(){
    console.log('異步修改');
        this.$store.dispatch('asyncIncrement')
    }

這樣熔萧,直接使用this.$store.dispatch('asyncIncrement')進(jìn)行分發(fā)糖驴。

表單操作

傳統(tǒng)方法(不按照Vuex的思路去管理數(shù)據(jù))

Vuex的思維方式:我們需要將數(shù)據(jù)統(tǒng)一管理,使用computed時(shí)刻觀察數(shù)據(jù)的變化佛致,并通過commit或者dispatch的方式改變數(shù)據(jù)贮缕。

那么我們只需要使用v-model就能方便簡單的實(shí)現(xiàn)了。

但是一旦我們在某處使用了vuex俺榆,并且我們希望在任何地方也使用vuex的思維進(jìn)行數(shù)據(jù)的管理感昼。

那么問題就來了。

  • 問題來了:
<input type="text" v-model="bookSerialNumber"/>
computed:{ bookSerialNumber(){
    return this.$store.state.book.serialNumber;
    },
 },

我們只能通過計(jì)算屬性(computed)計(jì)算出當(dāng)前this.$store.state.book.serialNumber的值,而無法實(shí)現(xiàn)該值的修改罐脊。

除非我們在方法bookSerialNumber中通過直接改變this.$store.state.book.serialNumber的值定嗓,但是這樣是明顯不符合vuex方法論的蜕琴。

vuex的解決

官方建議

<input type="text" @input='bookNameInputChange' :value='bookName'/>

為你的表單中的某一項(xiàng):

  • 使用:value單向綁定某個(gè)在computed中實(shí)現(xiàn)的計(jì)算屬性;
  • 使用@input監(jiān)聽控件的輸入的變化宵溅,這樣就實(shí)現(xiàn)了setter的方法奸绷,我們通過在mutations中定義的屬性對屬性進(jìn)行控制,假設(shè)這個(gè)改變的過程是異步的层玲,你需要在actions中定義屬性,并通過dispatch進(jìn)行事件的分發(fā)反症。

vue的方法論

  • 通過state設(shè)置元(原)數(shù)據(jù)辛块;
  • 通過getters設(shè)置訪問元數(shù)據(jù)的屬性(function),一般這里的屬性是邏輯是直接獲取原屬性铅碍,不再做其他的操作润绵;
  • 通過mutations設(shè)置改變元數(shù)據(jù)的屬性(function),并且約定這里的方法都是同步適宜的胞谈。
  • 通過actions設(shè)置改變元數(shù)據(jù)的異步方法尘盼。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市烦绳,隨后出現(xiàn)的幾起案子卿捎,更是在濱河造成了極大的恐慌,老刑警劉巖径密,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件午阵,死亡現(xiàn)場離奇詭異,居然都是意外死亡享扔,警方通過查閱死者的電腦和手機(jī)底桂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來惧眠,“玉大人籽懦,你說我怎么就攤上這事》湛” “怎么了暮顺?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長呆盖。 經(jīng)常有香客問我拖云,道長,這世上最難降的妖魔是什么应又? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任宙项,我火速辦了婚禮,結(jié)果婚禮上株扛,老公的妹妹穿的比我還像新娘尤筐。我一直安慰自己汇荐,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布盆繁。 她就那樣靜靜地躺著掀淘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪油昂。 梳的紋絲不亂的頭發(fā)上革娄,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天,我揣著相機(jī)與錄音冕碟,去河邊找鬼拦惋。 笑死,一個(gè)胖子當(dāng)著我的面吹牛安寺,可吹牛的內(nèi)容都是我干的厕妖。 我是一名探鬼主播,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼挑庶,長吁一口氣:“原來是場噩夢啊……” “哼言秸!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起迎捺,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤举畸,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后破加,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體俱恶,經(jīng)...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年范舀,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了合是。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,747評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡锭环,死狀恐怖聪全,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情辅辩,我是刑警寧澤难礼,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站玫锋,受9級特大地震影響蛾茉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜撩鹿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一谦炬、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦键思、人聲如沸础爬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽看蚜。三九已至,卻和暖如春赔桌,著一層夾襖步出監(jiān)牢的瞬間供炎,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工疾党, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留碱茁,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓仿贬,卻偏偏與公主長得像,于是被迫代替她去往敵國和親墓贿。 傳聞我的和親對象是個(gè)殘疾皇子茧泪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,658評論 2 350

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