Vuex

狀態(tài)管理

  • 在開發(fā)中,我們會(huì)用應(yīng)用程序處理很多的數(shù)據(jù)苦囱,這些數(shù)據(jù)需要保存在我們應(yīng)用程序徐的某一個(gè)位置簸喂,對于這些數(shù)據(jù)的管理我們就稱之為狀態(tài)管理
    image.png

使用方法

  • 下載vuex最新版 npm install vuex@next
  • 新建文件夾及文件


    image.png
* index.js導(dǎo)入createStore ,并創(chuàng)建state共享數(shù)據(jù)
import { createStore } from 'vuex'
const store = createStore({
  state() {
    return {
      counter: 100
    }
  }
})
export default store;
  • 在main.js文件中添加依賴并使用
    import store from './store'
    createApp(App).use(store).mount('#app')
  • 在組件中使用
    <h2>{{$store.state.counter}}</h2>
  • 組件方法中獲取數(shù)據(jù)(不建議修改)
    this.$store.state.counter
  • 組件方法通過commit修改數(shù)據(jù)(建議)


單一狀態(tài)樹

  • 定義:用一個(gè)對象就包含全部的應(yīng)用層級的狀態(tài)
  • 單一狀態(tài)樹的優(yōu)勢:能夠使用最直接的方式找到每個(gè)狀態(tài)片段,方便維護(hù)弓乙、調(diào)試和管理

mapState方法

  • 導(dǎo)入
  • 使用
    option api

    setup()做法

    封裝成一個(gè)函數(shù)

es6之?dāng)U展運(yùn)算符 三個(gè)點(diǎn)(…)

  • 對象中的擴(kuò)展運(yùn)算符(...)用于取出參數(shù)對象中的所有可遍歷屬性,拷貝到當(dāng)前對象之中
let bar = { a: 1, b: 2 };
let baz = { ...bar }; // { a: 1, b: 2 }

相當(dāng)于

let bar = { a: 1, b: 2 };
let baz = Object.assign({}, bar); // { a: 1, b: 2 }

getter的基本使用

  • 類似于computed
option api
  • 當(dāng)多個(gè)計(jì)算屬性時(shí)钧惧,我們可以使用 mapGetters (需要要導(dǎo)入)

    image.png

mutations

  • 提交數(shù)據(jù)


  • mapMutations


    image.png
  • 提交到根里面
    image.png

actions的基本使用(派發(fā))

  • 可以進(jìn)行異步操作


    context
image.png
  • 派發(fā)到根actions里面


  • 派發(fā)風(fēng)格------對象類型


  • 輔助函數(shù) mapActions


    image.png
  • setup函數(shù)中使用


  • 結(jié)合axios和promise做異步請求


modules(模塊)

  • 使每個(gè)模塊都擁有自己的state暇韧、mutation、action浓瞪、getter,甚至嵌套子模塊
  • 基本使用
    導(dǎo)出


    userModule

    導(dǎo)入


  • 拿一個(gè)模塊里面的getters里面的數(shù)據(jù)
    其他模塊的getters里面的數(shù)據(jù)在根getters會(huì)做一個(gè)合并懈玻,
    actions和mutations里面的數(shù)據(jù)同樣會(huì)做合并


    image.png

    但是這種方法很難讓人知道數(shù)據(jù)到低是從那個(gè)文件傳過來的
    so:我們在定義模塊的時(shí)候,在其對象里面設(shè)置屬性



    使用

  • 在組件里使用模塊輔助函數(shù)
    寫法一


    寫法二:
    import { createNamespacedHelpers, mapState, mapGetters, mapMutations, mapActions } from "vuex"; const { mapState, mapGetters, mapMutations, mapActions } = createNamespacedHelpers("home")
computed(){
  ...mapState(["homeCounter"]),
  ...mapGetters(["doubleHomeCounter"])
}

關(guān)于映射返回函數(shù)的處理方式(就算有子模塊也適用)

  • 使用方法("模塊名字"乾颁,["方法名"])
    const getters = useGetters("home", ["doubleHomeCounter"])
  • 出口函數(shù)index.js
import { useGetters } from './useGetters';
import { useState } from './useState';

export {
  useGetters,
  useState
}
  • useState.js
import { mapState, createNamespacedHelpers } from 'vuex'
import { useMapper } from './useMapper'

