「网页开发|前端开发|Vue」09 Vue状态管理Vuex:让页面根据用户登录状态渲染不同内容

news2024/11/25 20:55:56

本文主要介绍如何通过Vue的状态管理框架Vuex来管理一些被不同组件或不同页面共同使用的数据,然后展示如何通过状态管理用户信息,并且在具体页面获取用户信息,并且根据用户信息的不同展示不同的页面内容。

文章目录

  • 本系列前文传送门
  • 一、场景说明
  • 二、状态管理Vuex
    • 安装vuex
    • 状态管理 - 创建状态
    • 状态管理 - 在代码各处使用创建的状态
    • 状态管理 - 在代码中更新状态管理的值
  • 三、用户登录数据如何流转如何变化
  • 四、简单模拟用户登录过程

本系列前文传送门

  • 「网页开发|前端开发|Vue」01 快速入门:快速写一个Vue的HelloWorld项目
  • 「网页开发|前端开发|Vue」02 从单页面到多页面网站:使用路由实现网站多个页面的展示和跳转
  • 「网页开发|前端开发|页面布局」03 学会够用的CSS,实现任意你想要的页面布局
  • 「网页开发|前端开发|Vue」04 快速掌握开发网站需要的Vue基础知识
  • 「网页开发|前端开发|Vue」05 Vue实战:从零到一实现一个网站导航栏
  • 「网页开发|前端开发|Vue」06 公共组件与嵌套路由:让每一个页面都平等地拥有导航栏
  • 「网页开发|前端开发|Vue」07 前后端分离:如何在Vue中请求外部数据
  • 「网页开发|后端开发|Flask」08 python接口开发快速入门:技术选型&写一个HelloWorld接口

一、场景说明

我们在网站开发中,有些数据可能会被不同的组件或者在不同页面多次使用,对于这种重复多次使用的数据,如果每次都要重新获取或者重新生成,那么除了代码会变得冗余,还可能因为代码改动过程中的遗漏导致不同地方数据不一致而引发数据问题。

针对这种数据在多次使用的场景,我们会使用状态管理框架来统一管理数据,使得程序更加稳定和可预测。

react的状态管理使用redux,而vue的状态管理使用vuex。接下来我们就介绍一下vuex的核心内容,然后用一个根据用户登录状态数据展示不同页面内容的例子来展示状态管理的具体应用场景和实现方法。

二、状态管理Vuex

如果用编程语言中我们熟悉的概念来描述状态管理的话,那状态管理就相当于一个「全局变量」,我们可以在项目的各个位置直接获取、使用、甚至更新变量的内容。

安装vuex

因为我们在示例中用的是匹配vue2vuex3,所以安装时需要注意版本,如下:
npm install vuex@3

状态管理 - 创建状态

因为状态管理是管理着涉及整个项目的状态数据,所以一般我们会新建一个store目录,在该目录下组织状态相关的代码。这里我们为了更快更简单地展示创建状态的过程,则直接在src/main.js添加代码,如下:
在这里插入图片描述

状态管理 - 在代码各处使用创建的状态

创建状态管理store,并且传入到Vue实例中后,我们就可以在项目的各个代码中访问store中的状态数据了。

如果我们是在src/main.js中访问,直接使用变量名store即可(因为我们就是在这里将状态管理实例导入为store),比如console.log(store.state.count)

如果是在其他文件中,比如在HelloWorld.vue中,则使用this.$store来访问,比如console.log(this.$store.state.count)

状态管理 - 在代码中更新状态管理的值

我们可以像修改变量值一样,直接修改状态的值。这给了我们极大的自由,但是这也可能会导致我们管理的状态被以各种方式被修改,导致出现预期之外的结果。

所以会推荐开启严格模式(在创建store时传入strict: true),然后封装修改对应状态值的方法供代码各处调用。相当于回归了程序员的本质:降低系统复杂度、降低程序不确定性。

那么vuex的设计中,如何封装方法并在代码各处调用的呢?
那就是在创建store时,定义mutationsactions两个字段,并在字段值中定义各个方法。两个字段都可以定义操作状态值的方法,主要差别是:

  • mutations是同步操作,actions是异步操作;
  • mutations直接操作状态值,actions使用commit(方法名)调用mutations方法操作状态值

所以我们可以将创建的store改为如下:

