vue3专栏项目 -- 五、权限管理(下)

news2024/9/24 15:16:42

1、创建Message组件

前面我们获取到了请求错误的信息,所以我们接下来做一个弹出框组件,让错误提示展示出来

我们把这个组件做成一个全局组件,它不仅可以显示错误的信息,还可以添加成功操作的信息,甚至还可以显示一个普通的提示,所以它应该有三种类型,而且它应该和Loader组件即加载组件一样,一看我们就直到是一个全局性质的组件,所以它应该使用Teleport即瞬间移动添加到根节点去,而不是附属于某一个特定的组件中。同时它右边有一个可关闭的按钮,所以这个组件中应该有一个状态存在,从而控制是否展示,至于样式我们看boostrap

如下,实现把样式div这些搞就来,然后这个组件中我们应该接收两个东西,一个是这个组件的颜色,一个是展示的文字,所以我们如下创建一个MessageType,然后props中接收两个东西message和type,并且我们创建这个message节点

在App.vue中把该组件显示出来,如下

然后我们调整一下样式

接下来我们优化一下,我们发现node创建的过程和取消的过程是一个非常重复的逻辑,我们创建一个单独的useDOMCreate.ts把它抽离出来,如下

全局组件是一种比较熟悉的组件啦,最后我们还自定义了一个钩子函数,抽象出了一段DOM创建和卸载的逻辑,但是现在我们发现我们组件有局限性,就是不知道该怎样快速的展示成功的提示,这里我们是错的提示,难道我们还需要添加一个全局的状态才能展示成功的提示,这当然不是一个好的做法,有没有啥好办法呢,接下来我们来实现

2、Message组件改进为函数调用形式

现在我们组件都是嵌套在组件树中展示的,但是message组件使用这种方式会感觉比较奇怪,它应该像一个函数一样进行工作,如createMessage('hello','error'),就像alert一样,调用一个函数那么弹出提示,点击关闭或者过一会就自动消失,那么我们使用它显示错误或成功的信息就非常简单,这也是组件组织的另外一种常用方式,现在我们来完成这样的改造

那么使用函数调用,那么首先我们要有一个函数,如下我们创建一个函数叫createMessage.ts

难点是怎样用函数的形式来创建一个组件,因为我们之前都是在组件template里面实例化一个组件,这时候我们要记住一个方法,来看到main.ts中是怎么创建呢?如下通过createApp()方法实现,createApp()是直接从vue直接导过来的,它可以生成一个组件的实例

看文档,它有两个参数,第一个参数就是这个组件本身,这个组件其实就是一个Object;第二个参数是props,它组件接收的props

我们来使用一下,如下props接收的就是Message.vue组件中props接收的东西

接下来我们要把messageInstance挂载到一个节点上,我们看看该怎么做,我们在main.ts中也有对应的处理方法,如下,我们使用mount()加上一个DOM节点'#app'即mount('#app')即可把它挂载到dom节点上,接下来就可以显示到界面上

所以我们新建一个节点,让这个创建的组件实例挂载到一个节点上,这个组件就可以在界面上显示出来,并且给个定时任务,到一定时间把这个组件卸载并且把创建的节点也删除掉

现在我们来调用它,如下在App.vue中通过watch去监测error中status的变化,一旦变化就去获取当前error的status、message,如果是有错误并且有message那么就调用这个创建Message组件的方法,即如下

此时我们尝试输错用户名密码,发现会弹出错误提示,并且2s后提示就消失了,但是发现再点击提交的时候发现没有错误提示弹出,这是因为我们第一次弹出后error是true,没有把error的状态恢复,那么error的status就一直是true,它没有变化那么watch就不会触发后面的调用createMessage的方法,所以就不会再展示出报错提示了

所以我们需要在发起请求的时候通过拦截器把error重置一下,重置为false和空如下

然后我们在登录成功以后,给用户提示一下。所以到login.vue中登录成功后就调用它,然后传入的message和type为如下即可展示出如下成功的提示

通过这里,我们要学会使用createApp() 来创建组件实例和mount() 方法挂载展示的一种新的途径,要特别注意学会这个新的知识点

3、了解Vnode 以及 vue 的简单工作原理

我们上面用createApp() 返回的是一个App类型是一个应用实例,之前我们只在main.ts中使用过它,createApp() 出现在main.ts中它是整个应用的应用实例,那我们这里使用这个createApp() 创建一个小小的message组件是不是优点大材小用了,有没有更轻量级的方式来做?这就是接下来要做的,我们先来了解一下vnode的知识,面试中也经常问到这些问题

