Vuex 的學(xué)習(xí)過程記錄

Vuex 的學(xué)習(xí)記錄

  • 資料參考網(wǎng)址
  • Vuex的簡介
    • Vuex 是一個類似 Redux 的狀態(tài)管理器,專為 Vue.js 應(yīng)用程序開發(fā)预吆,采用集中式存儲管理應(yīng)用的所有組件的狀態(tài)倘感,并以相應(yīng)的規(guī)則保證狀態(tài)以一種可預(yù)測的方式發(fā)生變化施敢,并集成到了Vue的官方調(diào)試工具 devtools extension
    • Vuex的使用情況: 當開發(fā)大型單頁面應(yīng)用(SPA)時,會出現(xiàn)多個視圖組件依賴同一個狀態(tài),來自不同視圖的行為需要變更同一個狀態(tài)。
  • 基礎(chǔ)使用及API說明
    • 常用api及基礎(chǔ)寫法

      // func 指代 Function室囊,函數(shù)
      const store = new Vuex.Store(
          {
              state: {} | func,   // 根state對象藻雪,初始數(shù)據(jù)或狀態(tài)賦值
              mutations: {},      // 純函數(shù)修改數(shù)據(jù)的方法秘噪,處理函數(shù)總是接受 state 作為第一個,payload 作為第二個參數(shù)(可選)
              actions: {},        // 事件勉耀,動作指煎, 處理函數(shù)總是接受 context 作為第一個參數(shù)蹋偏,payload 作為第二個參數(shù)(可選)。
              getters: {},        // store 的計算屬性至壤,返回值會根據(jù)它的依賴被緩存起來威始,且只有當它的依賴值發(fā)生改變才會被重新計算
              modules: {},        // 包含子模塊的對象,會被合并到 store
              plugins: [],        // 包含應(yīng)用在store上的插件方法像街,這些插件接受store作為唯一參數(shù)黎棠,可以監(jiān)聽 mutation(用于外部地數(shù)據(jù)持久化、記錄或調(diào)試)或者提交 mutation(用于內(nèi)部數(shù)據(jù)镰绎,例如 websocket 或 某些觀察者)
              strict: Boolean,    // 默認值:false, 使Vuex store進入嚴格模式脓斩,任何 mutation 處理函數(shù)以外修改 Vuex state 都會拋出錯誤。
          }
      );
      
    • 最簡單的 Vuex 示例

      ```
      import Vue from 'vue';
      import Vuex from 'vuex';
      Vue.use(Vuex);
      
      const store = new Vuex.Store({
          state: {
              count: 0
          },
          mutations: {
              increment (state) {
                  state.count++
              }
          }
      });
      
      store.commit('increment');
      console.log(store.state.count)  // 1
      ```
      
      注明:每一個Vuex應(yīng)用就是一個store,在store中包含組件的共享狀態(tài) `state` 和改變狀態(tài)的方法 `mutations`畴栖,且只能通過 `mutations` 改變store的 `state` 的狀態(tài)俭厚,不能通過類似 `store.state.count = 5` 的方式直接更改(直接修改,狀態(tài)不會被同步驶臊,組件也不會重新渲染)
      
      • 在Vue組件使用Vuex

        • 在<b>根組件</b>挪挤,將store 注入到每一個子組件中,在子組件就可以通過 this.$store 訪問:
        // 根組件
        import store from './store';
        new Vue({
          el: '#app',
          router,
          store,
          render: h => h(App)
        })
        
        // Counter 組件
        export default {
              name: 'counter',
              computed: {
                 count () {
                   return this.$store.state.count
                }
              }
            }
        
        • <b>Getters</b>: Vuex 中getters 對象关翎,接受state作為第一個參數(shù)扛门,可以方便我們在 store 對 state 進行處理計算。Getter也可以接受其他 <b>getters</b> 作為第二參數(shù)
        const store = new Vuex.Store({
              state: {
                todos: [
                  { id: 1, text: '...', done: true },
                  { id: 2, text: '...', done: false }
                ]
              },
              getters: {
                doneTodos: state => {
                  return state.todos.filter(todo => todo.done)
                }
              }
            })
        // 在Vue中通過 store.getters對象調(diào)用
        computed: {
          doneTodos () {
            return this.$store.getters.doneTodos
          }
        }
        // Getter也可以接受其他getters作為第二個參數(shù)
        getters: {
          doneTodos: state => {
              return state.todos.filter(todo => todo.done)
          },
          doneTodosCount: (state, getters) => {
            return getters.doneTodos.length
          }
        }
        
        • <b>Mutations</b>: 每一個mutation都有一個事件類型type和一個回調(diào)函數(shù)handler纵寝,Mutations必須是同步函數(shù)论寨,若需要異步操作,就需要 Actions了爽茴。
        const store = new Vuex.Store({
          state: {
            count: 1
          },
          mutations: {
            increment (state) {
              state.count++;   // 變更state狀態(tài)
            }
          }
        })
        // 調(diào)用mutation葬凳,需要通過store.commit方法調(diào)用mutation type
        store.commit('increment');
        // 可以向store.commit傳入第二參數(shù),也就是mutation的payload(多數(shù)情況傳對象)
        mutaion: {
            increment (state, n) {
                state.count += n;
            },
            outcrement (state, payload) {
                state.totalPrice += payload.price + payload.count;
            }
        }
        
        store.commit('increment', 10);
        store.commit('outcrement', {
            price: 10,
            count: 8
        });
        
  • Vuex.Store 組件綁定的輔助函數(shù)
    • mapState(namespace?: string, map: Array<string> | Object), 第一個參數(shù)可選室奏。當一個組件需要獲取多個狀態(tài)的時候火焰,將這些狀態(tài)都聲明為計算屬性會有些重復(fù)和冗余。使用 mapState 輔助函數(shù)可以幫助我們批量生成計算屬性胧沫。

      // 在單獨構(gòu)建的版本中輔助函數(shù)為 Vuex.mapState
      import { mapState } from 'vuex'
      
      export default {
        computed: mapState({
          // 箭頭函數(shù)可使代碼更簡練
          count: state => state.count,  // 不使用mapState輔助函數(shù)的寫法
      
          // 傳字符串參數(shù) 'count' 等同于 `state => state.count`
          countAlias: 'count',          // 寫法一昌简,使用別名方式
      
          // 為了能夠使用 `this` 獲取局部狀態(tài),必須使用常規(guī)函數(shù)
          countPlusLocalState (state) {
            return state.count + this.localCount  // 寫法二绒怨,常規(guī)函數(shù)方式
          }
          
          // 
        })
      }
      
      // 當映射的計算屬性的名稱與state的子節(jié)點名稱相同時纯赎,可用字符串數(shù)組的寫法
      export default { 
          computed: mapState(['count'])  // 映射 this.count 為 store.state.count
      }
      
      // 使用 ES6 的 對象展開運算符 的寫法去簡化
      export default { 
          computed: { ...mapState(['count','total']) }    } 
      
      • mapGetters(namespace?: string, map: Array<string> | Object) : 將 store 中的 getter 映射到局部計算屬性。
      import { mapGetters } from 'vuex'
      export default {
          computed: {
          // 使用對象展開運算符將 getter 混入 computed 對象中
          ...mapGetters([
            'doneTodosCount',
            'anotherGetter'
          ])
        }
      }
      // 想將getter屬性另取一個名字南蹂,需使用對象形式
      export default {
          computed: {
          mapGetters({
              doneCount: 'doneTodosCount' // 映射 `this.doneCount` 為`store.getters.doneTodosCount`
          })
        }
      }
      
      • mapActions(namespace?: string, map: Array<string> | Object): 將組件的 methods 映射為 store.dispatch 調(diào)用
      import { mapActions } from 'vuex'
      
      export default {
        methods: {
          ...mapActions([
            'increment', // 將 `this.increment()` 映射為 `this.$store.dispatch('increment')`
      
            // `mapActions` 也支持載荷:
            'incrementBy' // 將 `this.incrementBy(amount)` 映射為 `this.$store.dispatch('incrementBy', amount)`
          ]),
          
          ...mapActions({
            add: 'increment' // 將 `this.add()` 映射為 `this.$store.dispatch('increment')`
          })
        }
      }
      
      • mapMutations(namespace?: string, map: Array<string> | Object): 將組件中的 methods 映射為 store.commit 調(diào)用
      import { mapMutations } from 'vuex'
      export default {
          methods: {
              ...mapMutions([
                  'increment',  // 將`this.increment()` 映射為 'this.$store.commit('increment')'
                  
                  // `mapMutations` 也支持載荷:
                  'incrementBy'  // 將 `this.incrementBy(amount)` 映射為 `this.$store.commit('incrementBy', amount)`
              ]),
              ...mapMutations({
                  add: 'increment',  // 將 `this.add()`映射為`this.$store.commit('increment')`
              })
          }
      }
      
    • createNamespacedHelpers(namespace: string): 建基于某個命名空間輔助函數(shù)

          import { createNamespacedHelpers } from 'vuex'
          const { mapState, mapActions } = createNamespacedHelpers('some/nested/module')
          
          export default {
            computed: {
              // 在 `some/nested/module` 中查找
              ...mapState({
                a: state => state.a,
                b: state => state.b
              })
            },
            methods: {
              // 在 `some/nested/module` 中查找
              ...mapActions([
                'foo',
                'bar'
              ])
            }
          }
      
  • Vuex.Store 的實例屬性
    • store.commit( '', { } ) : 提交 mutation

    • store.dispatch( '', { } ) : 分發(fā) actions

    • store.replaceState(newstate): 替換 store 的根狀態(tài)犬金,僅用狀態(tài)合并或時光調(diào)試。

    • store.watch( getter, cb ) : 響應(yīng)式地監(jiān)測一個 getter 方法的返回值,當值改變時調(diào)用回調(diào)函數(shù)晚顷。

    • store.subscribe(Function): 注冊監(jiān)聽 store 的 mutations , Function 會在每個 mutations 完成后調(diào)用峰伙,接受 mutation 和 經(jīng)過 mutation 后的狀態(tài)作為參數(shù):

      store.subscribe((mutation, state) => {
          console.log(mutation.type)
          console.log(mutation.payload)
      })
      
    • store.subscribeAction(handler: Function): 訂閱 store 的action, handler 會在分發(fā)的時候調(diào)用并接收 action 描述和當前的 store 的 state兩個參數(shù)。

      store.subscribeAction((action, state) => {
            console.log(action.type)
            console.log(action.payload)
      })
      
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末音同,一起剝皮案震驚了整個濱河市词爬,隨后出現(xiàn)的幾起案子秃嗜,更是在濱河造成了極大的恐慌权均,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件锅锨,死亡現(xiàn)場離奇詭異叽赊,居然都是意外死亡,警方通過查閱死者的電腦和手機必搞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進店門必指,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人恕洲,你說我怎么就攤上這事塔橡。” “怎么了霜第?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵葛家,是天一觀的道長。 經(jīng)常有香客問我泌类,道長癞谒,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任刃榨,我火速辦了婚禮弹砚,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘枢希。我一直安慰自己桌吃,他們只是感情好,可當我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布苞轿。 她就那樣靜靜地躺著读存,像睡著了一般。 火紅的嫁衣襯著肌膚如雪呕屎。 梳的紋絲不亂的頭發(fā)上让簿,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天,我揣著相機與錄音秀睛,去河邊找鬼尔当。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的椭迎。 我是一名探鬼主播锐帜,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼畜号!你這毒婦竟也來了缴阎?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤简软,失蹤者是張志新(化名)和其女友劉穎蛮拔,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體痹升,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡建炫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了疼蛾。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肛跌。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖察郁,靈堂內(nèi)的尸體忽然破棺而出衍慎,到底是詐尸還是另有隱情,我是刑警寧澤皮钠,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布稳捆,位于F島的核電站,受9級特大地震影響鳞芙,放射性物質(zhì)發(fā)生泄漏眷柔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一原朝、第九天 我趴在偏房一處隱蔽的房頂上張望驯嘱。 院中可真熱鬧,春花似錦喳坠、人聲如沸鞠评。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽剃幌。三九已至,卻和暖如春晾浴,著一層夾襖步出監(jiān)牢的瞬間负乡,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工脊凰, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留抖棘,地道東北人。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像切省,于是被迫代替她去往敵國和親最岗。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,601評論 2 353

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

  • 安裝 npm npm install vuex --save 在一個模塊化的打包系統(tǒng)中朝捆,您必須顯式地通過Vue.u...
    蕭玄辭閱讀 2,934評論 0 7
  • Vuex是什么般渡? Vuex 是一個專為 Vue.js應(yīng)用程序開發(fā)的狀態(tài)管理模式。它采用集中式存儲管理應(yīng)用的所有組件...
    蕭玄辭閱讀 3,114評論 0 6
  • vuex 場景重現(xiàn):一個用戶在注冊頁面注冊了手機號碼芙盘,跳轉(zhuǎn)到登錄頁面也想拿到這個手機號碼驯用,你可以通過vue的組件化...
    sunny519111閱讀 8,014評論 4 111
  • Vuex 是什么? ** 官方解釋:Vuex 是一個專為 Vue.js 應(yīng)用程序開發(fā)的狀態(tài)管理模式**何陆。它采用集中...
    Rz______閱讀 2,303評論 1 10
  • vuex 狀態(tài)管理器 作為應(yīng)用中所有組件的中央儲存 只能以預(yù)定的方式去操作狀態(tài) 把所有組件共享的狀態(tài)抽取出來作為全...
    一只大椰子閱讀 790評論 0 1