const store = new Vuex.Store({
  strict: true,
  state: {
    count: 0
  },
  mutations: {
    increment (state) {
      state.count++
    }
  },
  actions: {
    asyncIncrement (context) {
      context.commit('increment')
    }
  }
})

然后就可以在项目的各处代码中使用this.$store.commit(mutations中的方法名)以及this.$store.dispatch(actions中的方法名)来调用mutationsactions中定义的方法。

比如我们在HelloWorld.vuescript中增加如下方法:

    methods: {
        increase() {
            console.log(`[ Before ] ${this.$store.state.count}`);
            this.$store.commit("increment");
            console.log(`[ After ] ${this.$store.state.count}`);
        },
        asyncIncrease() {
            console.log(`[ Before ] ${this.$store.state.count}`);
            this.$store.dispatch("asyncIncrement");
            console.log(`[ After ] ${this.$store.state.count}`);
        },
    },

然后在template的部分增加count的展示以及两个更新count的按钮,如下:
在这里插入图片描述
返回页面,我们就可以看到浏览器页面已经展示count的值以及两个增加按钮,如下:
在这里插入图片描述
我们可以点按两个按钮来观察同步和异步的效果,如下:
在这里插入图片描述
我们可以看到我们点击异步的时候,由于我们在代码中设置了等待1秒再增加count的值,所以输出的前后值是相同的,等待1s后再点击按钮就可以观察到值已经变化。最后我们连续快速点击3次异步增加,可以看到3次点击完成后,值仍然是4,但是等待1秒之后,值变成了7(看页面按钮上面展示的count值)

三、用户登录数据如何流转如何变化

在明白状态管理的基本操作之后,我们就可以来考虑一个状态管理的常见场景:管理用户登录信息。

首先,我们要确认要放到状态管理中的信息是不是会在多个地方使用到。用户登录信息是用户登录之后,在网站的各个页面都应该是共用的,最起码右上角显示的用户登录状态都应该是一致的,不能首页登录后右上角已经显示了用户登录状态,切换到其他页面右上角又变成了登录/注册按钮。所以用户登录信息确实适合放到状态管理中。

然后我们考虑用户登录信息的存储结构。比如我们可以放一个名为userobject值在store.state中,然后在各个页面通过访问this.$store.state.user.具体用户信息字段访问用户信息中的各个信息。

于是我们就可以清楚用户注册/登录的一个基本流程了,如下:

  • 我们在页面检查状态管理store中是否存在user,需要不存在用户信息,则在页面右上角显示"登录/注册"按钮;
  • 当我们通过注册/登录页面进行注册和登录后,在状态管理中存入对应的用户信息(用户来自后端,所以涉及接口交互);
  • 状态管理中的用户信息变化后,页面检测到store中的user已经存在,自动重新渲染,在页面右上角渲染出登录的用户信息。

四、简单模拟用户登录过程

明白用户登录的基本流程之后,我们可以简单通过代码模拟一下整个过程。实际的登录过程涉及接口请求以及登录和注册页的开发,我们目前只是要模拟登录前后的页面变化,所以将流程简化如下:

  • 页面检查store中是否有用户信息,如果没有,展示一个登录按钮 ;否则展示用户信息以及一个登出按钮;
  • 登录按钮增加功能:点击后往store中写入用户信息;
  • 登出按钮增加功能:点击后删除store中的用户信息;
  • 通过点击登录登出来观察用户信息变化与页面变化过程;

首先在src/main.js中增加代码,用来创建store,在store中定义登录和注销登录的方法,如下:

const store = new Vuex.Store({
    state: {
        user: {}
    },
    mutations: {
        mock_login() {
            this.state.user = {
                userId: 1111,
                userName: "明仔的阳光午后",
            };
            sessionStorage.setItem("user", JSON.stringify(this.state.user));
        },
        mock_logout() {
            this.state.user = undefined;
            sessionStorage.removeItem("user");
        },
    },
})

然后在HelloWorld.vuescript的部分添加从store中获取user信息以及操作user信息的方法,如下:

<script>
export default {
    data() {
        return {
            user: JSON.parse(sessionStorage.getItem("user")),
        };
    },
    methods: {
        login() {
            this.$store.commit("mock_login");
            this.user = this.$store.state.user;
        },
        logout() {
            this.$store.commit("mock_logout");
            this.user = this.$store.state.user;
        },
    },
}
</script>

