Vue.js 中的登录状态管理:使用计算属性避免重复登录20240531

Vue.js 中的登录状态管理:使用计算属性避免重复登录

在前端开发中,用户的登录状态管理是一个非常常见的需求。我们希望用户在成功登录后,即使刷新页面,也能够保持登录状态,而不需要再次登录。在 Vue.js 中,这可以通过响应式引用和计算属性来实现。本文将详细介绍如何使用 Pinia 状态管理库,通过计算属性避免重复登录的问题。

问题描述

在实现用户登录状态管理时,我们遇到一个问题:使用响应式引用存储用户信息和 token 时,无法有效避免重复登录。然而,当我们改用计算属性来存储这些信息时,问题得以解决。这是为什么呢?

响应式引用和计算属性

响应式引用 (ref)

ref 是 Vue.js 提供的一种方式,用于创建响应式的数据容器。它可以容纳任意类型的值,并使这些值在响应式系统中可追踪。

let _user = ref({});
let _token = ref("");

计算属性 (computed)

computed 是基于其他响应式数据计算出来的属性。它们会缓存结果,直到依赖的响应式数据发生变化时才重新计算。

let user = computed(() => {if (Object.keys(_user.value).length === 0) {let user_str = localStorage.getItem(USER_KEY);if (user_str) {_user.value = JSON.parse(user_str);}}return _user.value;
});let token = computed(() => {if (!_token.value) {let token_str = localStorage.getItem(TOKEN_KEY);if (token_str) {_token.value = token_str;}}return _token.value;
});

解决方案

为了确保用户在页面刷新后无需重新登录,我们可以使用计算属性来管理用户信息和 token。这样,当我们访问计算属性时,它们会自动从 localStorage 中加载数据,并初始化响应式引用。

完整代码

auth.js
import { ref, computed } from "vue";
import { defineStore } from "pinia";const USER_KEY = "OA_USER_KEY";
const TOKEN_KEY = "OA_TOKEN_KEY";export const useAuthStore = defineStore("auth", () => {let _user = ref({});let _token = ref("");function setUserToken(user, token) {_user.value = user;_token.value = token;localStorage.setItem(USER_KEY, JSON.stringify(user));localStorage.setItem(TOKEN_KEY, token);}let user = computed(() => {if (Object.keys(_user.value).length === 0) {let user_str = localStorage.getItem(USER_KEY);if (user_str) {_user.value = JSON.parse(user_str);}}return _user.value;});let token = computed(() => {if (!_token.value) {let token_str = localStorage.getItem(TOKEN_KEY);if (token_str) {_token.value = token_str;}}return _token.value;});let is_logined = computed(() => {if (Object.keys(user.value).length > 0 && token.value) {console.log("is_logined return true");return true;}return false;});return { setUserToken, user, token, is_logined };
});
router/index.js
import { createRouter, createWebHashHistory } from 'vue-router';
import login from '@/views/login/login.vue';
import frame from '@/views/main/frame.vue';
import { useAuthStore } from '@/stores/auth';const router = createRouter({history: createWebHashHistory(import.meta.env.BASE_URL),routes: [{path: '/',name: 'frame',component: frame},{path: '/login',name: 'login',component: login}]
});// 钩子函数实现导航守卫,判断用户是否已登陆
router.beforeEach((to, from) => {const authStore = useAuthStore();if (!authStore.is_logined && to.name !== 'login') {return { name: 'login' };}
});export default router;

详细步骤

  1. 存储用户信息和Token: 当用户登录成功后,调用 setUserToken 方法,将用户信息和 token 存储在 localStorage 中,并更新 _user_token
  2. localStorage 读取数据: usertoken 计算属性在首次访问时从 localStorage 读取数据,并初始化 _user_token
  3. 计算 is_logined: is_logined 依赖于 user.valuetoken.value,这确保在计算登录状态时,数据已经被正确初始化。
  4. 路由守卫: 在每次路由跳转前,通过路由守卫检查用户是否已登录。如果用户未登录且试图访问受保护的页面,则重定向到登录页面。

总结

通过使用计算属性,我们能够确保在计算用户登录状态时,依赖的数据已经被正确初始化和加载。这避免了用户在页面刷新后需要重新登录的问题,从而提升了用户体验。

希望这篇文章能帮助你理解 Vue.js 中的登录状态管理。如果你有任何问题或建议,欢迎留言讨论!

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

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

相关文章

MySQL之创建高性能的索引(九)

