vue vue-router vuex element-ui axios 寫一個代理平臺的學習筆記(八)Vuex管理登錄狀態

又仔細看了一遍vuex的文檔,還是云里霧里的,不過至少明白它是一個專門管理狀態的,根據數據狀態的改變可以驅動視圖更新,既然是這樣那至少登錄注冊是一種狀態,就用登錄來做測試,學習vuex,不過話說回來,既然專門管理狀態,那我至少要仔細推敲一下這個learn的學習項目有那些狀態邏輯。



Image 091.png

  • 1、據說儲存的vuex store里面的狀態是臨時的,右鍵刷新一下頁面這些狀態就銷毀了(這是據說,請大神解惑我也沒辦法證實),如果是這樣的話,我的用戶狀態user還是應該要寫入sessionStorage,不然登錄了的一刷新頁面就變成沒登錄了,用戶不就瘋了啊。所以store里面的user狀態應該要從sessionStorage里面去讀。
  • 2、在這個learn項目中現存的頁面中,home,paroducts,FAQ,login,regin,應該是不需要登錄就可以訪問,而manger和manger以下的子頁面是必須要登錄才可以訪問的。
  • 3、比較特殊的是login和regin,如果用戶已經登錄了,再去訪問這2個頁面,原則上來說也是可以的,但如果已經登錄了,再用其它賬號來登錄一次,那sessionStorage存在2個user數據,那就顯然不合理了,所以應該規定,如果用戶已經登錄,又去訪問login或者regin,那我們應先remove掉sessionStorage里面user數據
  • 4、vuex規定所有狀態的改變只能依靠mutation,而要驅動mutation去改變狀態的只能是action。那在這個項目里登錄狀態變化只會有登錄、注冊和登出這三種情況,登錄和注冊成功的時候要去執行一個存在user的action,登出的時候去執行一個不存在user的action。
  • 5、vuex官方還提了一個getter的玩意兒,我感覺應該是在我們需要取用store里面狀態的時候,確切的說應該是取出這個狀態之后,給這個狀態做一些加工改變用的,而且應該只能getter一次吧,多了感覺要亂套?。ú恢肋@個想法對不對),但看見這樣的寫法this.$store.getters.doneTodosCount,感覺應該可以用不止一次把。估計我想得有點多了,目前看起來也用不上,也許要經歷過需要的應用場景才能理解透徹把。
  • 6、還有個module,這個就有點迷了,沒太搞懂,先不管了


預想中store的登錄狀態還是要從sessionStorage來取的,所以我先把路由約束好,那些頁面需要user,那些不需要,訪問那些頁面需要remove user

打開main.js
添加代碼

// 這個官方名字叫導航守衛,挺形象的
router.beforeEach((to, from, next) => {
  // 如果是去登錄或注冊,那就先把user移除
  if (to.path === '/login' || to.path === '/regin') {
    sessionStorage.removeItem('user')
  }
  let user = JSON.parse(sessionStorage.getItem('user'))
  if (!user && (to.path === '/manger/my' || to.path === '/manger/send' || to.path === '/manger/history')) {
    next({ path: '/login' })
  } else {
    next()
  }
})

這樣寫感覺怪怪的,不知道有沒有簡單點的寫法?
不過想要的效果是能達到的



然后嘗試寫store
先寫個基本結構
Image 092.png

然后一步一步具體寫


Image 093.png

是說這需要一個function?
唉喲,不對,我蠢了,這是賦值(不知道說賦值準不準確)嘛,又不是寫一個obj對象,不需要逗號的哈

store.js

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)
// 創建基本狀態
const state = {
  // 登錄狀態為沒登錄
  logined: false,
  // 用戶信息數據,目前只需要avatar和name,還是把username也加上吧
  LoginedUser: {
    name: '',
    avatar: '',
    username: ''
  }
}
// 創建改變狀態的方法
const mutations = {
  // 改變狀態的方法也需要2個,一個是登錄或注冊了,一個是登出了
  // 這里不能寫箭頭函數???
  // 登錄
  LOGIN (state) {
    // 先讓登錄狀態變為登錄了
    state.logined = true
    // 然后去sessionStorage取用戶數據
    let user = JSON.parse(sessionStorage.getItem('user'))
    // 再把用戶數據發下去
    state.LoginedUser.name = user.name
    state.LoginedUser.avatar = user.avatar
    state.LoginedUser.username = user.username
  },
  // 登出
  LOGOUT (state) {
    // 這個同理
    state.logined = false
    state.LoginedUser.name = ''
    state.LoginedUser.avatar = ''
    state.LoginedUser.username = ''
  }
}
// 創建驅動actions可以使得mutations得以啟動
const actions = {
  // 這里先來一個驅動LOGIN的東西就叫login吧
  // 這個context是官方寫的,應該叫什么無所謂
  login (context) {
    context.commit('LOGIN')
  },
  // 同樣來個logout
  logout (context) {
    context.commit('LOGOUT')
  }
}

export default new Vuex.Store({
  state,
  mutations,
  actions
})

我感覺應該就這樣就可以了吧,還是要測試一下
不對還應該要把action掛到該掛的地方,然后該引用store狀態的地方引用store的數據
先去登錄頁面掛action

Image 094.png

應該是這樣的,注冊也是一樣
Image 095.png

然后是登出的頁面
header.vue
Image 096.png

同時我們就不在創建頁面的時候從sessionStorage取數據了
還有一個main.js
Image 097.png

要是不能在main.js里面生效還真是麻煩啊,試想一下,已登錄用戶直接去了/login頁面,seeionStorage里面用戶數據清除了,但store里面的數據又沒更新,那在頭部不是還掛一個頭像啊???


還有一步獲取store里面的數據
header.vue
Image 098.png


還是趕緊測試一下吧
哭了.....直接四個錯誤


Image 099.png

這我都是照著官方說的寫的啊


Image 100.png
把header.vue的數據注釋掉,還有一個錯誤
Image 101.png

但這個dispatch 是undefined 是啥意思啊,我是照著寫的啊,大佬幫我解惑一下啊
Image 102.png

把dispatch 改成context 也不行
改成commit 試一下

Image 103.png

還是一樣沒脾氣了,我再去看看資料吧
研究了好久解決了一部分問題

首先我把store.js,里面的action寫成了這樣

Image 104.png

但我覺得原來的寫法也沒有錯

然后在main.js里面注釋掉了這句
Image 105.png

然后就正常了,dispatch是正確的,所以我所擔心的事果然發生了

先去登錄

Image 106.png

Image 107.png

可以看見header右上方的確立刻變成了用戶信息,達到了要求,然而我要是自己去地址欄輸入/login

Image 108.png

Image 109.png

跳到了登錄頁面,但頭像真的還掛在右上角........,說明store里面真的還是登錄的數據,雖然仔細想想其實這并沒有什么影響,他要是再一次登錄成功,數據自然也就變了,而且一般沒人會這么去訪問登錄頁面,但心里覺得這樣不對啊。

而且我覺得這個action的分發應該有辦法寫在main.js里面的,不知道有沒有大神指點一二!

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

推薦閱讀更多精彩內容