VueX 學習筆記

學習目的

? ? 了解和熟練使用 VueX,能夠在實際項目中運用。

VueX介紹

????Vuex 是一個專為 Vue.js 應用程序開發的狀態管理模式。它采用集中式存儲管理應用的所有組件的狀態,并以相應的規則保證狀態以一種可預測的方式發生變化。

? ? ? ? 所有組件的狀態,簡單來講,就是 data 里的屬性,如果有多個組件 需要使用同一個數據,使用 props 會顯得很復雜,尤其是非父子組件 和 父組件和后代組件 之間的數據傳輸問題,這時候就可以用到 VueX。

? ? ? ? 使用場景

? ? ? ? ?問題1:多個視圖依賴于同一狀態。

? ? ? ? 問題2:來自不同視圖的行為需要變更同一狀態。

? ? ? ? ?對于問題一,傳參的方法對于多層嵌套的組件將會非常繁瑣,并且對于兄弟組件間的狀態傳遞無能為力。對于問題二,我們經常會采用父子組件直接引用或者通過事件來變更和同步狀態的多份拷貝。以上的這些模式非常脆弱,通常會導致無法維護的代碼。

????????因此,我們為什么不把組件的共享狀態抽取出來,以一個全局單例模式管理呢?在這種模式下,我們的組件樹構成了一個巨大的“視圖”,不管在樹的哪個位置,任何組件都能獲取狀態或者觸發行為!

????????但是 官方推薦,不要為了使用 VueX 而去使用 VueX。官方推薦:

? ??????如果您不打算開發大型單頁應用,使用 Vuex 可能是繁瑣冗余的。確實是如此——如果您的應用夠簡單,您最好不要使用 Vuex。一個簡單的?global event bus?就足夠您所需了。但是,如果您需要構建一個中大型單頁應用,您很可能會考慮如何更好地在組件外部管理狀態,Vuex 將會成為自然而然的選擇。

? ? ? ?VueX安裝

? ? ? ? ? ? ? ?① npm install vuex --save-dev

? ? ? ? ? ? ? ?② 新建文件

在src文件下新建index.js

? ? ? ? ? ? ? ? ③ 在 index.js 里

引入vueX

? ? ? ? ? ? ? ? ④ 在入口文件main.js 引入

main中引入

? ? ? ? ? ? ? ? ⑤ 試用

試用
顯示成功

? ??????VeuX 核心

? ? ? ? ? ? ? ? ? State

? ? ? ? ? ? ? ? ? ?state 訪問狀態對象,就是? 所有組件 共享的數據。

? ????????????Vuex 的狀態存儲是響應式的。當 Vue 組件從 store 中讀取狀態的時候,若 store 中的狀態發生變化,那么相應的組件也會相應地得到高效更新。

? ? ? ? ? ? ? ?不能直接改變 store 中的狀態(就像 this.$store.state.XXX = XXXX)。改變 store 中的狀態的唯一途徑就是顯式地提交 (commit) mutation。這樣使得我們可以方便地跟蹤每一個狀態的變化,從而讓我們能夠實現一些工具幫助我們更好地了解我們的應用。

? ? ? ? ? ? ? ? ? ? 有以下幾種方式 在組件中使用 state:

? ? ? ? ? ? ? ? ? ? ① 直接用 {{ }} + $store.state.XXXX

store
方式1

? ? ? ? ? ? ? ? ? ? ② 通過computed的計算屬性直接賦值

computed技術屬性

? ? ? ? ? ? ? ? ? ? ③?通過?mapState?的對象來賦值

store
形式1: mapState的對象來賦值??
形式2: mapState的對象來賦值

? ? ? ? ? ? ? ? ? ? ? ? ④ 通過 mapState 的數組來賦值(最常用)

? ??????????????????????當映射的計算屬性的名稱state 的子節點名稱相同時,我們也可以給?mapState?傳一個字符串數組。

?mapState的數組來賦值??

? ? ? ? ? ? ? ? ? ?Getters

? ??????????????????可以認為是 store 的計算屬性

store的計算屬性

? ? ? ? ? ? ? ? ? ? ? ?使用 getter 的幾種方式

