在上一章節中,咱們列舉了在Vue中能用但在mpvue中不能用或須要特別注意的特性,在實際開發前瞭解一下仍是頗有必要的,能夠避免浪費找錯誤的時間。html
若是你使用過原生的小程序框架,你必定經歷過或思考過怎麼解決如下的問題:vue
網上一搜,解決的方法一般也是五花八門的,什麼經過app上的globalData啊、經過存取storage啊、經過一個單獨的模塊(module)啊、經過Page路由棧啊、經過引入自定義事件啊、經過引入redux啊,等等等等......vuex
在原生小程序框架裏,確實沒有提供什麼太統一的方式來指導開發者解決這個問題,你們只能各自用着暫時能解決當前問題的方案。redux
不過,既然咱們用了Vue/mpvue,遇到這種狀況,天然而然的就會想到一個方案,那就是Vuex。Vuex 是一個專爲 Vue 應用程序開發的狀態管理模式,它採用集中式存儲管理應用的全部組件的狀態,並以相應的規則保證狀態以一種可預測的方式發生變化。小程序
經過使用Vuex,咱們能夠在mpvue裏很方便的對須要在app、頁面、組件之間共享的數據進行很好的統一管理,能夠更方便有效的在各個代碼部分對這些共享數據進行訪問,同時可使得你的代碼條理變得更加清晰。app
咱們知道,Vuex通常有2種用法,當建立好store後:框架
第一種用法是將store綁定到須要訪問store內容的Vue實例上,而後經過該Vue實例下組件的this.$store
來引用;或經過mapState
等一系列映射函數將store中的state、getters、mutations、actions等映射成組件的計算屬性或methods方法來使用;函數
第二種用法是直接在組件中經過import
導入store所在的模塊文件,而後調用該store上的相關方法和屬性,好比commit()
、dispatch()
等方法來操做store中的內容。工具
通過個人實測,上面的這兩種方式在mpvue中也都是可用的。可是,因爲mpvue不像Vue Web單頁應用那種單Vue實例的結構,而是採用了多Vue實例的結構(app和各個頁面都會由單獨的Vue實例來管理),因此我我的推薦採用上面所說的第二種用法,這種方式會更加靈活和簡單一些。flex
讓咱們開始寫代碼,先在src
目錄下新建一個stores目錄,接着在stores目錄下新建一個名爲global-store.js
的文件:
import Vue from 'vue' import Vuex from 'vuex'; Vue.use(Vuex); export default new Vuex.Store({ state: { count: 0 }, mutations: { increment: (state) => { state.count += 1 }, decrement: (state) => { state.count -= 1 } } });
在這個代碼中,咱們新建了一個Store
實例,管理了一個名爲count
的數字類型的狀態,並定義了2個mutations去操做(增減)這個狀態值。
接着,咱們要在2個頁面中訪問這個store。讓咱們在src/pages
目錄下編寫2個頁面:index和test1。
這是pages/index/index.vue
的代碼內容:
<template> <div class="container"> <div>計數結果:{{count}}</div> <a href="/pages/test1/main" class="navlink">進入計數器頁面</a> </div> </template> <script> import globalStore from "../../stores/global-store"; export default { computed: { count() { return globalStore.state.count; } } }; </script> <style scoped> .navlink { text-decoration: underline; } </style>
這是pages/test1/index.vue
的代碼內容:
<template> <div class="container btns"> <button class="calbtn" @click="hanleDecrement">-</button> <span class="calnum">{{count}}</span> <button class="calbtn" @click="hanleIncrement">+</button> </div> </template> <script> import globalStore from "../../stores/global-store"; export default { computed: { count() { return globalStore.state.count; } }, methods: { hanleIncrement() { globalStore.commit("increment"); }, hanleDecrement() { globalStore.commit("decrement"); } } }; </script> <style scoped> .btns { display: flex; align-items: center; } .calnum { color: red; font-size: 32px; } </style>
這樣,咱們就有了2個使用了咱們定義的global-store的頁面,這些頁面都會從store中獲取count
狀態值並顯示;在test1頁面中,還會調用increment
和decrement
兩個mutations去更新count
值。
運行小程序,能夠看到初始進入index頁面時是這樣的,頁面上顯示的計數結果是0:
而後點擊「進入計數器頁面」進到test1頁面,並在這個頁面上點擊加減按鈕操做一下,當中顯示的count數會發生改變:
最後,點擊左上角返回按鈕返回index頁面,你將發現這個頁面上的計數結果也已經發生了改變,自動同步成前面操做後的結果了:
經過這個例子,是否是感受到使用Vuex作頁面間的傳值和數據同步特別簡單?另外,你也能夠在src/stores
目錄下按需建立多個store模塊,獨立管理不一樣業務範圍的數據,並按需導入頁面組件使用。
Vuex是開發中一件很是得力的工具,但願你能儘快掌握它。更多的用法能夠參考官方文檔。