export function useState(moduleName, mapper) {
  let mapperFn = mapState
  if (typeof moduleName === 'string' && moduleName.length > 0) {
    mapperFn = createNamespacedHelpers(moduleName).mapState
  } else {
    mapper = moduleName
  }

  return useMapper(mapper, mapperFn)
}

  • useGetters.js
import { mapGetters, createNamespacedHelpers } from 'vuex'
import { useMapper } from './useMapper'

export function useGetters(moduleName, mapper) {
  let mapperFn = mapGetters
  if (typeof moduleName === 'string' && moduleName.length > 0) {
    mapperFn = createNamespacedHelpers(moduleName).mapGetters
  } else {
    mapper = moduleName
  }

  return useMapper(mapper, mapperFn)
}

  • useMapper.js
import { computed } from 'vue'
import { useStore } from 'vuex'

export function useMapper(mapper, mapFn) {
  // 拿到store獨(dú)享
  const store = useStore()

  // 獲取到對應(yīng)的對象的functions: {name: function, age: function}
  const storeStateFns = mapFn(mapper)

  // 對數(shù)據(jù)進(jìn)行轉(zhuǎn)換
  const storeState = {}
  Object.keys(storeStateFns).forEach(fnKey => {
    const fn = storeStateFns[fnKey].bind({$store: store})
    storeState[fnKey] = computed(fn)
  })

  return storeState
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末涂乌,一起剝皮案震驚了整個(gè)濱河市艺栈,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌湾盒,老刑警劉巖湿右,帶你破解...
    沈念sama閱讀 212,599評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異罚勾,居然都是意外死亡诅需,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,629評論 3 385
  • 文/潘曉璐 我一進(jìn)店門荧库,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人赵刑,你說我怎么就攤上這事分衫。” “怎么了般此?”我有些...
    開封第一講書人閱讀 158,084評論 0 348
  • 文/不壞的土叔 我叫張陵蚪战,是天一觀的道長。 經(jīng)常有香客問我铐懊,道長邀桑,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,708評論 1 284
  • 正文 為了忘掉前任科乎,我火速辦了婚禮壁畸,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘茅茂。我一直安慰自己捏萍,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,813評論 6 386
  • 文/花漫 我一把揭開白布空闲。 她就那樣靜靜地躺著令杈,像睡著了一般。 火紅的嫁衣襯著肌膚如雪碴倾。 梳的紋絲不亂的頭發(fā)上逗噩,一...
    開封第一講書人閱讀 50,021評論 1 291
  • 那天,我揣著相機(jī)與錄音跌榔,去河邊找鬼异雁。 笑死,一個(gè)胖子當(dāng)著我的面吹牛僧须,可吹牛的內(nèi)容都是我干的片迅。 我是一名探鬼主播,決...
    沈念sama閱讀 39,120評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼皆辽,長吁一口氣:“原來是場噩夢啊……” “哼柑蛇!你這毒婦竟也來了芥挣?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,866評論 0 268
  • 序言:老撾萬榮一對情侶失蹤耻台,失蹤者是張志新(化名)和其女友劉穎空免,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體盆耽,經(jīng)...
    沈念sama閱讀 44,308評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蹋砚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,633評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了摄杂。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片坝咐。...
    茶點(diǎn)故事閱讀 38,768評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖析恢,靈堂內(nèi)的尸體忽然破棺而出墨坚,到底是詐尸還是另有隱情,我是刑警寧澤映挂,帶...
    沈念sama閱讀 34,461評論 4 333
  • 正文 年R本政府宣布泽篮,位于F島的核電站,受9級特大地震影響柑船,放射性物質(zhì)發(fā)生泄漏帽撑。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,094評論 3 317
  • 文/蒙蒙 一鞍时、第九天 我趴在偏房一處隱蔽的房頂上張望亏拉。 院中可真熱鬧,春花似錦逆巍、人聲如沸专筷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,850評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽磷蛹。三九已至,卻和暖如春溪烤,著一層夾襖步出監(jiān)牢的瞬間味咳,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,082評論 1 267
  • 我被黑心中介騙來泰國打工檬嘀, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留槽驶,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,571評論 2 362
  • 正文 我出身青樓鸳兽,卻偏偏與公主長得像掂铐,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,666評論 2 350

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