vue-router路由參數(shù)刷新消失的問(wèn)題解決方法
場(chǎng)景:vue-router實(shí)現(xiàn)的單頁(yè)應(yīng)用,登錄頁(yè)調(diào)用登錄接口后,服務(wù)器返回用戶信息,然后通過(guò)router.push({name: 'index', params: res.data})傳給主頁(yè)組件,并在主頁(yè)顯示數(shù)據(jù)。但是刷新頁(yè)面后,數(shù)據(jù)就消失了。
解決方案:
1、session&服務(wù)器渲染
傳統(tǒng)的方案是,登錄頁(yè)和主頁(yè)是單獨(dú)的兩個(gè)頁(yè)面,登錄成功后服務(wù)器生成用戶信息對(duì)應(yīng)的session,然后渲染主頁(yè)數(shù)據(jù),并通過(guò)響應(yīng)頭將sessionid傳給瀏覽器并生成相應(yīng)的cookie文件。這樣下次請(qǐng)求頁(yè)面時(shí),瀏覽器會(huì)在http header帶上相應(yīng)的cookie,然后服務(wù)器根據(jù)cookie中的sessionid判斷用戶是否登錄,再顯示用戶數(shù)據(jù)。
如果項(xiàng)目采用前后端分離思想,服務(wù)器只提供接口,不進(jìn)行服務(wù)器渲染,那么這種辦法是行不通了。
2、$route.query
我們可以在路由跳轉(zhuǎn)的時(shí)候帶上登錄請(qǐng)求的參數(shù):
router.push({name:'index', query:{username: 'xxx', password: 'xxxxxx'}}) ... this.$ajax({ url: 'xxx', method: 'post', data: { username: this.$route.query.username, password: this.$route.query.password } })
這樣登錄參數(shù)會(huì)被保存在url中,像這樣:“http://xxx.xxx.xxx/index?username=xxx&password=xxxxxx”,然后在created鉤子中調(diào)用登錄接口來(lái)返回?cái)?shù)據(jù)。
即使密碼進(jìn)行了md5加密,將用戶名密碼這類敏感信息放在url中肯定也是不合理。
3、cookie
另一個(gè)辦法是把登錄參數(shù)存入cookie,然后在created鉤子中獲取cookie中存的信息,再調(diào)用登錄接口。將用戶名密碼存入cookie中同樣不合理,改進(jìn)版是登錄成功后服務(wù)器返回一個(gè)token,在有效期內(nèi)通過(guò)token獲取用戶數(shù)據(jù)。
cookie存取數(shù)據(jù)比較麻煩,因?yàn)閏ookie中鍵值對(duì)是字符串并以 "=" 鏈接,需要額外寫操作cookie的方法。
<script> function setCookie (name, value, exdays) { let date = new Date() date.setTime(date.getTime() + (exdays * 24 * 60 * 60 * 1000)) let expires = "expires=" + date.toGMTString() document.cookie = name + "=" + value + "; " + expires } function getCookie (name) { name = name + "=" let cookieArr = document.cookie.split(';') for (let i = 0; i < cookieArr.length; i++) { let cookie = cookieArr[i].trim() if (cookie.indexOf(name) === 0) { return cookie.slice(name.length) } } return "" }
4、HTML5 Web存儲(chǔ)
提到Web存儲(chǔ),潛意識(shí)肯定覺(jué)得很多瀏覽器都不支持,其實(shí)IE8及以上都支持localStorage和sessionStorage了。Vue項(xiàng)目最低支持IE9,所以可以放心的使用Web存儲(chǔ)。
localStorage存儲(chǔ)數(shù)據(jù)沒(méi)有時(shí)間限制,不主動(dòng)刪除就不會(huì)失效。而sessionStorage是在頁(yè)面或者瀏覽器關(guān)閉時(shí)就會(huì)失效,適合本場(chǎng)景應(yīng)用。
我們可以把token信息存在sessionStorage中,然后每次刷新頁(yè)面通過(guò)token請(qǐng)求數(shù)據(jù);但是既然能夠把token存儲(chǔ)到本地,為什么不直接把常用的數(shù)據(jù)直接保存到本地呢?利用本地?cái)?shù)據(jù),可以減少客戶端網(wǎng)絡(luò)請(qǐng)求,還可以降低服務(wù)器負(fù)擔(dān)。
由于localStorage和sessionStorage是只讀的,不能直接將其指向一個(gè)對(duì)象。也不能利用Object.assign()復(fù)制對(duì)象,因?yàn)橹禃?huì)變成字符串"[object Object]",所有只有通過(guò)循環(huán)為 sessionStorage 添加屬性了。
... for (var key in res.data.customer) { sessionStorage[key] = res.data.customer[key] } ...
以上是我在最近工作中遇到的問(wèn)題,最后采用的方案是使用sessionStorage存儲(chǔ)數(shù)據(jù)。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
vue實(shí)現(xiàn)滾動(dòng)條下滑時(shí)隱藏導(dǎo)航欄,上滑時(shí)顯示導(dǎo)航欄功能
這篇文章主要介紹了vue實(shí)現(xiàn)滾動(dòng)條下滑時(shí)隱藏導(dǎo)航欄,上滑時(shí)顯示導(dǎo)航欄,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-07-07Vue.js實(shí)現(xiàn)無(wú)限加載與分頁(yè)功能開(kāi)發(fā)
這篇文章主要為大家詳細(xì)介紹了Vue.js實(shí)現(xiàn)無(wú)限加載與分頁(yè)功能開(kāi)發(fā)實(shí)踐,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11vue中this.$router.go(-1)失效(路由改變了,界面未刷新)
本文主要介紹了vue中this.$router.go(-1)失效(路由改變了,界面未刷新),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-12-12詳解vue-Resource(與后端數(shù)據(jù)交互)
本篇文章主要介紹了vue-Resource(與后端數(shù)據(jù)交互),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-01-01vue+echarts實(shí)現(xiàn)動(dòng)態(tài)折線圖的方法與注意
這篇文章主要給大家介紹了關(guān)于vue+echarts實(shí)現(xiàn)動(dòng)態(tài)折線圖的方法與注意事項(xiàng),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09vue 音樂(lè)App QQ音樂(lè)搜索列表最新接口跨域設(shè)置方法
這篇文章主要介紹了vue 音樂(lè)App QQ音樂(lè)搜索列表最新接口跨域設(shè)置方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-09-09