Vue2(完结):replace属性、编程式路由导航、缓存路由组件、两个新钩子、路由守卫、history与hash

一、router-link的replace属性

1、作用:控制路由跳转时操作浏览器历史记录的模式
2、浏览器的历史记录有两种写入方式:分别为push和replace,push是追加历史记录,replace是替换当前记录。路由跳转时候默认为push
3、如何开启replace模式:<router-link replace .......>News</router-link>

push是默认模式,可以前进后退,相当于指针指前面还是后面,而replace是指针指哪个就把它之前那个抹掉,就不能后退了。

如果about是push模式,home也是push、news和message是replace模式,我点了about之后再点home,about不会被划掉;我再点news和message都会划掉他们之前的,所以当我处于message页面时,我点返回返回的是about

二、编程式路由导航

作用:不借助<router-link> 实现路由跳转,让路由跳转更加灵活

router-link最终实现的不是a标签吗,只有用户点击链接才能实现跳转,那么我怎么实现不用router-link来跳转呢

1.设计两个按钮实现push和replace API

message写两个按钮实现push和replace

<button @click="pushShow(m)">push查看</button>
<button @click="replaceShow(m)">replace查看</button>
methods:{pushShow(m){this.$router.push({//不要去找route,route是一个规则,router是路由器,让干啥干啥name:'xiangqing',query:{id:m.id,title:m.title}})},replaceShow(m){this.$router.replace({//不要去找route,route是一个规则,router是路由器,让前进就前进name:'xiangqing',query:{id:m.id,title:m.title}})}}

2.设计三个按钮实现前进后退和go

在banner里面设计按钮:

      <button @click="back">后退</button><button @click="forward">前进</button><button @click="go">测试一下go</button>
 methods: {back() {this.$router.back();},forward() {this.$router.forward();},go(){this.$router.go();//填一个数字,正数的话就是前进x步,负数就是后退x步}},

三、缓存路由组件

实现news后面有一个input表单,输入东西之后点击message保单内的内容保留

在news里写完input之后,然后就不用在里面写东西了,因为我们最终是展现在home的组件里的,在它的<router-view></router-view>是控制news组件的

        <keep-alive include="myNews"><!-- 只有myNews可以保留缓存 --><router-view></router-view></keep-alive>

keep-alive可以保留缓存,include控制保留哪个的,因为也不是里面所有的组件都保留缓存,谁有需求包括谁,不缓存的话切换就重新挂载

注意:include后面的名字指的是组件名,在它自己组件的script 里面的export default 的name

include多个组件:

<keep-alive :include="['myNews','myMessage']">

四、两个新的生命周期钩子

实现news下面一行字透明度一直变,那么定时器的回调一直在执行,我切换到message我就不想让他再执行了,关掉keep-active?那input表单里的字也没了啊,用activeted和deactivated代替mountde和beforeDestory。

1、activated:路由组件被激活时触发(从没有出现在你面前–>组件出现在你眼前)。 相当于mounted
2、deactivated:路由组件失活时触发。类似于beforeDestroy

3.作用:路由组件所独有的两个钩子,用于捕获路由组件的激活状态。

<template><ul><li :style="{ opacity: opacity }">欢迎来到90年代</li><li>news001 <input type="text" /></li><li>news002 <input type="text" /></li><li>news003 <input type="text" /></li></ul>
</template><script>
export default {name: "myNews",data() {return {opacity: 1,};},// beforeDestroy() {//   clearInterval(this.timer);// },// mounted() {//   this.timer = setInterval(() => {//     console.log("定时器执行");//     this.opacity -= 0.01;//     if (this.opacity <= 0) this.opacity = 1;//   }, 16);// },activated() {this.timer = setInterval(() => {console.log("定时器执行");this.opacity -= 0.01;if (this.opacity <= 0) this.opacity = 1;}, 16);},deactivated() {clearInterval(this.timer);},
};
</script>

五、路由守卫

作用:对路由进行权限控制(我想让你看哪个,不想让你看哪个)
分类:全局守卫、独享守卫、组件内守卫

1.全局路由守卫

(1)全局前置守卫

实现只有学校atguigu才能查看message和news,让router去查看学校,

export default new VueRouter({routes:

这样写是创建了对象然后立马把route暴露出去了,在暴露之前得跟router商量一下

//全局前置路由守卫
//暴露之前加一个路由守卫,指定路由切换之前、初始化的时候调用的一个函数
router.beforeEach((to, from, next) => {//不调next啥都给你拦住//学校名atguigu才放if (to.path == 'myHome/myNews' || to.path == 'myHome/myMessage') {if (localStorage.getItem('school') == 'atguigu') {//要是去news或者message不让你看next()}else{alert('学校不对!')}}else{next()}
})
export default router

beforeEach三个参数to是到哪里去,from从哪儿来,next()继续往下进行

我们自己一点一点的判断name,其实可以直接写在route里,比如写peiqi:true,下面if判断to.peiqi为true往下走,但是那里面的配置项不能自定义,自定义的东西写在meta里

children: [{path: 'myNews',component: myNews,meta:{isAuth:false}//是否授权,不用的那些写都不用写//一级路由下的孩子路径就不用加/了},{name: 'xiaoxi',path: 'myMessage',component: myMessage,meta:{isAuth:false},
if (to.meta.isAuth) {//判断是否有权限if (localStorage.getItem('school') == 'atguigu') {//要是去news或者message不让你看next()}else{alert('学校不对!')}}else{next()}

(2)全局后置守卫

先来加一个功能,比如点击home,当前页面的标题就是主页,设置meta:title,前置里面放document的title

meta:{title:'关于'}
router.beforeEach((to, from, next) => {
document.title=to.meta.title

这样写有bug:1.在什么都不点的情况下它的标题就vue_test,我们可以这样设置

document.title=to.meta.title||'硅谷'

这样写在刚一进来的时候是由vue_test刷新到硅谷,因为在index.html里我们写的title是连接package-json读取项目名称作为title,把html的改成硅谷跟前置的一样就行
2.这样改完之后,我们学校不对的情况下点击message、news内容确实不展现但是title变了?!

写在每次放行next之前才行,写两次

router.beforeEach((to, from, next) => {//不调next啥都给你拦住//学校名atguigu才放if (to.meta.isAuth) {//判断是否有权限if (localStorage.getItem('school') == 'atguigu') {//要是去news或者message不让你看document.title = to.meta.title || '硅谷'next()} else {alert('学校不对!')}} else {document.title = to.meta.title || '硅谷'next()}
})

这样还得写两次,其实他就是后置的功能,要切换的时候加上,所以直接写后置就行

router.beforeEach((to, from, next) => {//不调next啥都给你拦住//学校名atguigu才放if (to.meta.isAuth) {//判断是否有权限if (localStorage.getItem('school') == 'atguigu') {//要是去news或者message不让你看next()} else {alert('学校不对!')}} else {next()}
})
//全局后置路由守卫指定路由切换之后、初始化的时候调用的一个函数
router.afterEach((to, from) => {//它没有next,前置是切换前调用next我就往下走,后置切换完成了不需要nextconsole.log(to,from)document.title = to.meta.title || '硅谷'
})

3.独享路由守卫(只有前置)

某一个路由所单独享用的,独享只有前置但是可以和全局的后置搭配一起使用(你要修改title啥的)

我们现在给news写一个独享路由守卫,写在要鉴权的路由配置里面

                    name: 'xiaoxi',path: 'myMessage',component: myMessage,beforeEnter: (to, from, next) => {if (to.meta.isAuth) {//判断是否有权限if (localStorage.getItem('school') == 'atguigu') {next()} else {alert('学校不对!')}} else {next()}},

跟前置的区别就是beforeEnter,Each是每个就是全局的意思

4.组件内路由守卫

以about为例,这儿也有个beforeRouteEnter和beforeRouteLeave,但是跟前后置不太一样,我从home来到about,先调一次前置进来了再调一次后置;

但是beforeRouteEnter是我进入about组件之前就调用然后就没有然后了;

我要是从about走了,再调用beforeRouteLeave

注意:beforeRouteLeave和Enter的使用前提是通过路由规则,离开/进入该组件时被调用,不是通过路由规则的可不会调用,通过路由规则进去就是点击组件进去,不通过路由规则还可以直接在页面引入然后<myAbout/>调用呢,这样的就不行

<script>
export default {
name:'myAbout',
beforeRouteEnter (to, from, next) {// 通过路由规则,进入该组件时被调用console.log('组件内路由守卫', to, from);if (to.meta.isAuth) {   //判断是否需要鉴权if (localStorage.getItem('school') === 'hznu') {next();  } else {alert('学校名不对!');}} else {next(); //放行}
},
beforeRouteLeave (to, from, next) {// 通过路由规则,离开该组件时被调用next()//得放行啊//注意那个document的title可不能在这儿写,那是后置的
}
}
</script>

5.组件从前置路由守卫到失活的执行流程

1.全局前置路由守卫 => 2.组件内路由守卫beforeRouteEnter => 3.全局后置路由守卫 => 4.mounted挂载组件 => 5.activated激活 => 6.组件内路由守卫beforeRouteLeave => 7.deactivated失活

六、路由器的两种工作模式

1.hash模式

路径的#是哈希值(hash),#后面的东西都不传给服务器

默认的开启哈希模式

特点:
1、地址中永远带着#号,不美观 。
2、若以后将地址通过第三方手机app分享,若app校验严格,则地址会被标记为不合法。
3、兼容性较好。

2.history模式

有历史记录的意思,如果想更改的话就在创建路由器的时候更改

const router = new VueRouter({mode:'history',

我们写完前端打包给后端的时候不是给人家vue、js文件,需要在终端输入npm run build命令,然后生成了一个dist文件夹

1、地址干净,美观 。
2、兼容性和hash模式相比略差。
3、应用部署上线时需要后端人员支持,解决刷新页面服务端404的问题。

3.解决history刷新报错的问题

打包出来的文件必须放在服务器上部署,接下来搭建一个node 用上express的微型服务器

history刷新就报错,如果你点到了news,一刷新他就去找服务器要home/news,根本没这个啊,但是hash就不是找服务器要资源(#后面的都不给服务器)

history模式上线解决:

终端输入npm i connect-history-api-fallback,然后use一下(必须得在静态资源之前use)

七、Vue UI组件库

1.移动端常用UI组件库

(1) Vant https://youzan.github.io/vant
(2) Cube UI https://didi.github.io/cube-ui 
(3)Mint Ul http://mint-ui.github.io

2.PC端常用UI组件库

(1)Element Ul    https://element.eleme.cn
(2) IView UI http://mint-ui.github.io

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

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

相关文章

敏感信息泄露漏洞

法律声明 参与培训需要遵守国家法律法规&#xff0c;相关知识只做技术研究&#xff0c;请勿用于违法用途&#xff0c;造成任何后果自负与本人无关。 中华人民共和国网络安全法&#xff08;2017年6月1日起施行&#xff09; 第二十二条 任何个人和组织不得从事入侵他人网络、干扰…

C——找单身狗2

题目内容&#xff1a; 在一个数组中&#xff0c;室友两个数字出现了一次&#xff0c;其他所有数字都出现了两次。找出只出现一次的数字。 如&#xff1a;1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;4&#xff…

【云计算】云数据中心网络(一):VPC

云数据中心网络&#xff08;一&#xff09;&#xff1a;VPC 1.什么是 VPC2.VPC 的组成2.1 虚拟交换机2.2 虚拟路由器 3.VPC 网络规划3.1 VPC 数量规划3.2 交换机数量规划3.3 地址空间规划3.4 不同规模企业地址空间规划实践 4.VPC 网络高可靠设计4.1 单地域单可用区部署4.2 单地…

【Vue3】自定义Modal的fixed无效

现有一个模态框&#xff0c;目前一切正常&#xff0c;Modal可以在视口正确位置展示 <template><div class"father"><h3>模态框的父组件</h3><button click"showModal !showModal">显示/隐藏modal</button><div …

NzN的C++之路--this指针

在已经入门了类和对象之后&#xff0c;今天我们来到了类和对象的part2部分--this指针。先三连后看是好习惯&#xff01;&#xff01;&#xff01; 目录 一、this指针的引入 二、this指针的特性 三、this指针必会 四、C语言和C实现Stack的对比 1. C语言实现 2. C实现 一、…

如何确认RID池是否耗尽,以及手动增加RID池大小

确认RID池是否耗尽&#xff1a; 事件查看器&#xff1a; 在RID主控域控制器上打开事件查看器&#xff0c;导航至“Windows日志 > 应用程序和服务日志 > Microsoft > Windows > Directory Service > Operations”。搜索事件ID 16656和16657。事件ID 16656表明RID…

Jupyterlab+内网云穿透傻瓜式教程

文章目录 Jupyterlab内网云穿透傻瓜式教程1、Miniforge安装2、Jupyter Lab安装3、Python语言服务器安装4、PowerShell 7安装5、更改jupyter lab配置6、内网穿透7、高级体验 Jupyterlab内网云穿透傻瓜式教程 1、Miniforge安装 如下图&#xff0c;以Windows安装为例&#xff0c…

DFS:floodfill算法解决矩阵联通块问题

floodfill&#xff0c;翻译为洪水灌溉&#xff0c;而floodfill算法本质上是为了解决在矩阵中性质相同的联通块问题。 一、图像渲染 . - 力扣&#xff08;LeetCode&#xff09; class Solution { public:int dx[4]{0,0,1,-1};int dy[4]{1,-1,0,0};int prev;//记住初始值int m,…

LangChain-10(2) 加餐 编写Agent获取本地Docker运行情况 无技术含量只是思路

可以先查看 上一节内容&#xff0c;会对本节有更好的理解。 安装依赖 pip install langchainhub编写代码 核心代码 tool def get_docker_info(docker_name: str) -> str:"""Get information about a docker pod container info."""result…

色彩在设计中的重要性

title: 色彩在设计中的重要性 date: 2024/4/6 19:08:21 updated: 2024/4/6 19:08:21 tags: 色彩心理品牌识别用户体验文化差异创意设计视觉传达易读性 色彩是设计中不可或缺的元素&#xff0c;它不仅可以影响人的情绪和心理状态&#xff0c;还可以在品牌识别、用户体验、文化差…

【C++练级之路】【Lv.19】【STL】unordered_set类和unordered_map类的模拟实现

快乐的流畅&#xff1a;个人主页 个人专栏&#xff1a;《算法神殿》《数据结构世界》《进击的C》 远方有一堆篝火&#xff0c;在为久候之人燃烧&#xff01; 文章目录 引言一、哈希表&#xff08;改造版&#xff09;1.1 结点1.2 迭代器1.2.1 operator 1.3 本体1.3.1 成员变量和…

掌握 TypeScript 核心:从基本类型到面向对象编程,理论详解与Vue3实践运用

TypeScript 是一种开源的编程语言&#xff0c;由微软公司开发&#xff0c;于2012年10月首次公开发布。 TypeScript 是 JavaScript 的超集&#xff0c;这意味着任何合法的 JavaScript 代码都是有效的 TypeScript 代码。它在 JavaScript 的基础上添加了静态类型系统、类、接口、模…

【Linux】有关时间的命令(date、timedatectl)

专栏文章索引&#xff1a;Linux 有问题可私聊&#xff1a;QQ&#xff1a;3375119339 目录 一、data命令 1.介绍 2.常用参数 3.常用选项 二、timedatectl命令 1.介绍 2.常用子命令 一、data命令 1.介绍 date命令用于显示或设置系统的时间与日期&#xff0c;语法格式为&a…

Nacos 入门篇---客户端如何发起服务注册?怎么发送服务心跳的(二)

一、引言 上个章节我们简单学习和使用了下Nacos服务自动注册&#xff0c;本文就来分析下Nacos客户端自动注册服务是怎么实现的&#xff5e; 二、目录 目录 一、引言 三、Nacos 源码编译 1.1 拉取代码 1.2 运行起来 四、客户端使用版本选择 五、Nacos客户端项目启动为什么会…

java数据结构与算法刷题-----LeetCode415. 字符串相加

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 文章目录 模拟小学加法运算 模拟小学加法运算 解题思路&#xff1a;时间复…

深入浅出 -- 系统架构之分布式集群的分类

一、单点故障问题 集群&#xff0c;相信诸位对这个概念并不陌生&#xff0c;集群已成为现时代中&#xff0c;保证服务高可用不可或缺的一种手段。 回想起初集中式部署的单体应用&#xff0c;因为只有一个节点&#xff0c;因此当该节点出现任意类型的故障&#xff08;网络、硬件…

MySQL复制拓扑4

文章目录 主要内容一.启用GUID并配置循环复制1.其中&#xff0c;UUID用来唯一标识每一个服务器&#xff0c;事务的编号记录了在该服务器上执行的事务的顺序。使用SELECT server_uuid\G命令可以查看服务器的UUID&#xff0c;sever1的UUID值显示如下&#xff1a;代码如下&#xf…

区域自动气象站讲解

TH-QC10当我们每天查看天气预报&#xff0c;安排出行计划&#xff0c;或是在户外活动时关注天气变化&#xff0c;很少有人会想到这一切背后默默付出的“英雄”——区域自动气象站。这些看似不起眼的气象监测设备&#xff0c;却在我们日常生活中扮演着至关重要的角色。今天&…

单链表经典oj题 (一) 简单

1.删除指定节点数据&#xff08;非尾节点&#xff09;&#xff0c;要求时间复杂度为O(1) . - 力扣&#xff08;LeetCode&#xff09; 在之前我们将单链表删除指定节点的操作是先遍历找到pos的前一个结点&#xff0c;然后再进行删除&#xff0c;但是现在要求再O(1)时间内完成&am…

Kubernetes有状态任务

有状态任务是指执行期间需要维护一定状态或数据的任务或工作。这些任务通常需要记录并维护数据、状态、上下文或进度信息&#xff0c;并且这些信息在任务执行期间保持持久。有状态任务的解决目标是确保任务在不同的环境、节点或时间点之间维持一致的状态和标识。这种任务通常需…