學習筆記《Vuex 的響應式編程》

項目使用 Flux 模式來實現的 SPA,Vuex 是不可繞過的

Flux 是一種架構思想,專門解決軟件的結構問題。它跟MVC 架構是同一類東西,但是更加簡單和清晰。
from http://www.ruanyifeng.com/blog/2016/01/flux.html

網上有一本電子書:《Vuex Concepts: The Flux Application Architecture for Vue.js》對 Vuex 是 Flux 實現介紹的非常深入淺出,可以搜索到下載地址:
https://leanpub.com/vuex

官方文檔是必要的手冊補充:
https://vuex.vuejs.org/en/

(本文以下內容為目前自身項目的階段性設計,所以不建議閱讀)

步驟一:

通過異步請求的方式,從后端獲取到頁面需要的數據,將獲取到的數據保存到 Vuex 中

建立 store.js 作為 Vuex 的數據存放對象,使用 axios 對數據進行異步加載:

import Vue from 'vue'
import Vuex from 'vuex'
import axios from 'axios'
import VueAxios from 'vue-axios'

Vue.use(Vuex, VueAxios, axios)

export default new Vuex.Store({
  state: {
    courses: {} // 如果需要深度響應,必須寫清楚對象,形如:courses: {a:''}
  },
  mutations: {
    setCourses (state, res) {
      state.courses = res
    }
  },
  actions: {
    getCourses (store) {
      axios.get('/getCourses').then((response) => {
        store.commit('setCourses', response.data)
      })
    }
  }
})

在任何頁面中(一般在 layout 中)調用基于 Vue 對象的這段代碼,就可以對 Vuex 中的數據進行初始化:

this.$store.dispatch('getCourses')

步驟二:

子模塊響應 Vuex 中的數據變化,調用 Vuex 的 getters 接口獲取最新加載的數據,并渲染頁面

先將 Vuex 中的數據對象映射到子模塊中

computed: mapState([
  'courses'
]),

然后對這個數據對象建立 watch 監控 courses 的數據變化

watch:{
  courses:function(){
    this.courseName = this.$store.getters.getCourseById(this.courseId).courseName;
  }
},

上面的例子里面使用了 Vuex 的 getters 接口,方便數據獲取的封裝處理,getters 定義在 store.js 中:

getters: {
    getCourseById: (state, getters) => (id) => {
      return state.courses.find(course => course.course_id == id)
    }
  }

踩坑:

  • 子模塊中如果有同名的數據對象,會讓 Vuex 的響應失敗,比如前面的例子中,如果有這樣的代碼在預定義中:

    data () {
      return {
        courses: ''
      }
    },
    

getters mutations actions 三者的差異:

  • getters:第一個參數是 state,可以拿到數據,getters會暴露給 store.getters 進行直接調用
  • mutations:第一個參數是 state,相當于 setters,可以對 state 進行直接的寫入操作
  • actions:參數中沒有 state,所以不能直接的操作 state 的值,但是可以調用 getters 和 mutations 來進行對數據變化的控制

深度響應問題

有時候因為 state 的結構會比較復雜,而默認用 state.test.a = value 這樣的方式是無法響應的,所以需要用:

mutations: {
  setTest (state, value) {
    Vue.set(state.test, 'a', value)
  },
},

mapState 和 mapActions

Vue 提供了 mapState 和 mapActions 兩個方法,可以將 Vuex 里面的 state 和 actions 映射到 components 里面,于是可以在 components 中這么使用:

this.stateName
this.actionName()

PS:mapState 必須在 computed 屬性中使用,mapActions 必須在 methods 方法中使用

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,748評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,165評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,595評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,633評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,435評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,943評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,035評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,175評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,713評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,599評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,788評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,303評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,034評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,412評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,664評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,408評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,747評論 2 370

推薦閱讀更多精彩內容

  • 安裝 npm npm install vuex --save 在一個模塊化的打包系統中,您必須顯式地通過Vue.u...
    蕭玄辭閱讀 2,957評論 0 7
  • Vuex是什么? Vuex 是一個專為 Vue.js應用程序開發的狀態管理模式。它采用集中式存儲管理應用的所有組件...
    蕭玄辭閱讀 3,130評論 0 6
  • vuex 場景重現:一個用戶在注冊頁面注冊了手機號碼,跳轉到登錄頁面也想拿到這個手機號碼,你可以通過vue的組件化...
    sunny519111閱讀 8,027評論 4 111
  • Vuex 是什么? ** 官方解釋:Vuex 是一個專為 Vue.js 應用程序開發的狀態管理模式**。它采用集中...
    Rz______閱讀 2,315評論 1 10
  • 上一章總結了 Vuex 的框架原理,這一章我們將從 Vuex 的入口文件開始,分步驟閱讀和解析源碼。由于 Vuex...
    你的肖同學閱讀 1,803評論 3 16