之后在HelloWorld.vuetemplate部分增加一个h1用来展示当前登录状态,一个button用来提供登录和登出的点按功能,这样我们才能直接通过点按来模拟登录过程并观察页面内容变化。如下:

<template>
    <div id="app">
        <div v-if="user">
            <h1>Hi, {{ user.userName }}</h1>
            <button @click="logout">登出</button>
        </div>
        <div v-else>
            <h1>当前未登录</h1>
            <button @click="login">登录</button>
        </div>
    </div>
</template>

完成上述代码改动,我们就可以回到浏览器页面,看到页面内容如下:
在这里插入图片描述
我们点击登录按钮之后,页面变化如下:
在这里插入图片描述

我们看到,页面的标题展示了具体的用户名,同时登录按钮变成了登出按钮。可以验证页面实现了根据用户登录状态来渲染不同的内容。

所以通过这样一个过程,我们就可以在其他需要页面根据不同数据,比如用户登录状态,或者用户身份、用户权限等等,来渲染不同页面内容的应用场景中,按照上述的流程来轻松实现我们想要的需求。

比如可以自己试试让导航栏根据用户登录状态来展示用户信息或者登录/注册按钮。


写文不易,如果对你有帮助的话,来一波点赞、收藏、关注吧~👇

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

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

相关文章

手把手教你,细说向开源项目递交代码的流程

系列文章目录 手把手教你安装Git&#xff0c;萌新迈向专业的必备一步 GIT命令只会抄却不理解&#xff1f;看完原理才能事半功倍&#xff01; 常用GIT命令详解&#xff0c;手把手让你登堂入室 GIT实战篇&#xff0c;教你如何使用GIT可视化工具 GIT使用需知&#xff0c;哪些操作…

面试必杀技:Jmeter性能测试攻略大全(第三弹)(脚本开发)

今天是最后一章哦&#xff0c;主要是讲jmeter性能测试脚本相关的。原创不易&#xff0c;点个赞意思一下呗&#xff01; 一. 脚本开发方式大纲 1、badboy进行录制和导出 badboy下载地址: 链接&#xff1a;https://pan.baidu.com/s/18Po3RssrBRSnn_-xsHop1g 提取码&#xff1…

协程切换的三种底层实现方式

1.setjmp/longjmp setjmp 和 longjmp 是C语言中用于实现基本的协程的底层函数。它们允许在一个函数的执行过程中保存当前的执行状态&#xff08;包括寄存器和栈信息&#xff09;&#xff0c;然后在之后的某个时间点恢复到这个状态&#xff0c;从而实现函数的非局部跳转。 这两…

OpenGl材质

在现实世界里&#xff0c;每个物体会对光产生不同的反应。比如&#xff0c;钢制物体看起来通常会比陶土花瓶更闪闪发光&#xff0c;一个木头箱子也不会与一个钢制箱子反射同样程度的光。有些物体反射光的时候不会有太多的散射(Scatter)&#xff0c;因而产生较小的高光点&#x…

【数据结构-树】哈夫曼树

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…

transformer系列3---transformer结构参数量统计

Transformer参数量统计 1 Embedding2 Positional Encoding3 Transformer Encoder3.1 单层EncoderLayer3.1.1 MHA3.1.2 layer normalization3.1.3 MLP3.1.4 layer normalization 3.2 N层Encoderlayer总参数量 4 Transformer Decoder4.1 单层Decoderlayer4.1.1 mask MHA4.1.2 lay…

AUTOSAR中的Crypto Stack(二)--CSM数据类型解析

在上一节,简单梳理了加密栈的基本要求。其中最关键最核心的还是用户如何使用HSM这个黑盒子,这就必须要对Crypto Service Manager要有很清晰的认识。 那么首先我们还是围绕概述里提到的job类型进行分析。 1. Crypto_JobType 上图, 在AUTOSAR的架构里,所有的密码操作…

笔记本电脑查询连接wifi密码

笔记本电脑查询连接wifi密码 1、背景2、环境3、实操3.1、已连接wifi查看密码3.2、之前连接过的wifi密码查看 1、背景 在日常使用过程中遇到两个使用场景。网络管理员跳过一下步骤&#xff0c;针对wifi使用人员。 1、刚到一个新环境中需要连接wifi的场景 2、在一个场所连接过一…

【LeetCode热题100】--160.相交链表

