Vuex

什么是Vuex

  • Vuex 是一個專為 Vue.js 應(yīng)用程序開發(fā)的狀態(tài)管理模式。它采用集中式存儲管理應(yīng)用的所有組件的狀態(tài),并以相應(yīng)的規(guī)則保證狀態(tài)以一種可預(yù)測的方式發(fā)生變化谍咆。
  • vuex是采用集中式管理組件依賴的共享數(shù)據(jù)的一個工具纵揍,可以解決不同組件數(shù)據(jù)共享問題。
  1. 大家都知道兄弟組件之間的傳值是用到事件總線EventBus來進(jìn)行的垛玻,當(dāng)然也可以通過父組件作為橋梁進(jìn)行傳值割捅,
  2. 那么遇到孫子組件時傳值就會比較麻煩,所以eventbus只是小型項(xiàng)目考慮的帚桩,當(dāng)項(xiàng)目大起來的時候亿驾,就考慮使用vuex(因?yàn)槭枪俜降挠H兒子- - )


圖解:

  1. 修改 state狀態(tài)必須通過mutations
  2. mutations只能執(zhí)行同步代碼,
  3. ajax账嚎、settimeout等異步請求莫瞬,需要需用actions,在把數(shù)據(jù)交給mutations
  4. state共享狀態(tài)數(shù)據(jù)可以在組件中調(diào)用
  5. 組件中可以調(diào)用actions

vuex基礎(chǔ)-初始化功能

建立一個新的腳手架項(xiàng)目, 在項(xiàng)目中應(yīng)用vuex

$ vue create demo

初始化項(xiàng)目

npm i vuex --save -- 安裝到運(yùn)行時依賴
開發(fā)時依賴 就是開開發(fā)的時候郭蕉,需要的依賴疼邀,運(yùn)行時依賴,項(xiàng)目上線運(yùn)行時依然需要的

// 引入Vuex 的步驟
// 2.引入庫
import Vuex from 'vuex'
// 3. 注冊(其實(shí)是執(zhí)行了Vuex內(nèi)的install方法
Vue.use(Vuex)
// 4. 倉庫實(shí)例化
const store = new Vuex.Store({
  // 這里放配置
})

new Vue({
  // 5. 在根實(shí)例配置 store 選項(xiàng)指向 store 實(shí)例對象
  store,
  render: h => h(App),
}).$mount('#app')

vuex基礎(chǔ)-state

state是放置所有公共狀態(tài)的屬性召锈,如果你有一個公共狀態(tài)數(shù)據(jù) 旁振, 你只需要定義在 state對象中
定義state

const store = new Vuex.Store({
  state: {
    // 管理數(shù)據(jù)
    count: 0
  }
})

怎么在組件中獲取count?

原始形式- 插值表達(dá)式
組件中可以使用 this.$store 獲取到vuex中的store對象實(shí)例涨岁,可通過state屬性屬性獲取count


輔助函數(shù) - mapState
mapState是輔助函數(shù)拐袜,幫助我們把store中的數(shù)據(jù)映射到 組件的計(jì)算屬性中, 它屬于一種方便用法

  1. 導(dǎo)入mapState
import { mapState } from "vuex";
  1. 采用數(shù)組形式引入state屬性,并用擴(kuò)展運(yùn)算符將導(dǎo)出的狀態(tài)映射給計(jì)算屬性
  computed: {
    ...mapState(["count"]),
  },
  1. 使用
<div>{{ count }}</div>

vuex基礎(chǔ)-mutations

state數(shù)據(jù)的修改只能通過mutations,并且mutations必須是同步更新梢薪,目的是形成數(shù)據(jù)快照
mutations是一個對象蹬铺,對象中存放修改state的方法
Vuex中mutations中要求不能寫異步代碼,如果有異步的ajax請求秉撇,應(yīng)該放置在actions中
定義mutations

const store  = new Vuex.Store({
  state: {
    count: 0
  },
  // 定義mutations
  mutations: {
    // 第一個參數(shù)是store的state屬性
    addCount(state) {
      state.count++
    }
  }
})

如何在組建中調(diào)用mutations甜攀?
原始形式-$store

<script>
export default {
    methods: {
    //   調(diào)用方法
      addCount () {
         // 調(diào)用store中的mutations 提交給muations
        // commit('muations名稱')
        this.$store.commit('addCount')  // 直接調(diào)用mutations
    }
  }
}
</script>

帶參數(shù)的傳遞

 mutations: {
    // 第一個參數(shù)是store的state屬性,第二是用戶傳遞的參數(shù)
    addCount(state, data) {
      state.count += data
    }
  }


  methods: {
    // ...mapMutations(["addCount"]),
    addCount() {
      // 調(diào)用store中的mutations 提交給muations
      // commit('muations名稱', 10)
      this.$store.commit("addCount", 10); // 直接調(diào)用mutations
    },
  },

輔助函數(shù) - mapMutations
mapMutations和mapState很像畜疾,它把位于mutations中的方法提取了出來赴邻,我們可以將它導(dǎo)入

