VUE-8:數(shù)據(jù)傳遞Vuex

為什么要用?vuex?辣辫?

????????首先渴逻,需要清楚為什么要用?vuex?,當我們的應(yīng)用遇到?**多個組件共享狀態(tài)**?時

????????????????-?多層級父子組件狀態(tài)傳遞會特別繁瑣

????????????????-?非嵌套父子組件狀態(tài)傳遞也會特別繁瑣


vuex

????????Vuex?是一個專為?Vue.js?應(yīng)用程序開發(fā)的?**狀態(tài)管理模式**,類似?redux


這種狀態(tài)管理模式包含:

????????這種模式遵循的是?單向數(shù)據(jù)流?模式


vuex?的工作流

Actions和Mutations可以說成是一個差不多的

安裝?vuex

? ??????npm?i?vuex

????????????//?or

????????yarn?add?vuex


引入?vuex

? ??????通過?`import`?引入

? ? ? ? ? ????????? 通過?`import`?方式引入匆篓,需要手動安裝(手動調(diào)用?`Vue.use(Vuex)`)

? ??????通過?\<script\>?引入

????????????????????通過?\<script\>?方式引入,vuex?會自動安裝(也就是主動調(diào)用?`Vue.use(Vuex)`)


從?Store?開始

? ? ? ? `Store`? 就是倉庫寇窑,我們前面提到的?`state`?就存儲在?`store`?中鸦概,同時提交動作、修改狀態(tài)的方法也都由?`store`?提供和管理

創(chuàng)建一個?Store

import?Vue?from?'vue'

import?Vuex?from?'vuex'

Vue.use(Vuex)

let?store?=?new?Vuex.Store({

????state:?{},

????getters:?{},

????mutations:?{},

????actions:?{}

})

????????????必須在?`Vue.use(Vuex)`?之后創(chuàng)建?`store`

核心概念

????????-?state

????????-?getters

????????-?actions

????????-?mutations


state

state?的創(chuàng)建

????????存儲應(yīng)用狀態(tài)數(shù)據(jù)的對象甩骏,`state`?的值可以是一個對象窗市,也可以是一個返回對象的函數(shù)先慷,類似?vue?中組件的?`data`?,使用函數(shù)的方式

????????返回對象可以避免對象引用導致的副作用問題

????????通過?`store.state`?訪問狀態(tài)數(shù)據(jù)

?????????`state`?數(shù)據(jù)與組件?`data`?一樣是被追蹤的

在組件中使用?store

????問題: `state`?的更新并不會更新視圖

解決

? ? ? ? 用computed(計算屬性)

computed計算屬性

<template>

??<div?class="home">

????<h2>{{title}}</h2>

????<div>{{content}}</div>

??</div>

</template>

<script>

import?store?from?'@/stores'

export?default?{

??name:?'home',

??computed:?{

????title()?{

??????return?store.state.title

????},

????content()?{

??????return?store.state.content

????}

??}

}

</script>


store?配置

????????如果每個組件在使用?`store`?的時候都?`import`?會比較繁瑣谨设,這個時候熟掂,我們通過?vuex?提供的?`store`?選項把?`store`?對象注入

????????到?vue?的原型上

import?Vue?from?'vue'

import?App?from?'./App.vue'

import?router?from?'./router'

import?store?from?'@/stores'

Vue.config.productionTip?=?false

new?Vue({

??router,

??store,

??render:?h?=>?h(App)

}).$mount('#app')

????????????配置注入后,我們就可以在組件實例中使用?`this.$store`?來訪問?`store`?對象了

使用輔助函數(shù)?`mapState`

????????當一個組件需要獲取多個狀態(tài)時候扎拣,將這些狀態(tài)都聲明為計算屬性會有些重復(fù)和冗余赴肚。為了解決這個問題,我們可以使用?`mapState`?

????????輔助函數(shù)幫助我們生成計算屬性二蓝,讓你少按幾次鍵誉券,通常我們把?`store`?的?`state`?通過?`mapState`?函數(shù)映射到組件的?`computed`?上

通過對象方式進行映射

????????場景:當組件中已有與?`store`?同名的數(shù)據(jù)名稱

使用擴展運算符組合

????????通過對象擴展運算符,可以把?`mapState`?返回的?`state`?屬性與組件已有計算屬性進行融合


getters

????????有時候我們需要從?store?中的?state?中派生出一些狀態(tài)刊愚,類似組件的?`data`?與?`computed`踊跟,`store`?也提供了一個?`getters`?對象來處理

????????派生數(shù)據(jù)

getters?函數(shù)

????????與組件屬性一樣,我們是通過定義一個函數(shù)的形式來返回派生數(shù)據(jù)的鸥诽,`?getters`?函數(shù)接受兩個參數(shù)

????????????????-?第一個參數(shù):`state`?對象

????????????????-?第二個參數(shù):`getters`?對象

通過屬性訪問

????????同樣的商玫,與組件計算屬性一樣,默認是通過屬性的方式去訪問?`getters`?中的數(shù)據(jù)的牡借,這種方式與組件的計算屬性一樣拳昌,

????????也是會緩存 結(jié)果的

通過方法訪問

????????我們還可以通過閉包函數(shù)的形式返回一個函數(shù),來實現(xiàn)給?`getters`?函數(shù)傳參钠龙,需要注意的是這種方式不支持結(jié)果緩存

使用輔助函數(shù)?`mapGetters`

