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.rhkb.cn/news/299683.html

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

相关文章

EXCEL地理数据处理工具(地图任务)

版本号 作者 修订内容 发布日期 1.0 小O 更新至0705版 2022-4-28 1.1 小O 更新至0772版 2024年4月3日 一、概述 小O地图EXCEL插件版提供基于EXCEL表格进行地理数据处理、地图可视化、地图绘图等功能&#xff0c;地理工具是用户使用频率很高的功能模块。地理工具能…

C语言交换两个变量值的方法,详细讲解

不管在学习哪门语言&#xff0c;都会遇到交换两个变量的这种问题&#xff0c;而且在面试测试题中也经常提到。既然出现的频率这么高&#xff0c;那我们今天就来讲讲交换两个变量常用的几种方法。 今天主要是基于C语言写的代码&#xff0c;不管哪种语言写的&#xff0c;应该核心…

Linux下Qt生成程序崩溃文件

文章目录 1.背景2.Qt编译生成程序2.1.profile模式的本质 3.执行程序&#xff0c;得到core文件4.代码定位4.1.直接使用gdb4.2.使用QtCreator 5.总结6.题外话6.1.profile模式和debug模式的区别 1.背景 在使用Qt时&#xff0c;假如在windows&#xff0c;当软件崩溃时&#xff0c;…

石油化工控制台定制厂家具备的专业条件一览

石油化工行业&#xff0c;作为国家的支柱产业之一&#xff0c;对设备与控制台的要求尤为严格。石油化工控制台是石油化工行业必不可少的办公设备之一。因此&#xff0c;选择一家专业的石油化工控制台定制厂家&#xff0c;对于提升企业的生产效率与安全水平具有不可估量的价值&a…

CTF之矛盾

这一题就是php的弱比较“” 这里要求输入的不是数字&#xff0c;并且输入要为1才打印flag 那我们就输入一个1后面接随便什么字符&#xff0c;因为php的弱比较将字符与数字进行比较的时候&#xff0c;会把字符转换成数字再比较&#xff0c;当转换到字符时后面便都为空了 flag{…

ChatGLM-6B实战微调(P-tuning-v2、LORA)

硬件准备 GPU: NVIDIA Tesla A30 24GB python 3.10 pytorch 1.11 transformers 4.27.1 实验环境 Change your pip source pip config set global.extra-index-url https://pypi.tuna.tsinghua.edu.cn/simple # Writing to /opt/conda/pip.conf pip config set global.inde…

C/C++预处理过程

目录 前言&#xff1a; 1. 预定义符号 2. #define定义常量 3. #define定义宏 4. 带有副作用的宏参数 5. 宏替换的规则 6. 宏和函数的对比 7. #和## 8. 命名约定 9. #undef 10. 命令行定义 11. 条件编译 12. 头文件的包含 13. 其他预处理指令 总结&#x…

【御控物联】JavaScript JSON结构转换(15):对象To数组——转换映射方式

文章目录 一、JSON结构转换是什么&#xff1f;二、术语解释三、案例之《JSON对象 To JSON数组》四、代码实现五、在线转换工具六、技术资料 一、JSON结构转换是什么&#xff1f; JSON结构转换指的是将一个JSON对象或JSON数组按照一定规则进行重组、筛选、映射或转换&#xff0…

2024年03月CCF-GESP编程能力等级认证Scratch图形化编程二级真题解析

本文收录于专栏《Scratch等级认证CCF-GESP真题解析》,专栏总目录・点这里. 一、单选题(共 10 题,每题 3 分,共 30 分) 第1题 小杨的父母最近刚刚给他买了一块华为手表,他说手表上跑的是鸿蒙,这个鸿蒙是?( )。 A、小程序 B、计时器 C、操作系统 D、神话人物 答案:…

【vite】-【vite介绍】-【vite的基础应用】-【vite的高级应用】-【

目录 vite介绍vite的基础应用vite创建项目vite创建vue3项目vite创建vue2项目vite创建react项目 vite中使用css的各种功能vite中使用tsvite中处理静态资源的方法vite集成eslint和prettiervite中的env环境变量 vite的高级应用 vite介绍 一、特点&#xff1a; 开发时效率极高开箱…

