vuex的使用

配置 vuex 和 vuex 本地持久化

目錄

  1. vuex是什么

  2. vuex 的五個(gè)核心概念

    • State 定義狀態(tài)(變量)
    • Getter 獲取狀態(tài)(變量的值)
    • Mutation 修改狀態(tài)(修改變量的值)
    • Action 觸發(fā) mutation 函數(shù),從而修改狀態(tài)
    • Module 當(dāng)狀態(tài)很多時(shí),把狀態(tài)分開來管理
  3. 通過vuex進(jìn)行跨組件通信

  4. vuex 本地持久化

(一) vuex是什么

Vuex 是一個(gè)專為 Vue.js 應(yīng)用程序開發(fā)的狀態(tài)管理模式。它采用集中式存儲(chǔ)管理應(yīng)用的所有組件的狀態(tài),并以相應(yīng)的規(guī)則保證狀態(tài)以一種可預(yù)測的方式發(fā)生變化。

  1. 狀態(tài): 本質(zhì)上就是一個(gè)變量,賦予不同的值就是不同的狀態(tài),管理狀態(tài)實(shí)際上就是管理一堆變量
  2. 響應(yīng)式,vuex跟全局變量不同,修改了vuex的某個(gè)狀態(tài),依賴這個(gè)狀態(tài)的視圖都會(huì)發(fā)生改變

(二) vuex的5個(gè)核心概念

1. State 定義狀態(tài)(變量), 輔助函數(shù)mapState
2. Getter 獲取狀態(tài)(變量的值),同時(shí)可以對狀態(tài)進(jìn)行處理, 輔助函數(shù)mapGetters
3. Mutation 修改狀態(tài)(修改變量的值)
4. Action 觸發(fā) mutation 函數(shù),從而修改狀態(tài),支持異步
5. Module 當(dāng)狀態(tài)很多時(shí),把狀態(tài)分開來管理

(三) 配置vuex

  1. 安裝vuex
    npm i vuex
    
  1. vuex配置

    在根目錄新建/store/index.js

    import Vue from 'vue'
    import Vuex from 'vuex'
    
    Vue.use(Vuex);
    
    const config = {
        // 定義狀態(tài)
        state: {
            isLogin: false
        },
    
        // getters
        getters: {
            // isLogin:(state) =>{
            //     return state.isLogin;
            // },
            // 等同上面的寫法
            isLogin: state => state.isLogin
        },
    
        // 修改state里面的變量
        mutations: {
            // state指向上面的state,payload是調(diào)用muation時(shí)傳過來的參數(shù)
            updateLogin(state, payload) {
                state.isLogin = payload;
            }
        },
    
        // action行為
        actions: {
    
        },
    
        // module
        modules: {
    
        }
    }
    export default new Vuex.Store(config);
    
  2. 在main.js導(dǎo)入并掛載到vue的實(shí)例上
    import Vue from 'vue'
    import App from './App.vue'
    import store from './store/index'
    
    Vue.config.productionTip = false
    
    new Vue({
      store,
      render: h => h(App),
    }).$mount('#app')
    