VitrulalDOM是一种虚拟的,保存在内存中的数据结构,用来代表UI的表现,会和真实的DOM节点保持同步。VitrulalDOM是由一系列的Vnode组成的。

如下,vnode就是一个Object平平无奇,一个type什么类型,props有什么属性,children可能有更多的vnode节点

怎样将一个vnode转换成一个真正的DOM节点呢,我们看看对应的步骤,要牢记这个过程,这个是非常重要的。

第一步我们称为Compile,就是vue组件的Template模块里的代码会被编译成render function,render function 是一个特殊的function,这个函数它可以返回Virtual DOM树(就是返回一系列对应的节点);即绿->黄->紫

第二步称为Mount,也就是vue内部会执行这个render function,遍历这个虚拟的DOM树,生成真正的DOM节点;即紫->蓝

最重要的即第三步即更新的内容,因为我们在组件中有很多的响应式对象,那这些对象发生变化的时候都会发生更新,其实它的过程就来自于这个Patch,当组件中任何响应式对象发生变化的时候就会执行更新操作,就会生成新的虚拟节点树,vue内部会遍历新的虚拟节点树,和旧的树做对比,找出最小阿达更新范围,然后执行必要的更新;即黄->红

虚拟DOM的优点:

· 可以使用一种更方便的方式,供开发者操作UI的状态和结构,不必和真实的DOM节点打交道

(假如我们直接操作真实的DOM,会有一系列DOM提供的API,并且它的速度也是比较慢的)

· 更新效率更高,计算需要的最小化操作,并完成更新

4、创建Vnode 以及使用 render function

创建Vnode:

h createVnode 都可以创建vnode。h 是hyperscript的缩写,很多virtualDOM都使用这个函数名称,还有一个函数称为createVnode。还有一个函数就是这个createVnode,两个函数的用法几乎是一样的。

如下示例,h函数有3个参数,第一个是type这里是div类型的节点,第二个是props是Object形式的属性,第三个是一个数组,里面有一系列的children即子节点。只有两个参数时,就把那个props的参数忽略。创建出来的Vnode中有一系列的属性,但是它的实质就是一个普通的Object,了解这个就可以了

声明 Render Function

当使用composition API 的时候,在setup当中直接返回一个对象,代表着给模板使用的数据,当要使用render function的时候,可以直接返回一个函数。

如下,比如一个ref叫message,直接return这个message,代表着数据message是给模板使用的,当我们要使用render function的时候,可以直接返回一个函数,即如下直接return ()=>{},然后在function当中你就可以返回一系列的vnode节点了

举个例子:

如下,我们不使用template,我们使用render function ,我们在setup中,在return ()=>{}即在return 后的这个函数当中,我们就可以返回一系列的节点了,如下在函数中return h()创建的节点,如下类型是h1,children是props.msg+count.value

然后我们到App.vue中展示出来,如下

那么我们使用render function的形式就成功渲染了一个对应的组件,没有用template。当然它还支持多个节点,就用数组的形式,如下

那么这个时候假如我们只有script即没有template没有那些html了,那么就不需要.vue这个文件形式也可以啦,不需要component的过程,我们直接用ts即可,如下然后把名称改为Vnode.ts即可

可以看到还是会输出对应的不变的这个页面

假如我们一直使用h这样的写法,那么简单的时候还可以,当你有非常多非常多的节点的时候,就会比较繁琐,并且难以读懂,那么能不能有一种更容易让人读懂的格式呢,这时候JSX就出现了

使用JSX

JSX 是一种类似XML的语法,对使用过react的话就会比较熟悉,它就是h函数的一种语法糖,它可以将这种类似HTML的语法转换成h函数的写法。

如下这种<div>hello<div>就是JSX,它就非常像HTML,但是它真正的产出是类似上面的h('div')这样的写法,内部会有对应的转换过程。在其中使用变量的时候,我们使用单括号将它包裹起来就可以了,这是JSX的基本语法

// 创建vnode

const vnode = <div>hello</div>

// 使用变量

const vnode = <div id={dynamicId}>hello,{userName}</div>

添加JSX支持:

终端中输入vue add babel 回车即可,安装后会有babel.config.js文件

它会自动把babel的插件给你安装上,通过babel可以进行转换,把JSX转换成对应的h函数

然后我们到刚才的举例中,我们把对应的h写法转换成对应的JSX,如下

