vuex入門

Vuex 是什么臣嚣?

Vuex 是一個專為 Vue.js 應(yīng)用程序開發(fā)的狀態(tài)管理模式亭病。它采用集中式存儲管理應(yīng)用的所有組件的狀態(tài)谴垫,并以相應(yīng)的規(guī)則保證狀態(tài)以一種可預(yù)測的方式發(fā)生變化富弦。Vuex 也集成到 Vue 的官方調(diào)試工具 devtools extension而线,提供了諸如零配置的 time-travel 調(diào)試、狀態(tài)快照導(dǎo)入導(dǎo)出等高級調(diào)試功能嗡官。
Vuex的核心

vuex由以下幾部分組成:

  • state
  • mutations
  • getters
  • actions
  • modules
state里面就是存放項目中需要多組件共享的狀態(tài)
mutations就是存放更改state里狀態(tài)的方法
getters就是從state中派生出狀態(tài)箭窜,比如將state中的某個狀態(tài)進行過濾然后獲取新的狀態(tài)。
actions就是mutation的加強版衍腥,它可以通過commit mutations中的方法來改變狀態(tài)绽快,最重要的是它可以進行異步操作芥丧。
modules顧名思義,就是當用這個容器來裝這些狀態(tài)還是顯得混亂的時候坊罢,我們就可以把容器分成幾塊续担,把狀態(tài)和管理規(guī)則分類來裝。這和我們創(chuàng)建js模塊是一個目的活孩,讓代碼結(jié)構(gòu)更清晰物遇。

實例理解vuex

main.js
import Vue from 'vue'
import App from './App'
import router from './router'
import store from './store.js'
var vm = new Vue({
        el: '#app',
        router,
        store,
        template: '<App/>',
        components: { App }
})
store.js
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex);
const state = {  //數(shù)據(jù)存儲
        count:10,
};
const mutations = { //數(shù)據(jù)處理
  increment(state) {
        state.count++;
  },
  decrement(state) {
        state.count--;
  }
};
const actions = { //=處理你要怎么做,比如異步請求憾儒,判斷询兴,流程控制等commit講請求提交到mutation里面
        increment:({commit})=>{
                commit('increment');
        },
        decrement:({commit})=>{
                commit('decrement');
        },
        increDouble:({commit,state})=>{
                if(state.count%2==0){
                         commit('increment');
                }
        },
        decreOnly:({commit,state})=>{
                if (state.count%2!=0) {
                        commit('decrement');
                 }
         },
        clickAnsy:({commit})=>{//可以通過promise異步獲取數(shù)據(jù)
                new Promise(function(resolve, reject) {
                        setTimeout(()=>{
                                commit('increment');
                                resolve();
                        },1000)
                });
         }
}
const getters={
        nowNum(state){
                 return state.count;
        },
        getOdd(state) {
                return state.count%2==0?'偶數(shù)':'奇數(shù)';
         }
}
export default new Vuex.Store({
        state,
        mutations,
        actions,
        getters
});
App.Vue
<template>
  <div id="app">
    <h2>vue全局組件use使用</h2>
    <h2>vuex的使用</h2>
    <input type="button" value="增加" @click="increment"/>
    <input type="button" value="減少" @click="decrement"/>
    <input type="button" value="偶數(shù)時可點擊+" @click="increDouble"/>
    <input type="button" value="奇數(shù)時可點擊-" @click="decreOnly"/>
    <input type="button" value="異步處理" @click="clickAnsy"/>
    <div>現(xiàn)在的數(shù)字為:{{nowNum}}  它現(xiàn)在是{{getOdd}}</div>
    <button @click="test"> 1 </button>
  </div>
</template>

<script>
import {mapActions,mapGetters} from 'vuex'
export default {
  name: 'app',
  computed:{
    ...mapGetters([
      'nowNum',
      'getOdd'
    ])
  },
  methods:{
    ...mapActions([
              'increment',
              'decrement',
              'increDouble',
              'decreOnly',
              'clickAnsy'
            ]),
      test(){
        this.$store.dispatch('increment')
      }
  },
   mounted:function () {
     console.log(this.$store)
   }
}
</script>

現(xiàn)在vuex內(nèi)的定義已經(jīng)完成,可以再組件內(nèi)調(diào)用起趾,獲取了

獲取state內(nèi)值方法一:

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

方法二 利用mapState 輔助函數(shù)

import { mapState } from 'vuex'
export default {
  // ...
  computed: mapState({
    // 箭頭函數(shù)可使代碼更簡練
    count: state => state.count,
    // 傳字符串參數(shù) 'count' 等同于 `state => state.count`
    countAlias: 'count',
    // 為了能夠使用 `this` 獲取局部狀態(tài)诗舰,必須使用常規(guī)函數(shù)
    countPlusLocalState (state) {
      return state.count + this.localCount
    }
  })
}

對象展開運算符
mapState函數(shù)返回的是一個對象。我們?nèi)绾螌⑺c局部計算屬性混合使用呢训裆?通常眶根,我們需要使用一個工具函數(shù)將多個對象合并為一個,以使我們可以將最終對象傳給 computed
屬性边琉。但是自從有了對象展開運算符(現(xiàn)處于 ECMASCript 提案 stage-3 階段)属百,我們可以極大地簡化寫法:

