Vue项目保持用户登录状态(localStorage + vuex 刷新页面后状态依然保持)

news2025/2/28 2:59:23

        在前端项目开发中,实现用户的登陆注册功能时常常会有一个问题,那就是我们设置的登录状态,在浏览器页面刷新后就消失了,这其实只是因为我们没有保存用户状态。

这里小马演示使用的是 localStorage + vuex 方法(其他诸如 sessionStorage、cookie 等用法相同,只是功能有所区别)。 


一、实现效果

实现功能:用户登录成功后,刷新浏览器页面或者关闭浏览器再次打开网页后,登录状态依然保持,直到用户点击登出。

二、实现步骤及涉及要点

1. 首先在 vuex 中的 state 属性中添加一个空对象 userInfo{ } 用于保存用户登录后的状态;

涉及要点:

  • state 属性(状态)用于添加多个组件共享的变量,作用类似于 vue 中的 data;

2. 在登录页面中,判断登录成功后创建对象 userInfo{ },并添加描述登录状态的各属性,然后将该对象分别存入 localStorage 和 vuex; 

涉及要点:

  • localStorage 属性允许访问 Document 源的 Storage 对象,存储的数据保存在浏览器会话中;
  • 与 sessionStorage 的唯一区别就是 localStorage 属于永久性存储,除非我们手动清除,而 sessionStorage 属于临时存储,浏览器关闭后便会被清空。
    • 存:localStorage.setItem('myCat', 'Tom');
    • 取:var cat = localStorage.getItem("myCat");
    • 删:localStorage.removeItem("myCat"); 或 localStorage.clear("myCat");
  • JSON.stringify() 系列化对象,将返回的对象类型转为字符串类型;
  • this.$store.state,取 vuex 中 state 中的属性,如:
    • this.$store.state.userInfo = userInfo //取出 vuex 中的 userInfo 并赋值为新的 userInfo

3. 在挂载阶段,判断登录状态 userInfo;设置相关属性之后,就可以正常保存登录状态了。

因为 localStorage 为永久保存,所以即使关闭浏览器再次打开网页登录状态依然存在,除非手动清除 localStorage 数据;

4. 设置登出,清除 localStorage 中的数据;

5. 实现功能。

三、涉及代码

vuex(store/index.js)

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

Vue.use(Vuex)

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

设置登录的页面(部分代码,无法复制即用,仅作参考)

登录方法

//登录方法
login() {
  //验证码的验证
  var randStr = this.rand.toString().replace(/,/g, ""); //随机生成的验证码为数组形式,此处将其转为字符串并去掉中间相隔的逗号
  var codeStr = this.code; //用户输入的验证码
  if (randStr.toLowerCase() == codeStr.toLowerCase()) { //比较用户输入的与随机生成的验证码,不区分大小写
    //获取登录接口
    axios.post("user/login", {
      name: this.name,
      password: this.password,
      administrator: this.usertyp
    }).then(result => {
      console.log(result.data);
      const code = result.data.code;
      this.token = code;
      if (this.token == 1003) {
        this.$message.error('用户名或密码未输入!');
      } else if (this.token == 1001) {
        this.$message.error('登录失败,请检查用户名或者密码是否正确。');
      } else if (this.token == 1005) {
        this.$message.error('您不是管理员,无管理员登录权限!');
      } else if (this.token == 200) {
        if (this.usertyp == "2") { //管理员登录
          this.$message.success('登录成功!');
          this.dialogFormVisible = false; //登录成功后登录插槽关闭
          this.loginReg = false;//隐藏登录注册按钮,显示欢迎信息
          this.manage = true;//显示管理员登录信息
          let userInfo = {
            isLogin: true,
            manage: true,
            name: this.name
          };
          localStorage.setItem("userInfo", JSON.stringify(userInfo));
          this.$store.state.userInfo = userInfo
          console.log('this.$store.state.userInfo', this.$store.state.userInfo)
          setTimeout(() => { //此处必须使用vue函数,否则this无法访vue实例
            this.$message(`欢迎您,管理员 ${this.name}!`)
          }, 2000);
          console.log(this.usertyp)
        } else if (this.usertyp == "") {  //普通用户
          this.$message.success('登录成功!');
          this.dialogFormVisible = false; //登录成功后插槽关闭
          this.loginReg = false;//隐藏登录注册按钮,显示欢迎信息
          this.user = true; //显示普通用户登录信息
          let userInfo = {
            isLogin: true,
            manage: false,
            name: this.name
          }
          localStorage.setItem("userInfo", JSON.stringify(userInfo));
          this.$store.state.userInfo = userInfo
          setTimeout(() => { //此处必须使用vue函数,否则this无法访vue实例
            this.$message(`欢迎您,尊贵的晋之魂用户 ${this.name}!`)
          }, 2000);
          console.log(this.usertyp)
        }
        this.Cookie.set("UserName", this.name); //将用户名存到cookie
        console.log('登录状态为:' + this.token);
      }
    })
  } else {
    this.$message.error('请输入正确的验证码');
  }
},