我们是不能直接在ts中使用html的,我们需要把后缀名改为tsx,然后就可以使用html如<div>语法了,

如下,使用html标签把vnode结构写进去,然后babel会把这个JSX转成h函数的形式,然后h函数创建vnode,然后通过render function把vnode生成真正的DOM

5、使用h函数改造message组件

如下我们把createApp函数创建的改为h函数创建的

用来的:

如下,通过h函数,创建了vnode了以后,我们需要将它添加到对应的DOM节点上面去,这比较有难度,我们怎样将一个vnode渲染到一个特定的DOM上面,这时候就用到vue内部的函数叫render函数

然后我们调用一下看看,如下,可以通过调用createMessage() 就展示出message组件

然后再把功能丰富一点在,这里我们是定义了一个定时器固定时间把这个message组件卸载,但是在有些情况下,比如我们是想点击关闭按钮后再把这个message组件关闭,所以我们需要改变一下,这时候我们希望它返回一个实例,上面带一个对应的方法,来把这个message清除掉,这样我们就可以手动调用这个实例的这个方法即可清除message,如下

然后我们在APP.vue中如下

所以最后在login组件中调用这个函数展示这个message组件即可

总结:

我们这一系列做的就是,

我们刚开始做了message组件,我们可以直接在某个组件中通过<message></message>即可调用这个message组件,从而展示出这个提示信息框

但是我们觉得它可以像以前用过的alert一样,直接通过一个函数调用就可以展示出这个组件,所以有了如下一步步改进:

刚开始我们创建一个函数叫createMessage(),函数中我们用vue中的createApp()直接创建组件实例,然后通过mount() 把组件实例挂载到节点中,即可实现直接调用这个createMessage()就能实现创建这个message组件并且展示出来的效果。

但是又感觉有点大材小用,所以我们想换成一个轻量级的方法,我们就想到了vnode,我们通过h()函数创建了vnode(h()函数创建就有点麻烦,我们就使用了JSX创建vnode),然后通过render function把vnode变成了一个真正的DOM,创建了真正的DOM节点了以后,我们这里是通过h()函数把vnode创建起来,然后通过render函数把这个vnode添加到我们新建的DOM节点上面去。

6、注册页面的编写

注册页面Signup.vue的编写如下:

我们之前的做法,

是在ValidateInput中定义验证规则的类型并且定义了输入框失去焦点后触发的函数中就是去遍历验证所有规则,如果是哪个规则则做什么验证这样子。之前定义了email类型和required类型,并且在失去焦点函数中写了这两个规则应该做什么验证,如下如果是email类型则应该符合邮箱格式,如果是required类型则应该不能为空;然后我们会在登录页面定义各个输入框的验证规则具体是什么类型以及如果不符合类型应该返回什么提示信息即message这样子

流程就是登录页面定义了各个输入框有什么规则,如下第一个输入框中绑定的rule比如那个emailRules,这个emailRules有两个规则一个是email一个是required,所以validate-input组件接收到了这两个rule,就会如上,因为有规则所以去遍历传过来的rule,所以进入switch-case判断,如果规则为required则要符合不能为空,如果规则为email则要符合是邮箱格式

我们这个注册页面和登录页面差不多也是一个个input框,有点不一样的就是有一个重复密码的输入框,这个输入框验证规则不仅仅要不能为空,并且还需要添加它输入框内输入的密码和上面密码框输入的密码要一致,所以要在ValidateInput组件中加入这个验证规则

就是要添加一个的这个规则,它要判断它的密码和上面密码框输入的密码是否一致,那么我们就需要这个规则是一个函数,然后函数中做这个判断,而且我们希望它返回一个布尔值,即如果一致则返回true即让我们直到验证通过,否则验证失败这样子

所以我们要回到ValidateInput组件中添加这个规则,即如果某个输入框传过来的rule中有这个规则,那么我们在遍历规则们的switch-case中添加,如下,如果规则名是custom则如下做判断

然后注册组件中,给这个重复密码的这个输入框加入这个规则,这个规则中的validator函数中做我们要做的逻辑判断