160.相交链表 使用双指针&#xff1a; /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) {* val x;* next null;* }* }*/ public class Solution {public ListNode getInter…

基于Vue+ELement搭建动态树与数据表格实现分页

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《ELement》。&#x1f3af;&#x1f3af; &#x1…

高等数学应试考点速览(下)

函数项级数 【收敛域】上&#xff0c;收敛于&#xff1a;【和函数】&#xff1b; 幂级数&#xff1a;绝对收敛区间 ( − R , R ) (-R,R) (−R,R)&#xff0c;&#xff08;端点是否属于收敛域&#xff0c;需要再探讨&#xff09; R lim ⁡ n → ∞ ∣ a n a n 1 ∣ R\lim_{n…

LLM(二)| LIMA:在1k高质量数据上微调LLaMA1-65B,性能超越ChatGPT

本文将介绍在Lit-GPT上使用LoRA微调LLaMA模型&#xff0c;并介绍如何自定义数据集进行微调其他开源LLM 监督指令微调&#xff08;Supervised Instruction Finetuning&#xff09; 什么是监督指令微调&#xff1f;为什么关注它&#xff1f; 目前大部分LLM都是decoder-only&…

右键菜单添加 Open Git Bash

前言 在使用 TortoiseGit 作为Git的可视化工具&#xff0c;但是会经常用到命令行操作&#xff0c;一般来说&#xff0c;安装了TortoiseGit后&#xff0c;右键会出现 open git-bash here... 的命令。但是&#xff0c;可能由于某些原因&#xff0c;这个右键菜单选项不见了。下面…

springcloud:三、ribbon负载均衡原理+调整策略+饥饿加载

Ribbon负载均衡原理 调整Ribbon负载均衡策略 第一种会对order-service里所有的服务消费者都采用该新规则 第二种会针对order-service里某个具体的服务消费者采用该新规则 饥饿加载

【LeetCode】力扣364.周赛题解

Halo&#xff0c;这里是Ppeua。平时主要更新C&#xff0c;数据结构算法&#xff0c;Linux与ROS…感兴趣就关注我bua&#xff01; 1.最大二进制奇数 &#x1f349;题目&#xff1a; &#x1f349;例子&#xff1a; &#x1f349; 题解: 首先看题目,最大二进制奇数,在一个二…

二十六、MySQL并发事务问题:脏读/不可重复读/幻读

1、事务的隔离级别 &#xff08;1&#xff09;隔离级别 Read uncommitted # 读&#xff0c;未提交 Read committed # 读&#xff0c;已提交 Repeatable Read(默认) # 可重复读 Serializable # 串读 &#xff08;2&#xff09;基础语法 set transaction isolation level 事…

高等数学应试考点速览(上)

极限 上界存在&#xff0c;则上确界存在数列极限 定义性质&#xff1a;唯一、有界&#xff08;保序、夹逼、不等式性质&#xff09;、保号、四则运算判定&#xff1a; 单侧&#xff1a;单调有界双侧&#xff1a;闭区间套增量&#xff1a;柯西审敛 归并和收敛子列聚点有限覆盖原…

想要精通算法和SQL的成长之路 - 最长递增子序列 II(线段树的运用)

想要精通算法和SQL的成长之路 - 最长递增子序列 II&#xff08;线段树的运用&#xff09; 前言一. 最长递增子序列 II1.1 向下递推1.2 向上递推1.3 更新操作1.4 查询操作1.5 完整代码&#xff1a; 前言 想要精通算法和SQL的成长之路 - 系列导航 一. 最长递增子序列 II 原题链接…

idea 通过tomcat 配置 https方式访问

步骤1&#xff1a;管理员模式打开cmd命令进行生成密匙 D:\software\apache-tomcat-8.5.93\bin\tomcat.keystore 是生成密匙存放的路径&#xff0c;修改成自己tomcat的路径即可 keytool -genkeypair -alias "tomcat" -keyalg "RSA" -keystore "D:\s…

Spring Boot 集成 MinIO 实现文件上传、下载和删除

MinIO 是一种开源的对象存储服务&#xff0c;它基于云原生架构构建&#xff0c;并提供了高性能、易于扩展和安全的存储解决方案。 一.安装和配置 MinIO 服务器 为了演示方便&#xff0c;本文采用Windows安装 1.在官方网站下载MinIO 安装文件&#xff0c;地址&#xff1a;ht…