退出登录方法

//退出登录
logout() {
  this.Cookie.remove("UserName");
  this.loginReg = true;
  this.manage = false;
  this.user = false;
  this.log_out = false;
  localStorage.clear();
  setTimeout(() => {
    this.$router.push({
      path: '/'
    }, () => {
    }, () => {
    });//退出登录后2秒后跳转至首页
  }, 2000)
  //加()=>{},()=>{} 可解决路由重复后台报错问题
},

挂载阶段判断登录状态

mounted() {
      // 判断登录状态
      let userInfo = JSON.parse(localStorage.getItem('userInfo'));
      if (null === userInfo) return;
      console.log('userInfo', userInfo.isLogin);
      if (userInfo.isLogin) {
        this.dialogFormVisible = false; //登录成功后插槽关闭
        this.loginReg = false;//隐藏登录注册按钮,显示欢迎信息
        this.name = userInfo.name;
        if (userInfo.manage) {
          this.manage = true;//显示管理员登录信息
        } else {
          this.user = true;//显示普通用户登录信息
        }
      }
    }

提示:小马使用的是 vue + Element UI,使用其他技术代码可能不同,但思路是不变的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/405102.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot+Vue实现简单用户管理平台第一篇(后端接口设计)

🚀 注重版权,转载请注明原作者和原文链接🥭 作者:Yuan-Programmer🍎 主页:https://blog.csdn.net/weixin_47971206/article/details/121368075?spm1001.2014.3001.5502🍉 进来的小伙伴点点赞呀…

nuxt3:我们开始吧-开发-配置-部署

一、背景介绍 2022 年 11 月 16 日,全球最大的 Nuxt 会议 Nuxt Nation 2022 在线举行,并正式发布了 Nuxt.js 3.0 的第一个稳定版本。Nuxt 3 是基于 Vite、Vue3 和 Nitro 的 Nuxt 框架的现代重写,具有一流的 Typescript 支持,是两年…

前端基础从头学——VsCode使用教程+html基础(入门篇)

作者简介:hello!大家好,初学前端知识,请多多指教。 希望我的分享能够帮助到更多的人,如果觉得我的分享有帮助的话,请大家一键三连支持一下哦~ 文章目录前言一、VsCode编辑器使用教程1、VsCode的下载与安装2…

HTML+CSS+JS+Jquery+练手项目+...合集(前端学习必备,持续更新中...)

非常实用的教程案例,均有详细的步骤讲解,不懂得可以私信博主,看到就会回的!未来将继续更新Vue,React等更多前端知识,欢迎收藏关注! 文章目录一、HTML二、CSS三、JavaScript四、jQuery五、 前端项…

PromiseA+规范之手写Promise

前言 1、Promise 的意义? 在javascript的世界中,所有代码都是单线程执行的,由于这个“缺陷”,导致JavaScript的所有网络操作,浏览器事件,都必须是异步执行。Ajax可以解决这个问题,但是并不好复用…

【flask进阶】Flask实现自定义分页(python web通用)

📋 个人简介 💖 作者简介:大家好,我是阿牛,全栈领域新星创作者。😜🎉 支持我:点赞👍+收藏⭐️+留言📝📣 系列专栏:flask框架快速入门🍁💬格言:要成为光,因为有怕黑的人!🔥 目录 📋 个人简介前言后端后端思路后端代码前端前端思路前端代码

微信小程序 - 完美解决 web-view 公众号文章或第三方网站分享转发后,打开提示 “无法打开该页面,不支持打开” 或 “页面不存在”(IOS 苹果系统打开是空白页,安卓系统会有提示)超详细排查

前言 由于出现这种问题的原因有很多种,绝对不像其他文章教程那样无效,本文提供了超级详细的排查思路与解决方案。 本文从 [初步排查] 到 [代码排查],完美解决 因各种原因导致 webview 页面分享后,用户打不开提示错误 这类问题, 您只需要按照排查步骤一步一步的走,从检查…