注意,在validateinput组件中只是定义这个validator函数,并且在switch-case遍历到它的时候去调用执行它,但是这个函数里面具体有什么逻辑是我们在登录组件中定义这个规则的时候定义的逻辑,为什么是在登录页面写定具体逻辑而不是在validateInput组件中呢,你在validateInput中写定了的话你以后无论是哪个组件用这个规则,那么这个规则就定死了即只能是判断重复密码这个输入框的信息是否等于密码输入框的信息,但是如果你在登录页面写定逻辑而validateInput中只是调用,那么你想在登录页面的这个custom规则中执行判断重复密码这个输入框的信息是否等于密码输入框的信息可以,想在其他页面custom规则中执行判断重复密码这个输入框的信息是否等于邮箱输入框的信息也可以,即可以随意自定义你想要进行的逻辑,就不会定死

然后添加这个注册的路由,并且到GlobalHeader组件中把点击注册按钮就跳转到注册页面

我们到接口文档中看,当你创建一个新的用户,那么服务端会创建一个新的用户并且返回如下数据,返回的数据中有这个用户的_id、email、nickName,还有个column id,这是我们在创建一个用户的时候它会自动为这个用户创建一个它对应的column,用户和column应该是一个一对一的关系。如下,用户注册时应该发送post请求,让服务端新建用户,这个post请求只是把当前输入的用户信息发送给服务端即可,服务端验证成功后会返回新建这个用户的用户信息

由于注册过程对全局store没有做任何改变,所以没有新建什么action,因为这个请求成功以后只是跳转到登录页面去让用户登录,所以我们这里直接使用axios.post发送请求即可

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

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

相关文章

《一文带你了解》关于ITSS认证-IT服务工程师、IT项目经理

“IT 服务工程师培训”和“IT 服务项目经理培训”为中国电子技术标准化研究院推出的 ITSS 系列培训&#xff0c;通过该培训的人员可系统掌握 IT 运维的知识&#xff0c; 提升项目管理水平&#xff0c;有效满足 GB/T 28827.1 的符合性评估要求。 我要充电学习提升自我&#xff0…

现在适合进入AIGC行业吗?

现在适合进入AIGC行业吗&#xff1f; 随着人工智能生成内容&#xff08;AIGC&#xff09;技术的快速发展&#xff0c;越来越多的人开始关注这个行业。那么&#xff0c;现在是否是进入AIGC行业的好时机呢&#xff1f;本文将从行业前景、市场需求以及个人选择与规划三个方向进行…

WebLogic Server Supported Configurations

Supported Configurations 支持的配置: 不同版本的WebLogic Server对OS、JDK、AP Server、浏览器、数据等的支持,或者说在哪些OS,JDK等的配置上进行了动作保证。 10.3以后的版本(包含10.3) 10.3以后的版本支持的配置,在以下URL中可以找对对应的excel文件下载 https://ww…

DBeaver连接数据库

前言 DBeaver是一款免费和开源的数据库管理工具&#xff0c;为开发人员和数据库管理员提供了一个通用的数据库解决方案。以下是DBeaver的主要特点和功能&#xff1a; 跨平台支持&#xff1a;DBeaver支持Windows、Linux、macOS等主流操作系统&#xff0c;用户可以在不同的平台…

打开指定文件夹下的jupyter

cd到相应路径&#xff0c;输入jupyter notebook ./ 注意./ 非常重要&#xff0c;不然又进了默认文件夹

超分辨率技术

何为超分辨率&#xff1f; 超分辨率技术&#xff08;Super Resolution&#xff09;&#xff1a;通过硬件或软件的方法提高图像或视频帧的分辨率&#xff0c; 通过一系列低分辨率图像获取到高分辨率图像的过程。 功能介绍&#xff1a;提升图像或视频分辨率最高至8K&#xff0c;…

StarCloud开源行动:激发算力调度的创新潜力

01 关于StarCloud OpenCSG StarCloud 是一个集开源系统(Kubernetes ,K8S)与高性能计算(High Performance Computing,HPC)一体的混合算力调度平台。它专注于大模型训练和推理&#xff0c;并提供一站式服务&#xff0c;包括从训练到部署&#xff0c;以及多模型比较等。除了在人…

线上剧本杀小程序开发,探索剧本杀行业的巨大发展空间

剧本杀是当下非常流行的桌游&#xff0c;也是一种新型的社交游戏方式&#xff0c;受到了众多玩家的关注&#xff0c;成为年轻人社交游戏的首选方式。目前&#xff0c;剧本杀玩家开始迷上了线上剧本杀&#xff0c;剧本杀也在线上获得了新的发展&#xff0c;让市场发展摆脱了空间…

《五》Word文件编辑软件调试及测试

