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

本文主要介绍如何通过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.mzph.cn/news/91562.shtml

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

相关文章

Spring Boot快速入门:构建简单的Web应用

SpringBoot Spring Boot是一个用于简化Spring应用程序开发的框架&#xff0c;它通过提供开箱即用的配置和一组常用的功能&#xff0c;使得构建高效、可维护的应用变得非常容易。在本篇博客中&#xff0c;我们将一步步地介绍如何快速入门Spring Boot&#xff0c;并构建一个简单的…

C++核心编程--对象篇

4.2、对象 4.2.1、对象的初始化和清理 用于对对象进行初始化设置&#xff0c;以及对象销毁前的清理数据的设置。 构造函数和析构函数 防止对象初始化和清理也是非常重要的安全问题 一个对象或变量没有初始化状态&#xff0c;对其使用后果是未知的同样使用完一个对象或变量&…

如何用Angular和NativeScript开发IOS程序?

要使用Angular和NativeScript开发iOS应用程序&#xff0c;您可以按照以下步骤进行操作&#xff1a; 安装必要的工具&#xff1a; 确保您已经安装了Node.js和npm&#xff08;Node.js包管理器&#xff09;。 安装Angular CLI&#xff1a;如果尚未安装&#xff0c;请运行以下命令…

小程序获取用户手机号

在小程序中获取用户手机号需要以下步骤&#xff1a; 首先需要授权用户手机号&#xff0c;即在小程序中调用 wx.login() 方法获取用户的登录凭证&#xff0c;在回调函数中调用 wx.getUserInfo() 方法获取用户的个人信息&#xff0c;并且设置 withCredentials 参数为 true。 在获…

【C++学习】多态

目录 一、多态的概念 1. 概念 二、多态的定义及实现 2.1 多态的构成条件 2.2 虚函数 2.3 虚函数的重写 2.4 C11 override 和 final 2.5 重载、覆盖(重写)、隐藏(重定义)的对比 三、抽象类 3.1 概念 3.2 接口继承和实现继承 四、多态的原理 4.1 虚函数表 4.2 多态的…

【大规模 MIMO 检测】基于ADMM的大型MU-MIMO无穷大范数检测研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

机器学习 面试/笔试题

1. 生成模型 VS 判别模型 生成模型&#xff1a; 由数据学得联合概率分布函数 P ( X , Y ) P(X,Y) P(X,Y),求出条件概率分布 P ( Y ∣ X ) P(Y|X) P(Y∣X)的预测模型。 朴素贝叶斯、隐马尔可夫模型、高斯混合模型、文档主题生成模型&#xff08;LDA&#xff09;、限制玻尔兹曼机…

volatility, polarizability, viscosity, electronegativity hydrogen bonding

A. volatility B. polarizability C. viscosity D. electronegativity E. hydrogen bonding 以下是每个选项的定义&#xff0c;包括中文和英文&#xff1a; A. 挥发性 (Volatility) - 定义&#xff1a;挥发性是指物质从液态转变为气态的趋势或速度。更挥发性的物质在给定条件…

CCF CSP认证 历年题目自练Day17

CCF CSP认证 历年题目自练Day17 题目一 试题编号&#xff1a; 201803-1 试题名称&#xff1a; 跳一跳 时间限制&#xff1a; 1.0s 内存限制&#xff1a; 256.0MB 问题描述&#xff1a; 问题描述   近来&#xff0c;跳一跳这款小游戏风靡全国&#xff0c;受到不少玩家的喜爱…

C++11新特性

目录 一、自动类型推导1、auto2、decltype&#xff08;declare type 声明类型&#xff09; 二、左值右值三、模板的改进other奇葩小知识 在学习C11前&#xff0c;请确定编辑器打开了C11标准&#xff01; int main(){cout<<__cplusplus<<endl;//输出201103而不是别…

[Machine learning][Part3] numpy 矢量矩阵操作的基础知识

很久不接触数学了&#xff0c;machine learning需要用到一些数学知识&#xff0c;这里在重温一下相关的数学基础知识 矢量 矢量是有序的数字数组。在表示法中&#xff0c;矢量用小写粗体字母表示。矢量的元素都是相同的类型。例如&#xff0c;矢量不包含字符和数字。数组中元…

在比特币上支持椭圆曲线 BLS12–381

通过使用智能合约实现来支持任何曲线 BLS12–381 是一种较新的配对友好型椭圆曲线。 与常用的 BN-256 曲线相比&#xff0c;BLS12-381 的安全性明显更高&#xff0c;并且安全目标是 128 位。 所有其他区块链&#xff0c;例如 Zcash 和以太坊&#xff0c;都必须通过硬分叉才能升…

C++核心编程

C核心编程 C核心编程1 内存分区模型1.1 程序运行前1.2 程序运行后1.3 new操作符 2 引用2.1 引用的基本使用2.2 引用注意事项2.3 引用做函数参数2.4 引用做函数返回值2.5 引用的本质2.6 常量引用 3 函数提高3.1 函数默认参数3.2 函数占位参数3.3 函数重载3.3.1 函数重载概述3.3.…

【Django 笔记】第一个demo

1. pip 安装 2. django 指令 D:\software\python3\anconda3\Lib\site-packages\django\bin>django-adminType django-admin help <subcommand> for help on a specific subcommand.Available subcommands:[django]checkcompilemessagescreatecachetabledbshelldiff…

精彩回顾 | 迪捷软件亮相2023世界智能网联汽车大会

2023年9月24日&#xff0c;2023世界智能网联汽车大会&#xff08;以下简称大会&#xff09;在北京市圆满落幕。迪捷软件北京参展之行圆满收官。 本次大会由工业和信息化部、公安部、交通运输部、中国科学技术协会、北京市人民政府联合主办&#xff0c;是我国首个经国务院批准的…

WPF中的控件

内容控件&#xff1a;label、border Window控件 Label控件 Border控件 内容控件 Button控件 点击取消按钮关闭程序&#xff1b;点击登录按钮打开BorderWindow窗口。 TextBox控件 PasswordBox控件 TextBlock控件 加载窗口时显示TextBlock中的内容 RadioButton控件 CheckBox控件…

react antd InputNumber只允许输入数字的方法

一、前言 前端项目是react&#xff0c;使用了antd&#xff0c;需要一个数字输入框&#xff0c;只允许输入数字。 二、代码样例 import { Form, InputNumber } from antd;const FormItem Form.Item;const formItemLayout {labelCol: {xs: { span: 24 },sm: { span: 8 },},…

深入探讨java -jar命令:详解及代码演示

引言&#xff1a; 在Java开发中&#xff0c;我们经常需要将多个类打包成一个可执行的jar文件&#xff0c;以便于分发和运行。而使用java -jar命令是一种方便快捷地在命令行中运行Java可执行jar文件的方法。本文将详细介绍java -jar命令的使用方式、原理及提供相关的代码演示和…

Docker清理

title: “Mysql安装” createTime: 2022-01-04T20:07:3108:00 updateTime: 2022-01-04T20:07:3108:00 draft: false author: “name” tags: [“mysql”] categories: [“docker”] description: “测试的” docker-mysql安装部署文档 文章目录 title: "Mysql安装" …

413 Request Entity Too Large问题

问题背景 在某系统中上传文件时&#xff0c;如果文件大小超过了一定范围就会爆 413 Request Entity Too Large 问题。 原因 在使用 nginx 反向代理后台服务时&#xff0c;如果请求体中过大&#xff0c;超过了默认的 1M 则会爆该错误。 解决方案 在 nginx 中&#xff0c;指…