echarts入门教程(超级详细带案例)

一.echarts的介绍 1.echarts是一款基于JavaScript的数据可视化图表库,提供直观,生动,可交互,可个性化定制的数据可视化图表。ECharts最初由百度团队开源,并于2018年初捐赠给Apache基金会,成为ASF孵化级项目…

防抖、节流的介绍

目录 一、什么时候要用到防抖节流 输入框连续输入的案例 滚动条案例 二、什么是防抖、节流 使用防抖来解决输入框案例造成的浪费现象: 使用节流来解决滚动条案例造成的浪费现象: 三、总结 一、什么时候要用到防抖节流 针一类类快速连续触发和不可控…

不会前端没事,用GWT Boot和Spring Boot构建Web程序

本文介绍了一种使用Java构建Web应用程序的方式,其中GWT或者J2CL是必不可少的,另外还有多个UI框架可以配套使用,比如Domino UI、VueGWT、GWT Material Design (GMD),React4J、WebFX,还有一些活跃低的框架GWTBootstrap3、…

2023前端面试题及答案整理(Vue)

watch 和 computed 区别 watch 是监听动作,computed 是计算属性watch 没缓存,只要数据变化就执行。computed 有缓存,只在属性变化的时候才去计算。watch 可以执行异步操作,而 computed 不能watch 常用于一个数据影响多个数据&…

Vue项目部署上线全过程(保姆级教程)

Vue项目部署上线全过程(保姆级教程) 上线前准备 1.先在vue.config.js文件中配置反向代理解决跨域请求问题 const { defineConfig } require(vue/cli-service) module.exports defineConfig({transpileDependencies: true,devServer: {proxy: {"…

web渗透测试学习路线

web渗透学习路线 文章目录*web渗透学习路线*前言一、web渗透测试是什么?二、web渗透步骤1.前期工作2.中期提高3.后期打牢总结前言 本文整理的学习路线,清晰明了,重点分明,能快速上手实践,相信想学的同学们都能轻松学完…

vue实现文件上传

这里使用的是vue2,ui用的是element ui ,后期有时间会更新vue3版本的。前端文件上传使用的是ui框架中的Upload的图片列表缩略图,喜欢别的样式可以直接更改。看图注fileChange():方法可以直接获取到上传文件的状态及可以直接拿到图片的值可以新…

Redux中进行异步操作(网络请求)的方案

文章目录Redux中的异步操作组件中进行异步操作redux中进行异步操作Redux中的异步操作 在之前简单的案例中,redux中保存的counter是一个本地定义的数据 我们可以直接通过同步的操作来dispatch action,state就会被立即更新。 但是真实开发中,r…

Vue3 项目创建

安装 1、安装node vue 3需要node10以上版本 node官网下载地址以往的版本 | Node.js 2、安装vue/cli 如果已经全局安装过旧版本的vue-cli npm uninstall vue-cli -g //yarn global remove vue-cli 然后安装 npm install -g vue/cli //yarn global add vue/cli 为什…

使用vue,实现前端导入excel数据

文章目录 前言一、引入组件二、封装导入功能的组件 1.编写组件template2.获取数据3.调用接口把数据传给后端三、总结前言 继前边的vue的导出功能后,自己又去在网上搜了vue导入excel一些文章,自己通过对代码的整理和调整,实现了vue导入excel的…

Vue3报错:Property “xxx“ was accessed during render but is not defined on instance.

Vue3报错:Property “xxx” was accessed during render but is not defined on instance. 翻译:属性“xxx”在呈现期间被访问,但没有在实例上定义。 其实就是在模板上有,但是在script上没有定义 很多同学跟说这不是报错&#…

Vue2-基础知识

目录 一.vue简介 1.概念 2.特性 (1)数据驱动视图 (2)双向数据绑定 3.MVVM 4.基本使用步骤 5.调试工具 二.vue基础 1.指令 (1)内容渲染指令 (2)属性绑定指令 (3)事件绑定指令 (4)双向绑定指令 ​编辑(5)条件渲染指令 (6)列表渲染指令 2.过滤器 (1)概念 (2)分…

HTML5设计注册/登录界面

学习目标: 掌握 HTML5入门知识掌握 CSS入门知识学习内容: 掌握 HTML5基本语法掌握CSS基本语法HTML5网页设计掌握块级标签掌握行内标签表单的使用方法iput常用属性学习时间: 周一至周五早上 7 点—晚上9点周六上午 9 点-晚上9点周日下午 3 …