vue vuex使用

vuex官網(wǎng)

概念弦叶,優(yōu)缺點符喝,就不多說了招狸。vuex直白點說就是封裝的一個數(shù)據(jù)共享的對象注入到vue根部,然后多界面共享里面的數(shù)據(jù)扛或。
官網(wǎng)說法:

多個視圖依賴于同一狀態(tài)绵咱。
來自不同視圖的行為需要變更同一狀態(tài)。

那么現(xiàn)在簡單介紹下vuex的核心:state,getter,actions,mutations熙兔;
那么一般使用步驟是先調(diào)用action異步獲取數(shù)據(jù)悲伶,提交到mutations,其他地方通過調(diào)用getter或state使用即可,
mutation住涉,和state必須要有的麸锉,getter和action根據(jù)實際情況確定要不要哦!
*注:下文this.$store為在man.js里面全局注冊后可使用舆声,不注冊的話使用仍為store.state.狀態(tài)值*

1花沉、state,數(shù)據(jù)源媳握,比如登陸狀態(tài)碱屁,用戶信息等,

const state = {
  userInfo:{},
 loginState:false,
}

獲取方式
this.$store.state.loginState

2蛾找、getter娩脾,即獲取數(shù)據(jù),與state的不同在于它可以返回數(shù)據(jù)源也可以返回數(shù)據(jù)源的處理結(jié)果打毛,

返回值會根據(jù)它的state被緩存起來柿赊,且只有當它的依賴值state發(fā)生了改變才會被重新計算


const getters={
//一般使用,同state作用一樣
   getUserInfo: (state) => {
    return  state.userInfo;
  }
//二般使用幻枉,(僅限舉例)
IsMan(state)=>{
if(state.userInfo.userName==='菜虛坤'){
return '女'
}else{
 return '男'
}

獲取getter
this.$store.getters.doneTodos

3碰声、mutation:更改 Vuex 的 store 中的狀態(tài)的唯一方法是提交 mutation,

與action唯一區(qū)別action為異步的, mutation為同步更新數(shù)據(jù)熬甫,當然如果保存數(shù)據(jù)沒有異步操作胰挑,完全可以不要action,

const mutations={
  [SET_USERINFO] (state, userInfo) {
    state.userInfo = userInfo
  },
}

調(diào)用如下
commit(SET_USERINFO, userinfo)
SET_USERINFO為定義的一個常量;

4.action 類似于 mutation洽腺,提交的是mutation脚粟,也就是說action異步獲取數(shù)據(jù)覆旱,通過commit(SET_USERINFO, userinfo)更新state狀態(tài)蘸朋;

const actions={
  setUserInfo({ commit, state },query){
   //異步獲取數(shù)據(jù),query為參數(shù)
   ...
   提交到mutation更新state
    commit(SET_USERINFO, userInfo)
  }
}

調(diào)用state如下,setUserInfo為action里面的方法名
store.dispatch('setUserInfo',{參數(shù)})

還有一個module,即不同模塊扣唱。全部每個模塊擁有自己的 state藕坯、mutation、action噪沙、getter炼彪,使結(jié)構清新,代碼不至于臃腫正歼;

目錄結(jié)構如圖


圖片.png

userInfoModule代碼如下辐马;

import {SET_USERINFO} from "../moduleTypes";

const state = {
  userInfo:{},
}
const getters={
   getUserInfo: (state) => {
    return  state.userInfo;
  }
}
//mutations
const mutations={
  [SET_USERINFO] (state, userInfo) {
    state.userInfo = userInfo
  },
}
const actions={
  setUserInfo({ commit, state },query){
  // 異步獲取略...
   //  TODO 測試用
   let userInfo={
   name:'張三',
   sex:'男',
   }
    commit(SET_USERINFO, userInfo)
  }
}
export default {
  state,
  getters,
  actions,
  mutations
}

moduleTypes.js代碼

export const SET_USERINFO = 'SET_USERINFO'

export const SET_LOGIN_STATUS = 'SET_LOGIN_STATUS'

export const SET_TOKEN = 'SET_TOKEN'

index.js代碼

import Vue from 'vue'
import Vuex from 'vuex'
import userInfo from './modules/userInfoModule'
import createLogger from '../utils/logger'

Vue.use(Vuex)
const debug = process.env.NODE_ENV !== 'production';

export default new Vuex.Store({
  modules: {
    userInfo,
  },
  strict: debug,
  plugins: debug ? [createLogger()] : []
})

獲取多個state和getter時局义,可使用如下

獲取多個state
computed: {
      ...mapState({
        userInfo: state => state.userInfo.userInfo,
        loginState: state => state.userInfo.loginState,
      }),
    },
//獲取多個getter
computed: {
  /
    ...mapGetters([
      userInfo: state => state.userInfo.getUserInfo,
      // ...
    ])
  }

最后別忘了在main.js里面注冊vuex哦喜爷!

import store from './store'
// Vue.prototype.$store=store;全局注冊store

new Vue({
  el: '#app',
  router,
  store,
  components: { App },
  template: '<App/>'
})

還有一種情況就是我們調(diào)用action更新數(shù)據(jù)的時候,既要返回數(shù)據(jù)萄唇,又要調(diào)用mutation保存更新數(shù)據(jù)檩帐。
這種狀況就要用到 Promise了。這里就介紹一些基本常用操作另萤,其他嵌套使用等更深層次參見官網(wǎng)
actions: {
actionA ({ commit }) {
return new Promise((resolve, reject) => {
setTimeout(() => {
commit('someMutation')
resolve(res)
}, 1000)
})
}
}
調(diào)用:
store.dispatch('actionA').then(() => {
// ...
})

-------------------完-----------------

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末湃密,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子四敞,更是在濱河造成了極大的恐慌泛源,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件忿危,死亡現(xiàn)場離奇詭異达箍,居然都是意外死亡,警方通過查閱死者的電腦和手機癌蚁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門幻梯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人努释,你說我怎么就攤上這事碘梢。” “怎么了伐蒂?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵煞躬,是天一觀的道長。 經(jīng)常有香客問我,道長恩沛,這世上最難降的妖魔是什么在扰? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮雷客,結(jié)果婚禮上芒珠,老公的妹妹穿的比我還像新娘。我一直安慰自己搅裙,他們只是感情好皱卓,可當我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著部逮,像睡著了一般娜汁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上兄朋,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天掐禁,我揣著相機與錄音,去河邊找鬼颅和。 笑死傅事,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的融虽。 我是一名探鬼主播享完,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼有额!你這毒婦竟也來了般又?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤巍佑,失蹤者是張志新(化名)和其女友劉穎茴迁,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體萤衰,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡堕义,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了脆栋。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片倦卖。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖椿争,靈堂內(nèi)的尸體忽然破棺而出怕膛,到底是詐尸還是另有隱情,我是刑警寧澤秦踪,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布褐捻,位于F島的核電站掸茅,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏柠逞。R本人自食惡果不足惜昧狮,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望板壮。 院中可真熱鬧逗鸣,春花似錦、人聲如沸个束。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽茬底。三九已至,卻和暖如春获洲,著一層夾襖步出監(jiān)牢的瞬間阱表,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工贡珊, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留最爬,地道東北人。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓门岔,卻偏偏與公主長得像爱致,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子寒随,可洞房花燭夜當晚...
    茶點故事閱讀 42,925評論 2 344