????????與?`mapState`?函數(shù)類似炬藤,通常映射到組件的?`computed`?上


mutations(改變)

????????更改?Vuex?的?store?中的狀態(tài)的唯一方法是提交?mutation(類似?redux?中的?action?+?reducer),Vuex?中的?mutation?非常類似于事件:

????????每個?mutation?都有一個字符串的?**事件類型?(type)**?和?一個?**回調(diào)函數(shù)?(handler)**

????????????????`mutation`?中的函數(shù)不要直接調(diào)用


commit(提交)

? ??????type

????????????????????要提交的?`mutation`?回調(diào)函數(shù)名稱

? ??????payload

????????????????????載荷:提交的額外數(shù)據(jù)碴里,任意格式


mutation?函數(shù)

????????`mutation`?中的函數(shù)被?`commit`?執(zhí)行的時候沈矿,接收兩個參數(shù)

????????????????-???第一個參數(shù):`state`?對象

????????????????-???第二個參數(shù):?`commit`?提交的?`payload`

????????在?`mutation`?函數(shù)中,我們就可以通過?`state`?對象進行狀態(tài)數(shù)據(jù)的修改


使用輔助函數(shù)?`mapMutations`

????????`mapMutations`?函數(shù)的使用與?`mapState`?和?`mapGetters`?類似咬腋,但是其一般是把組件的?`methods`?映射

????????為?`store`?的?`mutations`?的?`commit`?調(diào)用


mutation?函數(shù)必須是同步的

????????`commit`?方法沒有返回值


actions

????????`action`?中的函數(shù)與?`mutation`?中的函數(shù)類似羹膳,但是它主要用來進行異步任務(wù)的處理,然后通過提交?`mutation`?來修改?`state`

????????????????>?注意:`action`?中的函數(shù)不要直接修改?`state`


dispatch派發(fā)

????????`action`?任務(wù)需要通過?`dispatch`?方法來提交(派發(fā))根竿,與?`commit`?類似

????????`dispatch`?方法有返回值溜徙,且一定返回一個?`promise`?對象


action?函數(shù)

????????`action`?中的函數(shù)執(zhí)行的過程中也接受兩個參數(shù)

????????????????-?第一個參數(shù):`store`?對象

????????????????-?第二個參數(shù):?`dispatch`?提交的?`payload`


使用輔助函數(shù)?`mapActions`

????????與?`mapMutations`?函數(shù)類似,把組件的?`methods`?映射為?`store`?的?`actions`?的?`dispatch`?調(diào)用



Module

????????這個更多的是基于一種代碼組織結(jié)構(gòu)上的輔助

????????????????https://vuex.vuejs.org/zh/guide/modules.html

????????????????https://vuex.vuejs.org/zh/guide/structure.html


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末犀填,一起剝皮案震驚了整個濱河市蠢壹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌九巡,老刑警劉巖图贸,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡疏日,警方通過查閱死者的電腦和手機偿洁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來沟优,“玉大人涕滋,你說我怎么就攤上這事∧痈螅” “怎么了宾肺?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長侵俗。 經(jīng)常有香客問我锨用,道長,這世上最難降的妖魔是什么隘谣? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任增拥,我火速辦了婚禮,結(jié)果婚禮上寻歧,老公的妹妹穿的比我還像新娘掌栅。我一直安慰自己,他們只是感情好码泛,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布猾封。 她就那樣靜靜地躺著,像睡著了一般弟晚。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上逾苫,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天卿城,我揣著相機與錄音,去河邊找鬼铅搓。 笑死瑟押,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的星掰。 我是一名探鬼主播多望,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼氢烘!你這毒婦竟也來了怀偷?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤播玖,失蹤者是張志新(化名)和其女友劉穎椎工,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡维蒙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年掰吕,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片颅痊。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡殖熟,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出斑响,到底是詐尸還是另有隱情菱属,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布恋捆,位于F島的核電站照皆,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏沸停。R本人自食惡果不足惜膜毁,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望愤钾。 院中可真熱鬧瘟滨,春花似錦、人聲如沸能颁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽伙菊。三九已至败玉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間镜硕,已是汗流浹背运翼。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留兴枯,地道東北人血淌。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像财剖,于是被迫代替她去往敵國和親悠夯。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345

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

  • 安裝 npm npm install vuex --save 在一個模塊化的打包系統(tǒng)中躺坟,您必須顯式地通過Vue.u...
    蕭玄辭閱讀 2,926評論 0 7
  • ### store 1. Vue 組件中獲得 Vuex 狀態(tài) ```js //方式一 全局引入單例類 // 創(chuàng)建一...
    蕓豆_6a86閱讀 726評論 0 3
  • 習慣養(yǎng)成很容易沦补,戒掉卻很難!_涑取策彤! 什么是Vuex栓袖? Vuex 是一個專為 Vue.js 應(yīng)用程序開發(fā)的狀態(tài)管理模式...
    前端又又閱讀 2,742評論 0 1
  • Vuex是什么? Vuex 是一個專為 Vue.js應(yīng)用程序開發(fā)的狀態(tài)管理模式店诗。它采用集中式存儲管理應(yīng)用的所有組件...
    蕭玄辭閱讀 3,106評論 0 6
  • 由于Vuex的官方文檔在各個模塊之間缺乏一些過渡裹刮,另外新概念很多,使得初讀時總有些云里霧里的感覺庞瘸。于是本文在官方文...
    一郭鮮閱讀 352評論 0 1