目前實現(xiàn)的效果:
1.刷新 和 跳轉任何頁面都會跳到登錄頁面
2.路由攔截屏蔽后,刷新頁面vuex里的數(shù)據(jù)都消失了
問題:
1.設置路由攔截后,實現(xiàn)了不登錄全跳轉至登錄頁面,但是刷新也都跳轉到登錄頁面
2.路由攔截屏蔽后,刷新頁面vuex里的數(shù)據(jù)都消失了,知道可以存在localStorage,但是具體的怎么實現(xiàn)呢?
3.用戶數(shù)據(jù)少可以存在localStorage里,但是主頁的所有數(shù)據(jù)就不少了,難道也存在里面嗎?
4.可不可以讓刷新頁面和路由攔截結合起來,刷新頁面再請求用戶數(shù)據(jù)和當前頁面的數(shù)據(jù),具體怎么實現(xiàn)?
最終實現(xiàn)結果:刷新后依然保持在當前頁面,并且數(shù)據(jù)不消失
代碼:
index
import Vue from 'vue';
import Vuex from 'vuex';
import getters from './getters';
import actions from './actions';
import mutations from './mutations';
Vue.use(Vuex);
const state = {
token: '',
isLogin: false, // 用戶是否登錄
userInfo: { // 用戶信息
id: '', // 用戶id
name: '', // 用戶名字
deptId: '', //
realName: '', // 用戶真實名字
avatar: '', // 用戶頭像
roles: '', // 用戶權限
}
};
const store = new Vuex.Store({
state,
getters,
actions,
mutations
});
export default store;
mutations
export const mutations = {
SET_TOKEN: (state, token) => {
state.token = token
},
SET_ISLOGIN: (state, isLogin) => {
state.isLogin = isLogin
},
SET_ID: (state, id) => {
state.userInfo.id = id
},
SET_NAME: (state, name) => {
state.userInfo.name = name
},
SET_DEPTID: (state, deptId) => {
state.userInfo.deptId = deptId
},
SET_REALNAME: (state, realName) => {
state.userInfo.realName = realName
},
SET_AVATAR: (state, avatar) => {
state.userInfo.avatar = avatar
},
SET_ROLES: (state, roles) => {
state.userInfo.roles = roles
},
};
export default mutations;
actions
import { login, logout, getUserInfo } from '@/api/api'
export const actions = {
// 登錄
Login({ commit }, userInfo) {
return new Promise((resolve, reject) => {
login(userInfo).then(response => {
let token = response.data.token;
localStorage.setItem('token', token);
commit('SET_TOKEN', token);
commit('SET_ISLOGIN', true);
resolve()
}).catch(error => {
reject(error)
})
})
},
// 獲取用戶信息
GetUserInfo({ commit, state }) {
return new Promise((resolve, reject) => {
getUserInfo(state.token).then(response => {
if (!response.data) {
reject('error')
}
let data = response.data;
console.log(response.data);
commit('SET_ID', data.Id);
commit('SET_NAME', data.Name);
commit('SET_DEPTID', data.DeptId);
commit('SET_REALNAME', data.RealName);
commit('SET_AVATAR', data.Face);
commit('SET_ROLES', data.Roles);
resolve(response)
}).catch(error => {
reject(error)
})
})
},
// 登出
LogOut({ commit, state }) {
return new Promise((resolve, reject) => {
logout(state.token).then(() => {
commit('SET_TOKEN', '');
commit('SET_ISLOGIN', false);
localStorage.removeItem('token');
resolve()
}).catch(error => {
reject(error)
})
})
},
};
export default actions;
main.js
import Vue from 'vue';
import iView from 'iview';
import App from './App';
import 'iview/dist/styles/iview.css';
import router from './router';
import store from './store';
import { getUserInfo } from '@/api/api'
Vue.config.productionTip = false
Vue.use(iView);
// 路由攔截
router.beforeEach((to, from, next) => {
if (to.meta.requireAuth) {
if (!store.state.isLogin && to.path !== '/login') {
next({
path: '/login',
})
} else {
next();
}
}
else {
next();
}
});
new Vue({
el: '#app',
router,
store,
template: '<App/>',
components: { App }
});
刷新代表就是重啟項目,數(shù)據(jù)肯定會丟失
給你提供倆種給用戶錯覺感是沒有丟失的方案:
1 純前端實現(xiàn) / 也就是 本地存儲, sessionStorage,和localStorage 具體不介紹了 百度一堆,好處就是
實現(xiàn)簡單 無非set get倆個方法存取,壞處 萬一本地存儲滿了,或者刪了 或者導致用戶體驗卡了等等一系列問題
2 前后端配合,寫倆個接口,一個是存一個是獲取,刷新前需要請求接口把數(shù)據(jù)存進去,刷新之后把數(shù)據(jù)拿回來
這個比較繁瑣,但是不會出現(xiàn)較大的問題 **=bug**
看你需求 看你服務的人群 看你產(chǎn)品的態(tài)度 綜合考慮
我說一下我的想法,希望對你有所幫助!
1、刷新相當與重啟項目,之前獲取到的數(shù)據(jù)也只是通過store暫存起來,項目關閉時就不見了,這有些像電腦重啟,存儲在RAM的數(shù)據(jù)會消失。
2、既然是刷新,用localStorage的話你關閉瀏覽器或者標簽數(shù)據(jù)還在,這樣用戶體驗不好,而且隨著數(shù)據(jù)增多,沒有及時刪除的話,會導致更新項目的時候以前的數(shù)據(jù)沖突,這時候最好是使用sessionStorage,和localStorage差不多,差別在于關閉標簽或者瀏覽器時數(shù)據(jù)就會自動清除。
3、對于提到的前面主頁保存的數(shù)據(jù),當然也要保存到sessionStorage中,雖然保存的大小有限制,但是一般項目數(shù)據(jù)絕對是夠裝的。
4、項目加載時,可以在created先進行判斷sessionStorage是否存在對應的數(shù)據(jù),有的話,將數(shù)據(jù)commit到store中去,沒有就正常加載,發(fā)送請求來請求數(shù)據(jù)等一系列操作。
簡單回答一下,因為我們的項目也有類似的需求,并被我們的老大整理完畢了
首先localStorage是vue.js我理解是vue.js中的全局變量,并且會記錄在緩存中,刷新不會丟失,使用起來也很簡單,localStorage.user_id='001'進行存儲,localStorage.user_id取值。
其次就是localStorage的定義,我們不可以完全依賴他,就像你說的,不可能將主頁數(shù)據(jù)都存在里面,那你這個頁面維護起來都是問題。我對他的定義是,存儲必要的,刷新不能丟失的主鍵類數(shù)據(jù),比如user_id。
而用vuex管理的store,他的機制就是在頁面中刷新就釋放的。
到這里,我簡單說一說我們是怎么做的,僅供參考。
我們的一些用戶信息相關的對象,存儲在store中進行管理,并且在localStorage中存儲user_id以及token。
首先在main.js中創(chuàng)建路由攔截,判斷to的頁面是否需要登錄權限,如果需要登錄權限,優(yōu)先判斷store中是否有登錄狀態(tài)碼,如果沒有,有可能是刷新頁面導致的,去判斷l(xiāng)ocalStorage中是否有token、user_id,如果沒有,直接返回登錄頁。如果localStorage中有相關信息,那么好,我們在這里直接進行一次查詢,將用戶相關信息再次寫入store中存儲。
僅供參考,思路捋清楚了,該怎么做也就一目了然了。
北大青鳥APTECH成立于1999年。依托北京大學優(yōu)質雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
達內教育集團成立于2002年,是一家由留學海歸創(chuàng)辦的高端職業(yè)教育培訓機構,是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
北大課工場是北京大學校辦產(chǎn)業(yè)為響應國家深化產(chǎn)教融合/校企合作的政策,積極推進“中國制造2025”,實現(xiàn)中華民族偉大復興的升級產(chǎn)業(yè)鏈。利用北京大學優(yōu)質教育資源及背
博為峰,中國職業(yè)人才培訓領域的先行者
曾工作于聯(lián)想擔任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔任項目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍懿科技有限責任公司從事總經(jīng)理職務負責iOS教學及管理工作。
浪潮集團項目經(jīng)理。精通Java與.NET 技術, 熟練的跨平臺面向對象開發(fā)經(jīng)驗,技術功底深厚。 授課風格 授課風格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應用開發(fā)經(jīng)驗。曾經(jīng)歷任德國Software AG 技術顧問,美國Dachieve 系統(tǒng)架構師,美國AngelEngineers Inc. 系統(tǒng)架構師。