日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

解決vue刷新頁面以后丟失store的數(shù)據問題

瀏覽:155日期:2022-12-09 17:40:48

刷新頁面時vue實例重新加載,store就會被重置,可以把定義刷新前把store存入本地localStorage、sessionStorage、cookie中,localStorage是永久儲存,重新打開頁面時會讀取上一次打開的頁面數(shù)據,sessionStorage是儲存到關閉為止,cookie不適合存大量數(shù)據。根據我的需求,最合適的是sessionStorage。

beforeunload在頁面刷新時觸發(fā),可以監(jiān)聽這個方法,讓頁面在刷新前存store到sessionStorage中。

當然,在頁面刷新時還要讀取sessionStorage中的數(shù)據到store中,讀取和儲存都寫在app.vue中。

export default { name: ’app’, created () { // 在頁面加載時讀取sessionStorage if (sessionStorage.getItem(’store’)) { this.$store.replaceState(Object.assign({}, this.$store.state, JSON.parse(sessionStorage.getItem(’store’)))) } // 在頁面刷新時將store保存到sessionStorage里 window.addEventListener(’beforeunload’, () => { sessionStorage.setItem(’store’, JSON.stringify(this.$store.state)) }) }}

補充知識:vue項目將token存在(vuex)store和localstorage中

一、準備工作和token

1、準備工作

了解(session,cookie)token

Token的引入:Token是在客戶端頻繁向服務端請求數(shù)據,服務端頻繁的去數(shù)據庫查詢用戶名和密碼并進行對比,判斷用戶名和密碼正確與否,并作出相應提示,在這樣的背景下,Token便應運而生。

token 是在服務端產生的一串字符串,以作客戶端進行請求的一個令牌。如果前端使用用戶名/密碼向服務端請求認證,服務端認證成功,那么在服務端會返回 Token 給前端。前端可以在每次請求的時候帶上 Token 證明自己的合法地位。如果這個 Token 在服務端持久化(比如存入數(shù)據庫),那它就是一個永久的身份令牌(除非設置了有效期)。

token 優(yōu)點

Token 完全由應用管理,所以它可以避開同源策略

Token 可以避免 CSRF 攻擊

Token 可以是無狀態(tài)的,可以在多個服務間共享

減輕服務器的壓力,減少頻繁的查詢數(shù)據庫,使服務器更加健壯。

安裝vuex

cnpm install vuex --save

2、介紹token用法

在前后端完全分離的情況下,Vue項目中實現(xiàn)token驗證大致思路如下:

1、第一次登錄的時候,前端調后端的登陸接口,發(fā)送用戶名和密碼

2、后端收到請求,驗證用戶名和密碼,驗證成功,就給前端返回一個token

3、前端拿到token,將token存儲到localStorage和vuex中,并跳轉路由頁面

4、前端每次跳轉路由,就判斷 localStroage 中有無 token ,沒有就跳轉到登錄頁面,有則跳轉到對應路由頁面

5、每次調后端接口,都要在請求頭中加token

6、后端判斷請求頭中有無token,有token,就拿到token并驗證token,驗證成功就返回數(shù)據,驗證失敗(例如:token過期)就返回401,請求頭中沒有token也返回401

7、如果前端拿到狀態(tài)碼為401,就清除token信息并跳轉到登錄頁面

二、創(chuàng)建storage,store,request

1、src目錄:

解決vue刷新頁面以后丟失store的數(shù)據問題

注:創(chuàng)建storage是可選的,因為我把localstorage(緩存)封裝到了storage.js(本文后續(xù)代碼均是用自己封裝的js);創(chuàng)建store是必須的!

2、創(chuàng)建storage(可選)

// 封裝操作localstorage本地存儲的方法 模塊化var storage = { set(key, value) { localStorage.setItem(key, JSON.stringify(value)); // localStorage.key = value; // localStorage[key] = value; }, get(key) { return JSON.parse(localStorage.getItem(key)); }, getForIndex(index) { return localStorage.key(index); }, getKeys(){ let items = this.getAll(); let keys = []; for (let index=0;index<items.length;index++){ keys.push(items[index].key); } return keys; }, getLength() { return localStorage.length; }, getSupport() { return (typeof (Storage) !== 'undefined') ? true : false; }, remove(key) { localStorage.removeItem(key); }, removeAll() { localStorage.clear(); }, getAll() { let len = localStorage.length; // 獲取長度 let arr = new Array(); // 定義數(shù)據集 for (var i = 0; i < len; i++) { // 獲取key 索引從0開始 var getKey = localStorage.key(i); // 獲取key對應的值 var getVal = localStorage.getItem(getKey); // 放進數(shù)組 arr[i] = {’key’: getKey,’val’: getVal, } } return arr; }}export default storage;

3、創(chuàng)建store

import Vue from ’vue’import Vuex from ’vuex’import storage from ’@/model/storage’Vue.use(Vuex);// 用Vuex.Store對象用來記錄tokenconst store = new Vuex.Store({ state: { // 存儲token // token: storage.get(’token’) ? storage.get(’token’) : ’’, token:'', userName:'' // 可選 }, actions: { // removeToken: () => { // context.commit(’set_token’) // } }, // 計算屬性 mutations: { // 修改token,并將token存入localStorage set_token(state,token) { state.token = token; storage.set(’token’, token); console.log(’store、localstorage保存token成功!’); }, del_token(state) { state.token = ''; storage.remove('token'); }, // 可選 setUserInfo(state, userName) { state.userName = userName; } }});export default store;

4、創(chuàng)建request

import axios from ’axios’import store from ’@/store’import router from ’@/router’// create an axios instanceconst service = axios.create({ // index.js設置了代理(解決跨域) invoice = http://58.246.79.142:25005 baseURL: '/invoice', // url = base url + request url timeout: 5000, // request timeout }})//添加請求攔截器,若token存在則在請求頭中加token,不存在也繼續(xù)請求service.interceptors.request.use( config => { // 每次發(fā)送請求之前檢測都vuex存有token,那么都要放在請求頭發(fā)送給服務器,沒有則不帶token // Authorization是必須的 if (store.state.token) { config.headers.Authorization = store.state.token; } return config; }, error => { console.log('在request攔截器顯示錯誤:', error.response) return Promise.reject(error); });//respone攔截器service.interceptors.response.use( response => { // 在status正確的情況下,code不正確則返回對應的錯誤信息(后臺自定義為200是正確,并且將錯誤信息寫在message),正確則返回響應 return response.data.code == 200 ? response : Promise.reject(response.data.message); }, error => { // 在status不正確的情況下,判別status狀態(tài)碼給出對應響應 if (error.response) { console.log('在respone攔截器顯示錯誤:', error.response) switch (error.response.status) {case 401: //可能是token過期,清除它 // this.$store.commit('del_token'); store.commit('del_token'); router.replace({ //跳轉到登錄頁面 path: ’/login’, // 將跳轉的路由path作為參數(shù),登錄成功后跳轉到該路由 query: { redirect: router.currentRoute.fullPath } }); } } return Promise.reject(error.response.data); });export default service

三、配置代理,封裝路由router、設置路由守衛(wèi),在main.js中引入router

一、配置代理

解決vue刷新頁面以后丟失store的數(shù)據問題

二、封裝路由router,并設置路由守衛(wèi)

/* eslint-disable */import Vue from ’vue’import Router from ’vue-router’import Main from ’@/main/index’import store from ’@/store’import storage from ’@/model/storage’Vue.use(Router)const routes = [ { path: ’/’, name: ’Main’, redirect: ’/login’, // 某些頁面規(guī)定必須登錄后才能查看 ,可以在router中配置meta,將需要登錄的requireAuth設為true, meta: { requireAuth: true, } }, { path: ’/login’, component: () => import(’@/views/login’), }, { path: ’/invoice’, redirect: ’/invoice’, component: Main, }, ] }, { path: ’*’, component: Main }]const router = new Router({ routes: routes })// 設置路由守衛(wèi),在進頁面之前,判斷有token,才進入頁面,否則返回登錄頁面if (storage.get('token')) { store.commit('set_token', storage.get('token'));}router.beforeEach((to, from, next) => { // 判斷要去的路由有沒有requiresAuth // to.matched.some(r => r.meta.requireAuth) or to.meta.requiresAuth if (to.matched.some(r => r.meta.requireAuth)) { if (store.state.token) { next(); //有token,進行request請求,后臺還會驗證token } else { next({ path: '/login', // 將剛剛要去的路由path(卻無權限)作為參數(shù),方便登錄成功后直接跳轉到該路由,這要進一步在登陸頁面判斷 query: { redirect: to.fullPath } }); } } else { next(); //如果無需token,那么隨它去吧 }});export default router

三、在main.js中引入router

import Vue from ’vue’// import Vuex from ’vuex’import App from ’./App’import router from ’./router’import ElementUI from ’element-ui’;import ’element-ui/lib/theme-chalk/index.css’// import VueResource from ’vue-resource’// import axios from ’axios’// 兼容ie// import ’babel-polyfill’;Vue.use(ElementUI);// Vue.use(Vuex);// Vue.use(VueResource);// Vue.use(axios);Vue.config.productionTip = falseVue.component(CollapseTransition.name, CollapseTransition)// this.$ajax 全局使用axios// Vue.prototype.$ajax=axios;new Vue({ el: ’#app’, router:router, components: { App }, template: ’<App/>’})

四、登錄頁面實際使用

只給出表單提交示例函數(shù)和依賴js

import { postLogin } from '@/api/login';submitForm(formName) { this.$refs[formName].validate(valid => { if (valid) { let that = this; // console.log(’username’,this.loginForm.username) // 通過校驗規(guī)則后進入校驗用戶名密碼是否正確 postLogin(this.loginForm.username, this.loginForm.password) .then(res => { console.log(res); that.$store.commit('set_token', res.data.token);that.$store.commit('setUserInfo', res.data.account); this.$notify({title: '登錄成功',type: 'success',showClose: false,duration: 1000 }); setTimeout(() => {// 此時要判斷/login后面的參數(shù),若無參數(shù),進入主頁;this.$router.push('/index');// 若有參數(shù)則參數(shù)為未有權限的那個路由,跳轉到那個路由// this.$router.push(***); -- 具體要自己在這實現(xiàn) }, 1000); }) .catch(error => { // 錯誤分為 status-請求錯誤 和 code-賬號密碼錯誤 this.$message.error(error); console.log(error); }); } else { // 不符合前端校驗 this.$message.error(’format error:’+error); console.log(’format error:’,error); return false; } }); }

上面依賴的@/api/login:

import request from ’@/utils/request.js’export function postLogin(account,password) { console.log(account,password) return request({ url: ’/login’, method: ’post’, params:{ // 具體傳參(鍵)要看后臺要求 account:account, password:password } })}

以上這篇解決vue刷新頁面以后丟失store的數(shù)據問題就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持好吧啦網。

標簽: Vue
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲一区二区三区久久久| 日韩高清成人在线| 一二三区精品| 午夜欧美精品| 国产欧美另类| 最新日韩欧美| 国产精品18| 99久久婷婷| 欧美亚洲专区| 激情偷拍久久| 韩国女主播一区二区三区| 亚洲激情黄色| 国产中文在线播放| 久久精品国产一区二区| 最新日韩欧美| 国产aa精品| 日本不卡视频在线观看 | 国产精品一区二区三区av麻| 三上亚洲一区二区| 日本va欧美va精品发布| 亚洲三级欧美| 精品一区二区三区在线观看视频| 欧美a级片一区| 精品九九久久| 日韩福利在线观看| 六月婷婷一区| 亚洲三级毛片| 久久精品xxxxx| 久久一二三区| 午夜日韩福利| 日韩成人亚洲| 91精品一区二区三区综合| 国产毛片精品| 久久国产视频网| 亚洲精品乱码日韩| 三级欧美在线一区| 国户精品久久久久久久久久久不卡 | 尹人成人综合网| 国产伦精品一区二区三区在线播放| 欧美特黄a级高清免费大片a级| 国产视频网站一区二区三区| 999精品在线| 欧洲精品一区二区三区| 日韩一区二区三区精品| 久久久久国产精品一区三寸| 国产极品久久久久久久久波多结野 | 99久久99久久精品国产片果冰 | 精品国产免费人成网站| 久久国际精品| 日本三级亚洲精品| 久久性天堂网| 丝袜a∨在线一区二区三区不卡| 中文字幕中文字幕精品| 国产福利一区二区三区在线播放| 亚洲欧美日韩一区在线观看| 蜜桃视频在线网站| 精品视频自拍| 国产精品videossex久久发布| 婷婷成人av| 蜜桃一区二区三区在线观看| 日韩欧美三级| 亚洲1234区| 中文字幕高清在线播放| 欧美激情麻豆| 久久99青青| 黄色网一区二区| 精品亚洲二区| 精品72久久久久中文字幕| 狠狠久久伊人| 国产精品高颜值在线观看| 欧美亚洲日本精品| 亚洲黄色免费av| 亚洲日本网址| 亚洲欧洲另类| 日韩一区免费| 在线午夜精品| 免费成人在线影院| 蜜臀av亚洲一区中文字幕| 蜜臀av亚洲一区中文字幕| 日韩精品一卡二卡三卡四卡无卡| 亚洲一区二区动漫| 久久国产乱子精品免费女| 欧美激情视频一区二区三区在线播放| 高清久久精品| 欧美~级网站不卡| 在线精品视频一区| 久久精品国产99| 午夜久久福利| 一区二区日韩免费看| 亚洲一区二区日韩| 日韩一级欧洲| 男人的天堂久久精品| 亚洲香蕉久久| 久久免费福利| 国产精品巨作av| 久久久久久久久99精品大| 97精品国产福利一区二区三区| 在线综合欧美| 伊人久久视频| 亚洲精品在线影院| 久久天堂成人| 免费观看在线综合| 国产精品自在| 精品一区二区三区四区五区| 久久三级视频| 日韩国产在线观看一区| 日韩电影免费网址| av资源亚洲| 成人精品国产亚洲| 麻豆成人在线观看| 首页国产欧美久久| 日韩一区电影| 日韩三级一区| av亚洲免费| 精品视频一区二区三区在线观看 | 麻豆一区二区在线| 亚洲深夜av| 日韩大片免费观看| 亚洲三级毛片| 亚洲免费影院| 午夜精品免费| 久久激情一区| 九九精品调教| 国产videos久久| 国产精品videosex极品| 国产高清久久| 欧美福利在线| 亚洲天堂日韩在线| 日本色综合中文字幕| 国产精品s色| 激情久久久久久| 亚欧成人精品| 国产亚洲一卡2卡3卡4卡新区| 欧美黄页在线免费观看| 日韩欧美中文| 另类国产ts人妖高潮视频| 老色鬼精品视频在线观看播放| 久久九九国产| 日韩三级久久| 青青久久av| 久久99精品久久久野外观看| 激情五月综合| 免费一级欧美片在线观看网站| 欧美va天堂在线| 另类专区亚洲| 91精品婷婷色在线观看| 久久久水蜜桃av免费网站| 国产一区日韩欧美| 99在线精品免费视频九九视| 久久天堂影院| 欧美国产日韩电影| 少妇精品久久久一区二区| 中文字幕亚洲精品乱码| 国产精品久久久免费| 国产精品色婷婷在线观看| 精品国产一区二区三区噜噜噜| 精品91福利视频| 欧美日韩一区二区综合 | 国产亚洲精品美女久久| 国产精品白丝久久av网站 | 一区二区国产在线| 美女视频网站久久| 麻豆精品蜜桃| 日韩精品免费视频人成| 97在线精品| 中文字幕亚洲精品乱码| 久久成人高清| 久久人人88| 日韩va亚洲va欧美va久久| 久久久久久黄| 国产精品一区二区精品视频观看| 欧洲亚洲一区二区三区| 国产探花一区在线观看| 亚洲欧美高清| av中文字幕在线观看第一页 | 久久高清精品| 欧美国产三级| 婷婷亚洲成人| 午夜欧美精品| 久久女人天堂| 日韩精品亚洲一区二区三区免费| 久久久久久久久丰满| 免费精品一区| 91欧美极品| 日韩成人午夜精品| 婷婷激情综合| 三上亚洲一区二区| 麻豆国产欧美一区二区三区 | 模特精品在线| jiujiure精品视频播放| 丝袜av一区| 蜜桃av.网站在线观看| 欧美久久久网站| 一区二区三区四区在线观看国产日韩| 日韩免费高清| 日韩欧美二区| 在线一区视频观看| 久久久人人人| 99久久久久国产精品| 欧美亚洲国产一区|