Vuex學(xué)習(xí)

[toc]

Vuex

  1. Vuex是一個為Vue.js應(yīng)用程序開發(fā)的狀態(tài)管理模式

    1. 采用集中存儲管理應(yīng)用的所有組件的狀態(tài)
  2. 管理什么狀態(tài)?

    1. 多個頁面間共享的殃姓,如用戶登錄狀態(tài)袁波,用戶名稱,頭像蜗侈,地理位置信息篷牌,商品的收藏,購物車中的商品
  3. //router/index.js
    import Vuex from 'vuex'
    
    Vue.use(Vuex)   // 安裝插件踏幻,會去調(diào)用插件的install方法
    const store = new Vuex.store({
      state: {
        counter: 0
      },
      mutations: {
        increment(state){  //默認有一個參數(shù)state
          state.counter++
        },
        decrement(state){
          state.counter--
        }
      },
      actions: {
        
      },
      getters: {
        
      },
      modules: {
        
      }
    })
    export default store
    
    //組件中調(diào)用
    <button @click="add"></button>
    methods: {
      add(){
        this.$store.commit('increment')
      }
    }
    
  4. Vuex是一個全局的單例模式

Vuex核心概念

  • State

    • 單一狀態(tài)樹:所有狀態(tài)信息都保存在一個store中
  • Getters

    • 當(dāng)需要從store中獲取一些state變異后的狀態(tài)時使用

    • const store = new Vuex.store({
        state: {
          counter: 0
        },
        getters: {
          powerCounter(state){
            return state.counter**2
          }
        }
      }
      //使用
      {{$state.getters.powerCounter}}
      
    • const store = new Vuex.store({
        state: {
          counter: 0,
          students: [
            {name: 'aaa', age:10},
            {name: 'bbb', age:20},
            {name: 'ccc', age:30},
            {name: 'ddd', age:40},
          ]
        },
        getters: {
          powerCounter(state){
            return state.counter**2
          },
          //獲取大于20歲的學(xué)生
          more20Stus(state){
            return state.students.filter(s=>s.age>20)
          },
          //獲取大于20歲的學(xué)生的個數(shù) (getters可以作為參數(shù)傳入)
          more20StusLen(state, getters){
            return getters.more20Stus.length
          },
          //如果想自定義傳入age
          moreAgeStus(state){
            return function(age){
              return state.students.filter(s=>s.age>age)
            }
          }
        }
      }
      //使用
      {{$state.getters.powerCounter}}
      {{$state.getters.more20Stus}}
      {{$state.getters.more20StusLen}}
      {{$state.getters.moreAgeStus(30)}}
      
  • Mutation

    • Vuex的store狀態(tài)更新的唯一方式:提交Mutation

    • Mutation主要包括兩部分

      • 字符串的事件類型(type)
      • 一個回調(diào)函數(shù)(handler)枷颊,該回調(diào)函數(shù)的第一個參數(shù)就是state
    • 傳遞參數(shù)

      • 參數(shù)被稱為mutation的載荷(payload)
    • //router/index.js
      import Vuex from 'vuex'
      //普通提交風(fēng)格
      Vue.use(Vuex)   // 安裝插件,會去調(diào)用插件的install方法
      const store = new Vuex.store({
        state: {
          counter: 0
        },
        mutations: {
          incrementCount(state, count){
            state.counter+=count
          }
        }
      })
      export default store
      
      //組件中調(diào)用
      <button @click="add"></button>
      methods: {
        add(){
          this.$store.commit('incrementCount', count)
        }
      }
      //特殊提交風(fēng)格
      const store = new Vuex.store({
        state: {
          counter: 0
        },
        mutations: {
          incrementCount(state, payload){
            state.counter += payload.count
          }
        }
      })
      export default store
      
      //組件中調(diào)用
      <button @click="add"></button>
      methods: {
        add(){
          this.$store.commit({
            type: 'incrementCount',
            count
          })
        }
      }
      
    • mutation響應(yīng)規(guī)則

      • 提前在store中初始化好所需的屬性
      • 當(dāng)給state的對象添加新屬性時该面,使用Vue.set(obj, key, value),當(dāng)刪除屬性時夭苗,使用Vue.delete(obj, key)
    • Mutation常量

      • //router/index.js
        import Vuex from 'vuex'
        import {INCREMENT, DECREMENT} from 'mutation-types'
        Vue.use(Vuex)   // 安裝插件,會去調(diào)用插件的install方法
        const store = new Vuex.store({
          state: {
            counter: 0
          },
          mutations: {
            [INCREMENT](state){  //默認有一個參數(shù)state
              state.counter++
            },
            [DECREMENT](state){
              state.counter--
            }
          },
        })
        export default store
        
        //組件中調(diào)用
        import {INCREMENT} from 'mutation-types'
        <button @click="add"></button>
        methods: {
          add(){
            this.$store.commit(INCREMENT)
          }
        }
        //mutation-types.js
        export const INCREMENT = 'increment'
        export const DECREMENT = 'decrement'
        
    • VueX要求Mutation中的方法必須是同步方法

      • 主要原因是使用devtools時隔缀,devtools可以幫助我們捕捉mutation的快照
      • 但是如果是異步操作题造,那么devtools不能很好地追蹤這個操作什么時候會被完成
      • 不要在mutation中進行異步操作
  • Action

    • Action類似于Mutation,是用來代替Mutation進行異步操作的

      • //router/index.js
        import Vuex from 'vuex'
        import {INCREMENT, DECREMENT} from 'mutation-types'
        Vue.use(Vuex)   // 安裝插件猾瘸,會去調(diào)用插件的install方法
        const store = new Vuex.store({
          state: {
              info: {name: 'aaa', age: 18}
          },
          mutations: {
           updateInfo(state){
             state.info = 'bbb'
           }
          },
          actions: {
              aupdateInfo(context){   //默認攜帶context參數(shù)
              return new Promise((resolve, reject)=>{
                  setTimeout(()=>{
                          context.commit('updateInfo')
                }, 1000)  
                resolve()
              })
            }
          }
        })
        export default store
        
        //組件中調(diào)用
        <button @click="add"></button>
        methods: {
          update(){
              this.$store.dispatch('aupdateInfo').then(()=>{console.log('修改完成')})  //不帶參數(shù)
            this.$store.dispatch('aupdateInfo', payload) //攜帶參數(shù)
          }
        }
        
  • Module

    • Vue使用單一狀態(tài)樹晌梨,這樣當(dāng)應(yīng)用變得復(fù)雜時桥嗤,store對象可能變得非常臃腫,為了解決這個問題仔蝌,Vuex允許我們將store分割成模塊,每個模塊擁有自己的state荒吏、mutations敛惊、actions、getters等
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末绰更,一起剝皮案震驚了整個濱河市瞧挤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌儡湾,老刑警劉巖特恬,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異徐钠,居然都是意外死亡癌刽,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進店門尝丐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來显拜,“玉大人,你說我怎么就攤上這事爹袁≡盾” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵失息,是天一觀的道長譬淳。 經(jīng)常有香客問我,道長盹兢,這世上最難降的妖魔是什么邻梆? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮蛤迎,結(jié)果婚禮上确虱,老公的妹妹穿的比我還像新娘。我一直安慰自己替裆,他們只是感情好校辩,可當(dāng)我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著辆童,像睡著了一般宜咒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上把鉴,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天故黑,我揣著相機與錄音儿咱,去河邊找鬼。 笑死场晶,一個胖子當(dāng)著我的面吹牛混埠,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播诗轻,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼钳宪,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了扳炬?” 一聲冷哼從身側(cè)響起吏颖,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎恨樟,沒想到半個月后半醉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡劝术,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年缩多,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片夯尽。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡瞧壮,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出匙握,到底是詐尸還是另有隱情咆槽,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布圈纺,位于F島的核電站秦忿,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蛾娶。R本人自食惡果不足惜灯谣,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蛔琅。 院中可真熱鬧胎许,春花似錦、人聲如沸罗售。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽寨躁。三九已至穆碎,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間职恳,已是汗流浹背所禀。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工方面, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人色徘。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓恭金,卻偏偏與公主長得像,于是被迫代替她去往敵國和親贺氓。 傳聞我的和親對象是個殘疾皇子蔚叨,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,779評論 2 354

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

  • Vuex學(xué)習(xí) 一、Vuex是做什么的辙培? 官方解釋:Vuex是一個專為Vue.js應(yīng)用程序開發(fā)的狀態(tài)管理模式,它采用...
    waigo閱讀 266評論 0 0
  • 終于又開始學(xué)習(xí)了邢锯!最近有點瞎忙扬蕊,哎! Vuex 是一個專為 Vue.js 應(yīng)用程序開發(fā)的狀態(tài)管理模式丹擎。狀態(tài)管理尾抑,就...
    小本YuDL閱讀 262評論 0 0
  • Vuex是做什么的? 官方解釋:Vuex是一個專為Vue.js應(yīng)用程序開發(fā)的狀態(tài)管理模式蒂培。 它采用集中式存儲管理應(yīng)...
    Flipped_kk閱讀 338評論 0 4
  • Vuex 的學(xué)習(xí)記錄 資料參考網(wǎng)址Vuex中文官網(wǎng)Vuex項目結(jié)構(gòu)示例 -- 購物車Vuex 通俗版教程Nuxt....
    流云012閱讀 1,457評論 0 7
  • vuex 狀態(tài)管理器 作為應(yīng)用中所有組件的中央儲存 只能以預(yù)定的方式去操作狀態(tài) 把所有組件共享的狀態(tài)抽取出來作為全...
    一只大椰子閱讀 790評論 0 1