? ? ? ? ? ? ? ? ? ? ? ? ? ? 記住? ?import { mapGetters } from 'vuex'

getter

? ? ? ? ? ? ? ? ? ? Mutations(mutation 必須是同步函數)

????????????更改 Vuex 的 store 中的狀態的唯一方法是提交 mutation。Vuex 中的 mutation 非常類似于事件:每個 mutation 都有一個字符串的?事件類型 (type)?和 一個?回調函數 (handler)。這個回調函數就是我們實際進行狀態更改的地方,并且它會接受 state 作為第一個參數

? ??????????????? ????可以認為是?store 的 methods

Mutations
使用方式

? ? ? ? ? ? ? ? ? ???Mutations的回調函數接收第二個參數,一般是一個對象

第二個參數
參數的使用

? ? ? ? ? ? ? ? ? ? ? ? ? ? 第二個參數為對象的使用情況

第二個參數是對象

Mutation 需遵守 Vue 的響應規則:

? ? ? 1.? 最好提前在你的 store 中初始化好所有所需屬性(上圖的注冊 text)

第二個參數是對象

? ? ? ? ? ? 在組件的methods中?

? ??????????????將 `this.add()` 映射為 `this.$store.commit('add')`

? ???????????????將 `this.reduce()` 映射為 `this.$store.commit('reduce')`


? ??????????????????Actions

? ? ? ? ? ? ? ? ?Action 類似于 mutation,不同在于:Action 提交的是 mutation,而不是直接變更狀態。Action 可以包含任意異步操作

? ???????????????Action 函數接受一個與 store 實例具有相同方法和屬性的 context 對象,因此你可以調用?context.commit?提交一個 mutation,或者通過?context.state?和?context.getters?來獲取 state 和 getters。


actions
2種用法

? ? ? ? ? ? 也可以只直接在組件中使用 this.$stroe.dispathc( ' addAction' )

? ? ? ? ? ? 更多關于actions的異步操作的情況,可以參考官網上的例子。


? ??????????????????Module

????????????????由于使用單一狀態樹,應用的所有狀態會集中到一個比較大的對象。當應用變得非常復雜時,store 對象就有可能變得相當臃腫。為了解決以上問題,Vuex 允許我們將 store 分割成模塊(module)。每個模塊擁有自己的 state、mutation、action、getter、甚至是嵌套子模塊——從上至下進行同樣方式的分割,便于維護。

???????Module
getters

? ? ? ? ? ? ? ? ? ? ? ? 默認情況下,模塊內部的 action、mutationgetter 是注冊在全局命名空間的——這樣使得多個模塊能夠對同一 mutation 或 action 作出響應。

? ? ? ? ? ? ? ? ? ? ? ?如果希望你的模塊具有更高的封裝度和復用性,你可以通過添加?namespaced: true?的方式使其成為帶命名空間的模塊。當模塊被注冊后,它的所有 getter、action mutation 都會自動根據模塊注冊的路徑調整命名。【模塊名/函數名】

使用

? ??????????????????????Module更多用法請參考官網? ?VueX 文檔??

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

推薦閱讀更多精彩內容

  • Vuex 是什么? ** 官方解釋:Vuex 是一個專為 Vue.js 應用程序開發的狀態管理模式**。它采用集中...
    Rz______閱讀 2,315評論 1 10
  • vuex學習筆記 vuex是什么? Vuex 是一個專為 Vue.js 應用程序開發的狀態管理模式。它采用集中式存...
    EL_PSY_CONGROO閱讀 774評論 0 0
  • vuex 狀態管理器 作為應用中所有組件的中央儲存 只能以預定的方式去操作狀態 把所有組件共享的狀態抽取出來作為全...
    一只大椰子閱讀 795評論 0 1
  • 安裝 npm npm install vuex --save 在一個模塊化的打包系統中,您必須顯式地通過Vue.u...
    蕭玄辭閱讀 2,960評論 0 7
  • Vuex 是一個專為 Vue.js 應用程序開發的狀態管理模式。它采用集中式存儲管理應用的所有組件的狀態,并以相應...
    白水螺絲閱讀 4,675評論 7 61