Excel常用技巧

个人笔记&#xff08;整理不易&#xff0c;有帮助点个赞&#xff09; 笔记目录&#xff1a;学习笔记目录_pytest和unittest、airtest_weixin_42717928的博客-CSDN博客 个人随笔&#xff1a;工作总结随笔_8、以前工作中都接触过哪些类型的测试文档-CSDN博客 目录 一&#xff1a…

UE4几个常用节点链接

UE4几个常用节点链接 2017-12-02 12:54 1. 流光材质(及uv平铺次数) 2. 跑九宫格 3.闪光3。1 粒子闪烁效果 4.图案重复5.平移扭曲 6.溶解 刀光的uv滚动图片源或采样节点属性里改成clamp无后期发光光晕anistropic 各向异性高光法线图 法线图叠加 blendangle orrectedNo…

ThingsBoard通过MQTT发送属性数据

MQTT基础 客户端 MQTT连接 属性上传API 案例 MQTT基础 MQTT是一种轻量级的发布-订阅消息传递协议&#xff0c;它可能最适合各种物联网设备。 你可以在此处找到有关MQTT的更多信息&#xff0c;ThingsBoard服务器支持QoS级别0&#xff08;最多一次&#xff09;和QoS级别1&…

Python爬取公众号封面图(零基础也能看懂)

&#x1f4da;博客主页&#xff1a;knighthood2001 ✨公众号&#xff1a;认知up吧 &#xff08;目前正在带领大家一起提升认知&#xff0c;感兴趣可以来围观一下&#xff09; &#x1f383;知识星球&#xff1a;【认知up吧|成长|副业】介绍 ❤️感谢大家点赞&#x1f44d;&…

【Web应用技术基础】JavaScript(4)——案例:全选/取消全选按钮

视频已发。截图如下&#xff1a; 1.点击全选按钮&#xff0c;则选中所有选项 2.只要某个选项取消&#xff0c;则自动取消全选按钮的勾选状态 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"vie…

Pytorch数据结构:GPU加速

文章目录 一、GPU加速1. 检查GPU可用性&#xff1a;2. GPU不可用需要具体查看问题3. 指定设备4.将张量和模型转移到GPU5.执行计算&#xff1a;6.将结果转移回CPU 二、转移原理1. 数据和模型的存储2. 数据传输3. 计算执行4. 设备管理5.小结 三、to方法的参数类型 一、GPU加速 .…

华为CCE部署RabbitMQ中间件操作文档

1、创建有状态&#xff08;StatefulSet&#xff09;部署 中间件一般为有状态部署&#xff0c;有状态部署与无状态部署区别参考文档&#xff1a;K8S有无状态部署-CSDN博客 1.1、基本信息 注意&#xff1a; 应用名称命名规则&#xff1a;&#xff08;命名规则最好统一&#xff…

C++高频面试知识总结 part2

C高频面试 1.sizeof是什么&#xff1f;sizeof一个class大小怎么确定&#xff1f;是在编译期还是在运行期确定?2.函数重载的机制&#xff0c;重载是在编译期还是在运行期确定&#xff0c;重载有额外开销吗3.函数重写在编译还是运行时确定&#xff1f;4.如何找到虚函数表&#x…

图解大型网站多级缓存的分层架构

前言 缓存技术存在于应用场景的方方面面。从浏览器请求&#xff0c;到反向代理服务器&#xff0c;从进程内缓存到分布式缓存&#xff0c;其中缓存策略算法也是层出不穷。 假设一个网站&#xff0c;需要提高性能&#xff0c;缓存可以放在浏览器&#xff0c;可以放在反向代理服…

Hive 之 UDF 运用(包会的)

文章目录 UDF 是什么&#xff1f;reflect静态方法调用实例方法调用 自定义 UDF&#xff08;GenericUDF&#xff09;1.创建项目2.创建类继承 UDF3.数据类型判断4.编写业务逻辑5.定义函数描述信息6.打包与上传7.注册 UDF 函数并测试返回复杂的数据类型 UDF 是什么&#xff1f; H…