<button @click="addCount(10)">count+10</button>

  import  { mapMutations } from 'vuex'

  methods: {
    ...mapMutations(["addCount"]),
    // addCount() {
    //   // 調(diào)用store中的mutations 提交給muations
    //   // commit('muations名稱', 10)
    //   this.$store.commit("addCount", 10); // 直接調(diào)用mutations
    // },
  },

vuex基礎(chǔ)-actions
state是存放數(shù)據(jù)的,mutations是同步更新數(shù)據(jù)啡捶,actions則負(fù)責(zé)進(jìn)行異步操作
定義actions

 actions: {
   //  獲取異步的數(shù)據(jù) context表示當(dāng)前的store的實(shí)例 
   // 可以通過 context.state 獲取狀態(tài)
  //  也可以通過context.commit 來提交mutations姥敛, 
 //   也可以 context.diapatch調(diào)用其他的action
    getAsyncCount (context) {
      setTimeout(function(){
        // 一秒鐘之后 要給一個數(shù) 去修改state
        context.commit('addCount', 100)
      }, 1000)
    }
 } 

原始調(diào)用 - $store

 addAsyncCount () {
     this.$store.dispatch('getAsyncCount')
 }

傳參調(diào)用

<button @click="getAsyncCount(100)">count+100</button>


  methods: {
    getAsyncCount(data) {
      this.$store.dispatch("getAsyncCount", data);
    }
 },

輔助函數(shù) -mapActions
actions也有輔助函數(shù),可以將action導(dǎo)入到組件中

import { mapActions } from 'vuex'
methods: {
    ...mapActions(['getAsyncCount'])
}

vuex基礎(chǔ)-getters

除了state之外瞎暑,有時我們還需要從state中派生出一些狀態(tài)彤敛,這些狀態(tài)是依賴state的与帆,此時會用到getters
例,state中定義 1-10 list數(shù)組

state: {
    list: [1,2,3,4,5,6,7,8,9,10]
}

組件中墨榄,需要顯示所有大于5的數(shù)據(jù)玄糟,正常的方式,是需要list在組件中進(jìn)行再一步的處理袄秩,但是getters可以幫助我們實(shí)現(xiàn)它
定義getters

  getters: {
    // getters函數(shù)的第一個參數(shù)是 state
    // 必須要有返回值
     filterList:  state =>  state.list.filter(item => item > 5)
  }

如何使用getter
原始方式 -$store

<div>{{ $store.getters.filterList }}</div>

輔助函數(shù) - mapGetters

 <div>{{ filterList }}</div>


import { mapGetters } from "vuex";

computed: {
    ...mapGetters(['filterList'])
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末阵翎,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子之剧,更是在濱河造成了極大的恐慌郭卫,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件背稼,死亡現(xiàn)場離奇詭異贰军,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)蟹肘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進(jìn)店門词疼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人帘腹,你說我怎么就攤上這事贰盗。” “怎么了竹椒?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵童太,是天一觀的道長米辐。 經(jīng)常有香客問我胸完,道長,這世上最難降的妖魔是什么翘贮? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任赊窥,我火速辦了婚禮,結(jié)果婚禮上狸页,老公的妹妹穿的比我還像新娘锨能。我一直安慰自己,他們只是感情好芍耘,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布址遇。 她就那樣靜靜地躺著,像睡著了一般斋竞。 火紅的嫁衣襯著肌膚如雪倔约。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天坝初,我揣著相機(jī)與錄音浸剩,去河邊找鬼钾军。 笑死,一個胖子當(dāng)著我的面吹牛绢要,可吹牛的內(nèi)容都是我干的吏恭。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼重罪,長吁一口氣:“原來是場噩夢啊……” “哼樱哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起剿配,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤唇礁,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后惨篱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體盏筐,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年砸讳,在試婚紗的時候發(fā)現(xiàn)自己被綠了琢融。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡簿寂,死狀恐怖漾抬,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情常遂,我是刑警寧澤纳令,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站克胳,受9級特大地震影響平绩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜漠另,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一捏雌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧笆搓,春花似錦性湿、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至算墨,卻和暖如春宵荒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工骇扇, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留摔竿,地道東北人。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓少孝,卻偏偏與公主長得像继低,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子稍走,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評論 2 359

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

  • 文章目錄 一袁翁、Vuex概述[https://blog.csdn.net/u010358168/article/de...
    peterz博客閱讀 837評論 2 8
  • 1. Vuex簡介 Vuex是專門用來管理vue.js應(yīng)用程序中狀態(tài)的一個插件。他的作用是將應(yīng)用中的所有狀態(tài)都放在...
    黃黃黃大帥閱讀 433評論 0 0
  • vuex 場景重現(xiàn):一個用戶在注冊頁面注冊了手機(jī)號碼婿脸,跳轉(zhuǎn)到登錄頁面也想拿到這個手機(jī)號碼粱胜,你可以通過vue的組件化...
    sunny519111閱讀 8,022評論 4 111
  • 安裝 npm npm install vuex --save 在一個模塊化的打包系統(tǒng)中,您必須顯式地通過Vue.u...
    蕭玄辭閱讀 2,945評論 0 7
  • 配置 vuex 和 vuex 本地持久化 目錄 vuex是什么 vuex 的五個核心概念State 定義狀態(tài)(變量...
    sunny688閱讀 2,312評論 0 23