(四) 獲取在vuex定義的狀態(tài)

  1. 通過this.$store.state.xxx 來取,具體使用
    created() {
        console.log(this.$store.state.isLogin);
        console.log(this.$store.state.firstName);
    }
    
    // 通常我們會(huì)定義計(jì)算屬性來取值,比如
    computed: {
        // 自定義計(jì)算屬性
        isLogin() {
          // 獲取vuex的isLogin的值
          return this.$store.state.isLogin
        }
    }
    
  2. 通過輔助函數(shù)mapState來獲取
      import {mapState} from 'vuex'
      
      data() {
        return {
          addr: '廣西'
        };
      },
     
     computed: mapState({
        // 取state里count的值
        count: 'count',
     // 取state里count的值,用countAlias變量接收
        countAlias: 'count',
        // 為了能夠使用 `this` 獲取局部狀態(tài),必須使用常規(guī)函數(shù)
        fullName(state) {
          return this.addr + state.firstName + state.lastName;
        }
      })
      
     // 如果需要定義其它的計(jì)算屬性,就按照下面的寫法
     computed: {
         // 其他的計(jì)算屬性
         total() {
             return 500
         },
         ...mapState({
               // 取state里count的值
                count: 'count',
                // 取state里count的值,用countAlias變量接收
                countAlias: 'count',
                // 為了能夠使用 `this` 獲取局部狀態(tài),必須使用常規(guī)函數(shù)
                fullName(state) {
                  return this.addr + state.firstName + state.lastName;
                }
          })
     }
    
  3. 通過getters和mapGetters來取
    // 定義一個(gè)用來獲取fullName的getter
      getters: {
            fullName(state) {
                return state.firstName + state.lastName;
            }
        },
    
    // 通過mapGetters
    import {mapGetters} from 'vuex';
    
    computed: {
         fullName() {
             return this.$store.getters.fullName;
         }
    }
    

    使用getters的好處是,當(dāng)我們在vuex中的index.js的文件中定義好了getters的方法,我們可以在任意的組件中使用getters的方法,非常的方便。例如我們有一個(gè)組件a.vue,需要使用到getters的方法,我們直接在該組件的計(jì)算屬性computed中使用即可:

    computed: {
         fullName() {
             return this.$store.getters.fullName;
         }
    }
    

(五) 修改state中的狀態(tài)

  1. 定義state和mutation

    import Vue from 'vue'
    import Vuex from 'vuex'
    Vue.use(Vuex)
    
    export default new Vuex.Store({
        state: {
            name: "沒名字",
            count: 1
        },
        getters: {
    
        },
        // 修改state里的值必須通過mutation來修改
        mutations: {
            /**
             * 定義一個(gè)修改name的mutation
             * state是上面的定義的state
             * payload是新的數(shù)據(jù)
             */
            updateName(state, payload) {
                state.name = payload;
            }
        }
    })
    
  2. 在需要的時(shí)候調(diào)用mutation進(jìn)行修改state里的name狀態(tài)

```
// 第一個(gè)參數(shù)是mutation的名字,第二參數(shù)是要修改成的數(shù)據(jù)
this.$store.commit('updateName','老胡');
```

(六) 綜合例子: 通過vuex實(shí)現(xiàn)加減

  1. 在vuex里配置state和mutation

    import Vue from 'vue'
    import Vuex from 'vuex'
    Vue.use(Vuex)
    
    export default new Vuex.Store({
        state: {
            count: 0
        },
    
        mutations: {
            addOne(state, payload) {
                state.count = state.count + 1;
            },
            minusOne(state, payload) {
                if (state.count > 0) {
                    state.count = state.count - 1;
                }
            }
        }
    })
    
  2. index.vue的配置

    <template>
      <div>
        <button @click="minus">-</button>
        <span>{{count}}</span>
        <button @click="add">+</button>
      </div>
    </template>
    
    <script>
    import { mapState } from "vuex";
    export default {
      computed: mapState({
        count: "count"
      }),
    
      methods: {
        add() {
          this.$store.commit("addOne");
        },
        minus() {
          this.$store.commit("minusOne");
        }
      }
    };
    </script>
    

(六) vuex 本地持久化

當(dāng)刷新頁面,項(xiàng)目重新加載,vuex 會(huì)重置,所有狀態(tài)回到初始狀態(tài),使用 vuex-persistedstate 可以避免這種情況

  1. 安裝 vuex-persistedstate

    npm i vuex-persistedstate
    
  2. 在vuex中,添加plugins

     import createPersistedState from 'vuex-persistedstate'
     
     plugins: [createPersistedState()],
    

    // 具體例子如下