创建高性能的索引 使用索引扫描来做排序 MySQL有两种方式可以生成有序的结果:通过排序操作;或者按索引顺序扫描(MySQL有两种排序算法);如果EXPLAIN出来的type列的值为"index",则说明使用了索引扫描来做排序(不要和Extra列的"…

怎么控制员工电脑的文件外发,六个控制文件外发的小窍门你必须了解

控制员工电脑的文件外发是企业信息安全管理中的重要环节,旨在防止敏感数据泄露、保护知识产权和维护商业秘密。 企业可以通过多种技术和管理措施相结合的方式来达到这一目的,确保既有效控制文件外发风险,又不影响正常的业务运作和员工工作效…

排序题目:删除某些元素后的数组均值

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法思路和算法代码复杂度分析 题目 标题和出处 标题:删除某些元素后的数组均值 出处:1619. 删除某些元素后的数组均值 难度 2 级 题目描述 要求 给定一个整数数组 arr \texttt{arr} arr&…

文献阅读:GCNG:用于从空间转录组数据推断基因相互作用的图卷积网络

文献介绍 「文献题目」 GCNG: graph convolutional networks for inferring gene interaction from spatial transcriptomics data 「研究团队」 Ziv Bar-Joseph(美国卡内基梅隆大学) 「发表时间」 2020-12-10 「发表期刊」 Genome Biology 「影响因子…

python 贪心算法(Greedy Algo)

贪婪是一种算法范式,它逐步构建解决方案,始终选择提供最明显和直接收益的下一个部分。贪婪算法用于解决优化问题。 如果问题具有以下属性,则可以使用贪心法解决优化问题: 每一步,我们都可以做出当前看来最好的选择&…

Python模块之Pandas(三)-- DataFrame 查看形状和部分数据

查看数据框的形状: import pandas as pd data pd.read_csv("D:/my_data/data1.csv")print(data的形状为:, data.shape) 查看数据前10行: data.head(10) #查看数据前10行 查看数据后10行: data.tail(10) 查看数据某几列/某几…

3d网渲100比本地渲染快吗?渲染100邀请码1a12

3D网渲是一种基于云计算的技术,它将渲染工作交由云端进行,以网渲平台渲染100为例,比起本地渲染,它有以下一些优势。 1、本地渲染受硬件限制,只能一台电脑渲染一张图,而渲染100有充足的服务器数量&#xf…

Unity中的Surface Effector 2D组件

Surface Effector 2D 是 Unity 中 2D 物理引擎提供的一个组件,用于影响与其接触的 2D 对象的运动。它可以对碰撞到其表面的物体施加速度和力,从而改变这些物体的运动行为。下面是一些关于 Surface Effector 2D 的关键点: 主要属性 Speed&am…

QT 音乐播放器【一】 显示音频级别指示器

文章目录 效果图概述代码总结 效果图 概述 QMediaPlayer就不介绍了,就提供了一个用于播放音频和视频的媒体播放器 QAudioProbe 它提供了一个探针,用于监控音频流。当音频流被捕获或播放时,QAudioProbe 可以接收到音频数据。这个类在需要访问…

如何选择采购管理软件解决方案:推荐与指南

选择一款合适自身企业采购模式的管理软件对于企业来说至关重要。一款好的采购管理软件不仅能够提高采购效率,还能降低采购成本、优化库存管理、增强供应链的透明度和可控性。而在选择采购管理软件时,大家还需要考虑以下几个关键因素: 一、需…

代码随想录训练营Day56:Leetcode647、516

Leetcode647: 问题描述: 给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。 回文字符串 是正着读和倒过来读一样的字符串。 子字符串 是字符串中的由连续字符组成的一个序列。 示例 1: 输入:s &q…

C/C++动态内存管理(new与delete)

目录 1. 一图搞懂C/C的内存分布 2. 存在动态内存分配的原因 3. C语言中的动态内存管理方式 4. C内存管理方式 4.1 new/delete操作内置类型 4.2 new/delete操作自定义类型 1. 一图搞懂C/C的内存分布 说明: 1. 栈区(stack):在…

前端开发三大主流框架解析

Web前端三大主流框架分别是Angular、React和Vue.js。以下是《优联前端》关于这三个框架解析介绍: Angular: 来源与开发者:Angular是由Google开发的前端框架。功能特点:Angular是一个完整的框架,包括了数据绑定、组件化…

计组雨课堂(5)知识点总结——备考期末复习(xju)

在汇编语言源程序中,“微指令语句"不是常见的组成部分,因为微指令通常是在硬件层面进行处理的,而不是在汇编语言层面。因此,不属于汇编语言源程序的是"微指令语句”。在汇编语言中,组成指令语句和伪指令语句…

直方图滤波、粒子滤波、卡尔曼滤波

三者都是基于贝叶斯滤波。 粒子滤波和直方图滤波不要求高斯分布,可解决非线性 卡尔曼滤波要求高斯分布且线性。扩展卡尔曼滤波为了解决非线性问题,利用泰勒展开进行一阶近似。 直方图滤波就是贝叶斯滤波的直观实现。自动驾驶定位算法-直方图滤波(Hist…

什么是SpringCloud? --学习笔记

什么是SpringCloud? 想象一下,你要建一个现代化城市,这个城市由很多小区组成,每个小区承担着不同的职能,比如居住、购物、娱乐、教育等。在这个城市中,小区之间需要互相沟通协作,确保整个城市的…

【Linux终端探险】:从入门到熟练,玩转基础命令的秘密(二)

文章目录 🚀Linux基础命令(二)🌈1. 寻找目录/文件命令⭐2. 创建文件命令👊3. 网络接口查询命令❤️4. 打包命令💥5. 解压命令 上期回顾: 🔥🔥🔥【Linux终端探…

python 批量ts合并成一个mp4

首先,确保你已经安装了ffmpeg。 然后再次保证所有ts文件放在同一个文件夹中,并且依次命名为 1.ts 、 2.ts 、 3.ts 、 4.ts 、 4.ts 。。。 Python完整代码如下:(ffmpeg_batch_merge_ts.py文件) #!/usr/bin/python3 # -*- coding: UTF-8 -*…

19、matlab信号预处理中的中值滤波(medfilt1()函数)和萨维茨基-戈雷滤波滤(sgolayfilt()函数)

1、中值滤波:medfilt1()函数 说明:一维中值滤波 1)语法 语法1:y medfilt1(x) 将输入向量x应用3阶一维中值滤波器。 语法2:y medfilt1(x,n) 将一个n阶一维中值滤波器应用于x。 语法3:y medfilt1(x,n…

2024年项目任务管理软件大盘点:12款值得一试的主流工具

12款优秀的项目任务管理软件:PingCode、Worktile、AIrTable、ClickUp、Teambition、Asana、Todoist、TAPD、Monday.com、Notion、Microsoft Project、Trello。 任务管理软件对于生活繁忙的人来说极为重要。它帮助用户有效跟踪他们需要完成的各项任务,包括…