Vuex學習

官方文檔

1、思想:基于響應式的原理:所有的狀態的變更都是因為數據的變化引起的。

2、背景:在傳統的vue應用中,我們可能定義許多component,而每個component可能是這樣的:


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

這樣,在不用的component中,就會出現屬于不用vue的組件管理的data數據,這樣,如果在父子component或者兄弟component中進行數據傳遞的時候,會比較混亂。

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

  • 如何獲取數據:

因為在vue的computed鉤子中,其中的方法會在管理的數據源發生變更的時候,主動調用并更新數據,所以這樣正好,我們可以知道vuex管理的store發生變更的時候,數據如何變化。

  • 如何更改數據:

通過commit或者dispatch去發送事件更改數據源,而不建議直接調用類似store.data.a去更改數據。

核心概念

State

單一狀態樹:一個應用只對應一個狀態樹,且這種思想和組件化并不沖突!

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

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

如果想直接訪問store實例中的屬性,可以這樣:this.$store.state.屬性進行訪問。

2、使用mapState

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

你需要在子component中的computed鉤子中創建方法

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

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

Getters

其實是一種規范吧:

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

于是就使用getter進行數據的操作并裝換。

注意到,我們在修改一個的時候,可能需要同時和其他的store中的state下面的數據進行以前操作,這就意味著,我們需要拿到state這個對象。

而的確是這樣的,getters中允許我們在定義的方法中帶有state參數

1、定義

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

2、使用

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

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

Mutations

我們會返現,在Vuex中,只有Getter的定義,而沒有類似于Setter的定義.

其實,這里的Mutations就是Setter的實現.

雖然我們能夠通過this.$store.state.屬性獲取到某個屬性,并進行修改,但是,vuex強烈建議我們不要這樣做。

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

我們直接在子component中定義了一個方法,用來直接$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;
            }
}

我們發現,在調用changeMessage后,this.$store.state.count變成了100。

說明我們本身是能夠直接調用this.$store.state.count進行state中值得修改的。

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

2、使用Mutations

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

注意在定義方法的時候,可以攜帶state參數。

3、觸發方法

方法一:使用方法名稱

在本component中

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

在子component中

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

方法二:使用對象

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

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

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

這樣,就會比較方便的進行管理了。

Actions

顧名思義,這也是一個可以改變state中屬性的方法集。但是mutations中不是已經提供了可用的方法集合了嘛?!

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

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

1、寫法

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

2、調用

這里稱之為“分發”。

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

3、在模塊中分發消息

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

這樣,直接使用this.$store.dispatch('asyncIncrement')進行分發。

表單操作

傳統方法(不按照Vuex的思路去管理數據)

Vuex的思維方式:我們需要將數據統一管理,使用computed時刻觀察數據的變化,并通過commit或者dispatch的方式改變數據。

那么我們只需要使用v-model就能方便簡單的實現了。

但是一旦我們在某處使用了vuex,并且我們希望在任何地方也使用vuex的思維進行數據的管理。

那么問題就來了。

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

我們只能通過計算屬性(computed)計算出當前this.$store.state.book.serialNumber的值,而無法實現該值的修改。

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

vuex的解決

官方建議

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

為你的表單中的某一項:

  • 使用:value單向綁定某個在computed中實現的計算屬性;
  • 使用@input監聽控件的輸入的變化,這樣就實現了setter的方法,我們通過在mutations中定義的屬性對屬性進行控制,假設這個改變的過程是異步的,你需要在actions中定義屬性,并通過dispatch進行事件的分發。

vue的方法論

  • 通過state設置元(原)數據;
  • 通過getters設置訪問元數據的屬性(function),一般這里的屬性是邏輯是直接獲取原屬性,不再做其他的操作;
  • 通過mutations設置改變元數據的屬性(function),并且約定這里的方法都是同步適宜的。
  • 通過actions設置改變元數據的異步方法。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,321評論 6 543
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,559評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 178,442評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,835評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,581評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,922評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,931評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,096評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,639評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,374評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,591評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,104評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,789評論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,196評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,524評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,322評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,554評論 2 379

推薦閱讀更多精彩內容

  • Vuex 是什么? ** 官方解釋:Vuex 是一個專為 Vue.js 應用程序開發的狀態管理模式**。它采用集中...
    Rz______閱讀 2,316評論 1 10
  • vuex 狀態管理器 作為應用中所有組件的中央儲存 只能以預定的方式去操作狀態 把所有組件共享的狀態抽取出來作為全...
    一只大椰子閱讀 798評論 0 1
  • 上次學習了vue-router的使用,讓我能夠在各個頁面間切換,將頁面搭建了起來。這次則要學習vue的狀態管理模式...
    VioletJack閱讀 29,087評論 3 46
  • 學習資源: https://vuex.vuejs.org/zh-cn/ 介紹 Vuex是為Vue.js應用程序開發...
    林_Han閱讀 376評論 0 2
  • 代碼管理 每天早上更新一下代碼git pull vuex的學習 vuex的了解Vuex是一個專門為vue.js應用...
    Gopal閱讀 316評論 0 0