import Vue from 'vue';
import Vuex from 'vuex';
import createPersistedState from 'vuex-persistedstate'
// 導(dǎo)入模塊
import login from './module/login'
import my from './module/my'
Vue.use(Vuex);
export default new Vuex({
    plugins: [createPersistedState()],
    // 模塊
    modules: {
      login,
      my
    },
    state: {
        isLogin: false,
        username: '',
        token: ''
    },
    getters: {
        isLogin: state => state.isLogin,
        token: state => state.token,
        username: state => state.username
    },
    mutations: {
        updateLogin(state, payload) {
            state.isLogin = payload;
        },
        updateToken(state, payload) {
            state.token = payload;
        },
        updateUsername(state, payload) {
            state.username = payload;
        }
    },
    actions: {
      LoginAction({commit}, payload) {
        commit('updateLogin',payload)
      },
      TokenAction({commit}, payload) {
        commit('updateToken',payload)
      },
      UsernameAction({commit}, payload) {
        commit('updateUsername',payload)
      },
    }
})

(七) modules的使用

就是為了分塊管理,當(dāng)我們的狀態(tài)太多的時(shí)候,全寫在vuex中不易于管理,我們需要在外面的文件寫好后,然后再倒進(jìn)來,就像我們的后端接口model一樣,都是為了方便管理

  1. 配置模塊的vuex

    export default {
        state: {
            cartNum: 10
        },
    
        getters: {
    
        },
    
        mutations: {
            updateCartNum(state, payload) {
                state.cartNum = payload;
            }
        },
    
        actions: {
    
        }
    }
    
  2. 獲取狀態(tài)

    <template>
      <div>{{cartNum}}</div>
    </template>
    
    <script>
    import { mapState } from "vuex";
    export default {
      computed: mapState({
        cartNum(state) {
          return state.cart.cartNum;
        }
      })
    };
    </script>
    

在vuex的index.js中導(dǎo)入模塊


image.png
  1. 修改狀態(tài)

     this.$store.commit("updateCartNum", 200);
    

(八) action

Action 類似于 mutation,都是用來修改vuex的狀態(tài), 不同在于:

  • Action 提交的是 mutation,而不是直接變更狀態(tài)。
  • Action 可以包含任意異步操作。
  1. 配置action

    import Vue from 'vue'
    import Vuex from 'vuex'
    Vue.use(Vuex)
    
    export default new Vuex.Store({
        state: {
            num: 10
        },
    
        mutations: {
            updateNum(state, payload) {
                state.num = payload;
            }
        },
    
        actions: {
            /**
             * 修改num的action
             * @param {*} ctx 可以拿到一個(gè)類似store的實(shí)例
             * @param {*} payload 修改的數(shù)據(jù)
             */
            updateNum(ctx, payload) {
                setTimeout(() => {
                    ctx.commit('updateNum', payload);
                }, 3000)
            }
        }
    })
    
  2. 派發(fā)action,在需要的地方,調(diào)用以下方法

     this.$store.dispatch("updateNum", 500);
    
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,283評論 6 530
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 97,947評論 3 413
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,094評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,485評論 1 308
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,268評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,817評論 1 321
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,906評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,039評論 0 285
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,551評論 1 331
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,502評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,662評論 1 366
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,188評論 5 356
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 43,907評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,304評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,563評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,255評論 3 389
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,637評論 2 370

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

  • 目錄 vuex是什么 vuex 的五個(gè)核心概念State 定義狀態(tài)(變量)Getter 獲取狀態(tài)(變量的值)Mut...
    北冥有魚_425c閱讀 751評論 0 5
  • ### store 1. Vue 組件中獲得 Vuex 狀態(tài) ```js //方式一 全局引入單例類 // 創(chuàng)建一...
    蕓豆_6a86閱讀 350評論 0 0
  • 安裝 npm npm install vuex --save 在一個(gè)模塊化的打包系統(tǒng)中,您必須顯式地通過Vue.u...
    蕭玄辭閱讀 2,956評論 0 7
  • 從別處搬的代碼用久了,一直不知道Vuex具體是為了干什么的,該怎么去用它。 Vuex是什么vuex的核心是一個(gè)st...
    格子GiMi閱讀 314評論 0 0
  • 瑋蓮 在這個(gè)自然繁華的春天里 在這個(gè)人們吵著盡享花開的春天里 春風(fēng)吹來你的名字—— 海子 讀著《面朝大海,春暖花開...
    驕陽下的一朵蓮閱讀 528評論 7 14