computed: {
  localComputed () { /* ... */ },
  // 使用對象展開運算符將此對象混入到外部對象中
  ...mapState({
    // ...
  })
}

Mutations

更改 Vuex 的 store 中的狀態(tài)的唯一方法是提交 mutation。Vuex 中的 mutations 非常類似于事件:每個 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砍鸠,你需要以相應(yīng)的 type 調(diào)用 store.commit 方法:

store.commit('increment')

提交載荷(Payload)
你可以向 store.commit 傳入額外的參數(shù)扩氢,即 mutation 的 載荷(payload):

mutations: {
  increment (state, n) {
    state.count += n
  }
}
store.commit('increment', 10)

在組件中提交 Mutations

你可以在組件中使用 this.$store.commit('xxx') 提交 mutation,或者使用 mapMutations 輔助函數(shù)將組件中的 methods 映射為 store.commit 調(diào)用(需要在根節(jié)點注入 store)睦番。

import { mapMutations } from 'vuex'
export default {
  methods: {
    ...mapMutations([
      'increment' // 映射 this.increment() 為 this.$store.commit('increment')
    ]),
    ...mapMutations({
      add: 'increment' // 映射 this.add() 為 this.$store.commit('increment')
    })
  }
}

Actions

Action 類似于 mutation类茂,不同在于:

  • Action 提交的是 mutation耍属,而不是直接變更狀態(tài)托嚣。
  • Action 可以包含任意異步操作。

組件內(nèi) 可以通過Action 通過 store.dispatch 方法觸發(fā):觸發(fā)
Actions 支持同樣的載荷方式和對象方式進行分發(fā):

// 以載荷形式分發(fā)
store.dispatch('incrementAsync', {
  amount: 10
})
// 以對象形式分發(fā)
store.dispatch({
  type: 'incrementAsync',
  amount: 10
})

vuex內(nèi)的actions 會通過第二參數(shù)獲取

const actions = {
        increment:({commit} , test)=>{
                commit('increment' ,test);
        },
 }

modules

通過modules 創(chuàng)建的vuex state 是分模塊的厚骗,其他 mutations 和 actions 都不分模塊 如果重復(fù)命名會調(diào)用兩次 getters函數(shù)命名重復(fù)會報錯

    使用的時候 獲取state值 使用  this.$store.(模塊名)+字段名   
    調(diào)用actions mutations 同單store
    注意分modules 的vuex 的模塊只
      export default {
            state,
            getters,
            actions,
            mutations
      }


    不實例化vuex
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末示启,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子领舰,更是在濱河造成了極大的恐慌夫嗓,老刑警劉巖迟螺,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異舍咖,居然都是意外死亡矩父,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門排霉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來窍株,“玉大人,你說我怎么就攤上這事攻柠∏蚨” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵瑰钮,是天一觀的道長冒滩。 經(jīng)常有香客問我,道長浪谴,這世上最難降的妖魔是什么开睡? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮较店,結(jié)果婚禮上士八,老公的妹妹穿的比我還像新娘。我一直安慰自己梁呈,他們只是感情好婚度,可當我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著官卡,像睡著了一般蝗茁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上寻咒,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天哮翘,我揣著相機與錄音,去河邊找鬼毛秘。 笑死饭寺,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的叫挟。 我是一名探鬼主播艰匙,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼抹恳!你這毒婦竟也來了员凝?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤奋献,失蹤者是張志新(化名)和其女友劉穎健霹,沒想到半個月后旺上,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡糖埋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年宣吱,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瞳别。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡凌节,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出洒试,到底是詐尸還是另有隱情倍奢,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布垒棋,位于F島的核電站卒煞,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏叼架。R本人自食惡果不足惜畔裕,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望乖订。 院中可真熱鬧扮饶,春花似錦、人聲如沸乍构。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽哥遮。三九已至岂丘,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間眠饮,已是汗流浹背奥帘。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留仪召,地道東北人寨蹋。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像扔茅,于是被迫代替她去往敵國和親已旧。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,472評論 2 348

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

  • 安裝 npm npm install vuex --save 在一個模塊化的打包系統(tǒng)中咖摹,您必須顯式地通過Vue.u...
    蕭玄辭閱讀 2,927評論 0 7
  • Vuex是什么评姨? Vuex 是一個專為 Vue.js應(yīng)用程序開發(fā)的狀態(tài)管理模式难述。它采用集中式存儲管理應(yīng)用的所有組件...
    蕭玄辭閱讀 3,109評論 0 6
  • Vuex 的學(xué)習(xí)記錄 資料參考網(wǎng)址Vuex中文官網(wǎng)Vuex項目結(jié)構(gòu)示例 -- 購物車Vuex 通俗版教程Nuxt....
    流云012閱讀 1,452評論 0 7
  • import Vue from 'vue'; import Vuex from 'vuex'; Vue.use(V...
    F_imok閱讀 2,646評論 0 12
  • 跟著“清晨朗讀會”嗦枢,我已經(jīng)每日朗讀了幾個月,非常喜歡屯断,所以決定今天推薦一下文虏。 “清晨朗讀會”是John Gordo...
    格紫英文閱讀 906評論 0 1