怎样使刷新不跳转页面,vuex数据也不消失

目前实现的效果:
1.刷新 和 跳转任何页面都会跳到登录页面
2.路由拦截屏蔽后,刷新页面vuex里的数据都消失了

问题:
1.设置路由拦截后,实现了不登录全跳转至登录页面,但是刷新也都跳转到登录页面
2.路由拦截屏蔽后,刷新页面vuex里的数据都消失了,知道可以存在localStorage,但是具体的怎么实现呢?
3.用户数据少可以存在localStorage里,但是主页的所有数据就不少了,难道也存在里面吗?
4.可不可以让刷新页面和路由拦截结合起来,刷新页面再请求用户数据和当前页面的数据,具体怎么实现?

最终实现结果:刷新后依然保持在当前页面,并且数据不消失

代码:
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 }
});

求大神帮忙!!!

阅读 6.7k
9 个回答

使用把登录状态储存在sessionStorage中方法解决的,链接描述

简单回答一下,因为我们的项目也有类似的需求,并被我们的老大整理完毕了
首先localStorage是vue.js我理解是vue.js中的全局变量,并且会记录在缓存中,刷新不会丢失,使用起来也很简单,localStorage.user_id='001'进行存储,localStorage.user_id取值。
其次就是localStorage的定义,我们不可以完全依赖他,就像你说的,不可能将主页数据都存在里面,那你这个页面维护起来都是问题。我对他的定义是,存储必要的,刷新不能丢失的主键类数据,比如user_id。
而用vuex管理的store,他的机制就是在页面中刷新就释放的。

到这里,我简单说一说我们是怎么做的,仅供参考。
我们的一些用户信息相关的对象,存储在store中进行管理,并且在localStorage中存储user_id以及token。
首先在main.js中创建路由拦截,判断to的页面是否需要登录权限,如果需要登录权限,优先判断store中是否有登录状态码,如果没有,有可能是刷新页面导致的,去判断localStorage中是否有token、user_id,如果没有,直接返回登录页。如果localStorage中有相关信息,那么好,我们在这里直接进行一次查询,将用户相关信息再次写入store中存储。

仅供参考,思路捋清楚了,该怎么做也就一目了然了。

刷新代表就是重启项目,数据肯定会丢失
给你提供俩种给用户错觉感是没有丢失的方案:

1 纯前端实现 / 也就是 本地存储, sessionStorage,和localStorage  具体不介绍了 百度一堆,好处就是
实现简单 无非set get俩个方法存取,坏处 万一本地存储满了,或者删了 或者导致用户体验卡了等等一系列问题

2 前后端配合,写俩个接口,一个是存一个是获取,刷新前需要请求接口把数据存进去,刷新之后把数据拿回来
这个比较繁琐,但是不会出现较大的问题 **=bug**

看你需求 看你服务的人群 看你产品的态度 综合考虑

我说一下我的想法,希望对你有所帮助!
1、刷新相当与重启项目,之前获取到的数据也只是通过store暂存起来,项目关闭时就不见了,这有些像电脑重启,存储在RAM的数据会消失。
2、既然是刷新,用localStorage的话你关闭浏览器或者标签数据还在,这样用户体验不好,而且随着数据增多,没有及时删除的话,会导致更新项目的时候以前的数据冲突,这时候最好是使用sessionStorage,和localStorage差不多,差别在于关闭标签或者浏览器时数据就会自动清除。
3、对于提到的前面主页保存的数据,当然也要保存到sessionStorage中,虽然保存的大小有限制,但是一般项目数据绝对是够装的。
4、项目加载时,可以在created先进行判断sessionStorage是否存在对应的数据,有的话,将数据commitstore中去,没有就正常加载,发送请求来请求数据等一系列操作。

sessionStorage 页面刷新不消失 关闭浏览器消失
localStorage 浏览器关闭不消失
只要存储登录状态
根据需求看用哪个
可以找下vuex 插件 关于localStorage 的 插件很简单 改成sessionStorage 只要换个名字

vuex有个插件,就是把vuex数据自动保存到本地存储,自动取值,很方便,忘了叫什么了

  • 登录问题:

    1、登录时叫后端把登录状态放在cookie,并且只读且设置数据超时。
    2、调后端api去获取登录状态。
    如果前端自己放在cookie、sessionStorage、localStorage,那只要f12 修改一下登录
    状态的值就可以跳过拦截。

  • 主页里的其他数据在刷新后都应该重新调api获取。用缓存的话,需要考虑数据超时、数据有效性的问题,并且用户刷新页面不就是希望页面能够重新获取。

vuex 的持久化组件 vuex-persistedstate;

使用方法

import createPersistedState from 'vuex-persistedstate';

export default new Vuex.Store({

    plugins: [createPersistedState()]
})
推荐问题
宣传栏