上一期&#xff0c;我们已经把大致的框架给完成了&#xff0c;那么今天&#xff0c;我们就把剩下的什么复制啊&#xff0c;改变字体啊什么的给做一下。 那我们就一步一步的来就可以了&#xff1a; 新建word&#xff1a; void MyWord::fileNew() {qDebug()<<"hhh&…

用wxPython和PyMuPDF将PNG图像合并为PDF文件

在日常工作中,我们经常需要将多个图像文件合并到一个PDF文档中,以便于查看、共享或存档。虽然现有的一些工具可以实现这一功能,但开发一个自定义的GUI工具可以更好地满足特定需求,并提供更好的用户体验。 在本文中,我将介绍如何使用Python、wxPython和PyMuPDF库创建一个简单的…

idea SpringBoot + Gradle 打成zip包(包含配置文件等)

前言&#xff1a; 通过上一文章&#xff0c;我们可以通过ideagradle 构建Springboot项目并实现打成jar包&#xff0c;本文章测试通过gradle 打包成zip包并包含启动文件、配置文件等信息&#xff1b;可点击此处查看idea SpringBoot Gradle 环境配置到项目打包-CSDN博客 一、工…

Char类型、转义及字符集:Java中的字符串奥秘

在Java的8中基本数据类型中&#xff0c;char类型是较难掌握&#xff0c;处理char类型本身的用法之外&#xff0c;还要理解其与字符串的关系、转义序列、字符集。 本文将从基础概念出发&#xff0c;逐步深入探讨这些主题&#xff0c;并通过实例演示来巩固理解。 一、Char类型&…

(001)apidoc 的安装

安装 1.确定 node 和 npm 的匹配版本 node -vv10.14.1# 切换node 版本 nvm list nvm use 20.12.22.安装 apidoc。 npm install -g apidoc3.生成文档&#xff1a; apidoc -i ../ -o document/ -f ".java$"-i &#xff1a;指定扫描路径。-o&#xff1a;输出目录。…

短剧私域-快速引流变现

短剧的爆火&#xff0c;衍生出了很多周边项目。 比如免费看剧App&#xff0c;短剧搜索机器人&#xff0c;短剧付费圈子等等。 这些项目的本质&#xff0c;就是借助短剧的热度&#xff0c;把流量引到自己的鱼塘进行变现。 短剧机器人大家都知道&#xff0c;目前最火的一种玩法…

Nginx+Keepalived高可用集群

NginxKeepalived高可用集群 服务器准备 服务器名IP软件包主从n1RIP 192.168.99.111 VIP 192.168.99.200nginx keepaliveMASTERn2RIP192.168.99.122 VIP 192.168.99.200nginx keepalivedh1RIP 192.168.99.133 VIP 192.168.99.200httpdh2RIP 192.168.32.144 VIP 192.168.99.200h…

2024江苏省赛 H. 完蛋,我被房产包围了 【费用流、分时图】

完蛋&#xff0c;我被房产包围了 n ≤ 200 , ∑ n ≤ 1 0 4 n \leq 200, \sum n \leq 10^4 n≤200,∑n≤104 求出最大利润 思路 每个代理商每次买房狂潮只能卖出 1 1 1 套房子&#xff0c;小红卖出一套房子贬值 1 1 1 元&#xff0c;小绿卖出一套房子贬值 ⌈ a i 10 ⌉ \…

短视频世上无人再似她:成都鼎茂宏升文化传媒公司

短视频世上无人再似她 —— 记忆中的光影传奇 在短视频盛行的今天&#xff0c;每一位创作者都在用镜头捕捉生活&#xff0c;记录世界&#xff0c;但有那么一位艺术家&#xff0c;她的作品如同夜空中最亮的星&#xff0c;即便是在信息洪流中&#xff0c;也依然闪耀着独一无二的…

数字社交的先锋:探索Facebook的未来发展

在当今数字化时代&#xff0c;社交媒体已经成为人们日常生活中不可或缺的一部分。而在众多社交平台中&#xff0c;Facebook一直处于引领地位&#xff0c;不断探索和创新&#xff0c;塑造着数字社交的未来。本文将深入探讨Facebook作为数字社交的先锋&#xff0c;探索其未来发展…

天锐绿盾和bitlocker有啥区别?

#绿盾文档加密系统# 天锐绿盾和BitLocker是两种不同的数据加密解决方案&#xff0c;它们各自有不同的重点和应用场景&#xff0c;以下是它们之间的主要区别&#xff1a; PC地址&#xff1a; https://isite.baidu.com/site/wjz012xr/2eae091d-1b97-4276-90bc-6757c5dfedee 移动…