Vue2 router相关记录

vue-router

安装与配置

vue2 得用vue-router3

npm i vue-router@3

vue3 得用vue-router4

建立一个文件夹router
index.js

import About from "@/components/About.vue";
import Home from "@/components/Home.vue";const router = new VueRouter({routes: [{path:'/home',component: Home}]
})export default router;

main.js

import Vue from 'vue'
import App from './App.vue'
import VueRouter from 'vue-router'
import router from '@/router'Vue.use(VueRouter)Vue.config.productionTip = false
new Vue({render: h => h(App),router
}).$mount('#app')

路由基本使用

App.vue

<template><div class="app"><div class="row"><div class="col-xs-offset-2 col-xs-8"><div class="page-header"><h2>Vue Router Demo</h2></div></div></div><div class="row"><div class="col-xs-2 col-xs-offset-2"><div class="list-group"><router-link class="list-group-item" active-class="active" to="/about">About</router-link><router-link class="list-group-item" active-class="active" to="/home">Home</router-link></div></div><div class="col-xs-6"><div class="panel"><div class="panel-body"><router-view></router-view></div></div></div></div></div>
</template>
<script>
export default {name: 'App'
}
</script>

router-link 本质上就是a标签,我们要使用to属性到我们的路径
router-view是我们要展示的位置

index.js

import About from "@/components/About.vue";
import Home from "@/components/Home.vue";
import VueRouter from "vue-router";const router = new VueRouter({routes: [{path:'/home',component: Home},{path: '/about',component: About}]
})export default router;

两个组件,就是两行字

几个注意点

路由的页面一般放到pages文件夹
通过切换隐藏的路由组件,实际上是被销毁的
每个路由组件都有自己的$route属性,里边存储着自己的路由信息
整个应用这有一个router,可以通过组件的$router获取到

嵌套路由

import About from "@/components/About.vue";
import Home from "@/components/Home.vue";
import Message from "@/components/Message.vue";
import News from "@/components/News.vue";
import VueRouter from "vue-router";const router = new VueRouter({routes: [{path:'/home',component: Home,children: [{path: 'news',component: News},{path: 'message',component: Message},]},{path: '/about',component: About,children: [{path: 'news',component: News},{path: 'message',component: Message},]}]
})export default router;

注意嵌套路由不要再加/,因为vue会自动补一个/,如果手欠多写了一个,会找不到

<router-link to="/home/news">News</router-link>

且router-link必须这么写

query参数

路由组件之间的传值使用query参数
传递参数

<li v-for="msg in messageList" :key="msg.id">
<router-link :to="`/home/message/detail?id=${msg.id}&title=${msg.title}`">
{{msg.title}}
</router-link>
</li>

传递变量不可以直接写:了事,:会把里边的值看成是js代码,还是使用模版字符串``,在里边使用${},这样的写法和php的模版字符串是一样的

对象写法

<li v-for="msg in messageList" :key="msg.id"><router-link :to="{path:'/home/message/detail',query: {id:msg.id,title: msg.title}}">{{msg.title}}</router-link>&nbsp;&nbsp;
</li>

对象写法更为清晰,推荐

接收参数

    <div>消息编号:{{$route.query.id}}</div><div>消息标题:{{$route.query.title}}</div>

命名路由

有时候路由路径太长,可以起一个路由的名字


const router = new VueRouter({routes: [{path:'/home',component: Home,children: [{path: 'news',component: News},{path: 'message',component: Message,children: [{name:'xiangqing',path: 'detail',component: Detail,}]},]}]
})

这里我给detail,起了个名字,xiangqing
使用的时候,我们就不能用path,得用name

<router-link :to="{name:'xiangqing',query: {id:msg.id,title: msg.title}
}">{{msg.title}}</router-link>

params参数

必须在路由配置中配置,占位符

const router = new VueRouter({routes: [{path:'/home',component: Home,children: [{path: 'news',component: News},{path: 'message',component: Message,children: [{name:'xiangqing',path: 'detail/:id/:title',component: Detail,}]},]}]
})
<li v-for="msg in messageList" :key="msg.id"><router-link :to="{name:'xiangqing',params: {id:msg.id,title: msg.title}}">{{msg.title}}</router-link>&nbsp;&nbsp;</li>

配置params

注意,这里不能用path,必须用name

接收参数

<div>消息编号:{{$route.params.id}}</div>
<div>消息标题:{{$route.params.title}}</div>

props配置

props配置,是为了简写拿到的qurery和params

一共三种写法

值为对象

{name:'xiangqing',path: 'detail/:id/:title',component: Detail,props:{a:1,b:2}
}//接收
props:['a','b']

这种写法只能传送死数据

值为布尔值

{name:'xiangqing',path: 'detail/:id/:title',component: Detail,props:true
}

如果值为true,就会把路由组件收到的所有params参数,以propos传给Detail组件

缺点只能传params参数

值为函数

{name:'xiangqing',path: 'detail/:id/:title',component: Detail,props($route) {return {id: $route.params.id,title: $route.params.title}}
}//接受
props:['id','title']

我们可以直接写query或者params
这个写法比较通用

replace

浏览器的历史记录有两种写入方式:push和replace,其中push是追加历史记录,replace是替换当前记录。路由跳转时候默认为push方式

开启replace模式:<router-link replace ...>News</router-link>

push方式的形式类似于路径压栈

特别注意replace是替换当前记录.举个例子

一共三个路径
localhost:8080#/
localhost:8080#/home
localhost:8080#/home/news

正常来说,按照压入栈的形式是如下的
localhost:8080#/home/news
localhost:8080#/home
localhost:8080#/

栈顶就是我们最后的news

如果我们在news开启replace模式,当我们点击news这个router-link的时候,当前路由路径是localhost:8080#/home,那么localhost:8080#/home/news就会替换当前home的路径变成如下的

localhost:8080#/home/news
localhost:8080#/

我想说的是,他不会所有的都替换,只会替换当前的路径

编程式路由导航

this.$router.forward() //前进
this.$router.back() //后退
this.$router.go() //可前进也可后退
this.$router.push({name:'xiangqing',params: {id:msg.id,title: msg.title}
})

push和replace是一样的,都写入一个配置对象就ok

go()传入数字,例如,go(2),往前走两步,go(-2)往回走2步

缓存路由组件

我们知道,路由组件在切换的时候,是会销毁路由组件,有的时候,我们不想销毁

那我们就找到哪里展示这些路由组件,写如下代码

//缓存一个<keep-alive include="News"><router-view></router-view></keep-alive>
//缓存多个<keep-alive :include="['News','Message']"><router-view></router-view></keep-alive>

注意,include这里的写的是组件名,组件名!!!
并且,如果不写的话,那就是这下面所有的组件都缓存

两个生命周期钩子

接上文,缓存路由组件,我们像一个场景,我们缓存了路由组件,路由组件不会去销毁,但是有时候,我们在这个路由组件里边写了定时器什么的,如果我们不关掉,定时器在其他地方就会一直运行,所以我们就可以引出这两个路由组件独有的生命周期钩子
在这里插入图片描述
我们可以在deactivated钩子里边关闭定时器

全局路由守卫

import About from "@/components/About.vue";
import Detail from "@/components/Detail.vue";
import Home from "@/components/Home.vue";
import Message from "@/components/Message.vue";
import News from "@/components/News.vue";
import VueRouter from "vue-router";const router = new VueRouter({routes: [{path:'/home',component: Home,meta: {title:'主页'},children: [{path: 'news',component: News,meta: {isAuth: true,title:'新闻'}},{path: 'message',component: Message,meta: {isAuth: true,title:'消息'},children: [{name:'xiangqing',path: 'detail/:id/:title',component: Detail,props($route) {return {id: $route.params.id,title: $route.params.title}}}]},]},{path: '/about',component: About,meta: {title:'关于'},children: [{path: 'news',component: News,meta: {isAuth: true,title:'新闻'}},{path: 'message',component: Message,meta: {isAuth: true,title:'消息'},},]}]
})router.beforeEach((to,from,next) => {if(to.meta.isAuth) {if(localStorage.getItem('name') === 'jjking') {next();} else {alert("没有权限查看");}} else {next();}
})router.afterEach((to,from,next) => {if(to.meta.title) {document.title = to.meta.title;} else {document.title = '我的系统';}
})
export default router;

全局路由守卫有点类似于,后端的过滤器interceptors,我初步认为,这个路由守卫是搭配后端的权限配置的
比如说,你是vip,就能看vip的内容,如果你不是vip就不能看

例如我上面这个例子,我们是在本地存储上写了一个,如下
在这里插入图片描述router.beforeEach()这个函数的回调是,路由切换之前的回调函数
在这个时候我们进行权限的校验,如何标识什么接口需要权限的标识呢,我们就在router给我们准备的meta元信息里边写一个isAuth
如果为true,说明需要校验,写入我们希望的校验规则,这里我是写死的,一般项目中,我认为是从后端去获取校验的规则,比如某某用户拥有什么权限,有什么权限就给看什么
next()就是给放行

独享路由守卫

和全局路由守卫差不多,不过这个会配置在路由组件里边的,且名字不同

{path: 'news',component: News,meta: {isAuth: true,title:'新闻'},beforeEnter(to,from,next) {if(to.meta.isAuth) {if(localStorage.getItem('name') === 'jjking') {next();} else {alert("没有权限查看");}} else {next();}}}

名字叫做beforeEnter,且没有独享后置路由守卫

组件内路由守卫

在这里插入图片描述

路由守卫总结

全部的路由守卫的顺序是如下的
前置 => 独享 => 进入 => 离开 => 后置

比较容易混淆的是,组件和前后置路由守卫,组件内路由守卫是组件内部的自己的独特的业务逻辑,是独有的,且也会影响是否放行

路由器的两种工作模式

对于一个url来说,什么是hash值?—— #及其后面的内容就是hash值

hash值不会包含在 HTTP 请求中,即:hash值不会带给服务器

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

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

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

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

相关文章

基于linux下实现的ping程序(C语言)

linux下实现的ping程序 一、设计目的 PING程序是我们使用的比较多的用于测试网络连通性的程序。PING程序基于ICMP&#xff0c;使用ICMP的回送请求和回送应答来工作。由计算机网络课程知道&#xff0c;ICMP是基于IP的一个协议&#xff0c;ICMP包通过IP的封装之后传递。 课程设…

2024年12月16日Github流行趋势

项目名称&#xff1a;PDFMathTranslate 项目维护者&#xff1a;Byaidu reycn hellofinch Wybxc YadominJinta项目介绍&#xff1a;基于 AI 完整保留排版的 PDF 文档全文双语翻译&#xff0c;支持 Google/DeepL/Ollama/OpenAI 等服务&#xff0c;提供 CLI/GUI/Docker。项目star数…

国标GB28181协议平台Liveweb:搭建建筑工地无线视频联网监控系统方案

随着科技高速发展&#xff0c;视频信号经过数字压缩&#xff0c;通过互联网宽带或者移动4G网络传递&#xff0c;可实现远程视频监控功能。将这一功能运用于施工现场安全管理&#xff0c;势必会大大提高管理效率&#xff0c;提升监管层次。而这些&#xff0c;通过Liveweb监控系统…

Ansible playbook 详解与实战操作

一、概述 playbook 与 ad-hoc 相比,是一种完全不同的运用 ansible 的方式&#xff0c;类似与 saltstack 的 state 状态文件。ad-hoc 无法持久使用&#xff0c;playbook 可以持久使用。 playbook 是由一个或多个 play 组成的列表&#xff0c;play 的主要功能在于将事先归并为一…

电脑玩《刺客信条》时中,遇到找不到d3dx9_42.dll的问题是什么原因?缺失d3dx9_42.dll应该怎么解决呢?下面一起来看看吧!

电脑玩《刺客信条》时&#xff0c;找不到d3dx9_42.dll的原因及解决办法 对于许多热爱《刺客信条》这款游戏的玩家来说&#xff0c;在游戏中遇到找不到d3dx9_42.dll的问题无疑是非常令人头疼的。这一错误不仅会导致游戏无法启动&#xff0c;还可能引发运行过程中的图形错误、卡…

Apache Solr RCE(CVE-2017-12629)--vulhub

Apache Solr 远程命令执行漏洞&#xff08;CVE-2017-12629&#xff09; Apache Solr 是一个开源的搜索服务器。Solr 使用 Java 语言开发&#xff0c;主要基于 HTTP 和 Apache Lucene 实现。原理大致是文档通过Http利用XML加到一个搜索集合中。查询该集合也是通过 http收到一个…

Mysql索引类型总结

按照数据结构维度划分&#xff1a; BTree 索引&#xff1a;MySQL 里默认和最常用的索引类型。只有叶子节点存储 value&#xff0c;非叶子节点只有指针和 key。存储引擎 MyISAM 和 InnoDB 实现 BTree 索引都是使用 BTree&#xff0c;但二者实现方式不一样&#xff08;前面已经介…

中间件 redis安装

redis官网地址&#xff1a;Redis - The Real-time Data Platform 环境 CentOS Linux release 7.9.2009 (Core) java version "17.0.12" 2024-07-16 LTS 1、通过压缩包安装redis 1&#xff0c;远程下载redis压缩包&#xff0c;或去官网下载&#xff1a;Downloads …

台球助教平台系统开发APP和小程序信息收藏功能需求解析(第十二章)

以下是开发台球助教系统客户端&#xff08;APP&#xff0c;小程序&#xff0c;H5&#xff09;几端的信息收藏功能的详细需求和功能说明&#xff0c;内容比较详细&#xff0c;可以说是一个教科书式的详细说明了&#xff0c;这套需求说明不仅仅用在我们的台球助教系统程序上&…

freertos入门---堆的概念

freertos入门—堆的概念 堆就是一块空闲的内存。下面举个例子更好的理解堆的概念&#xff1a;   堆是一块空闲的内存&#xff0c;我们可以定义一个数组char heap_buf[1024]&#xff0c;可以看到该数组就是一个空闲的内存&#xff0c;我们只需要在它上面实现内存的分配和释放那…

操作系统(17)文件和文件系统

一、文件 定义&#xff1a;文件是数据的有序集合&#xff0c;是用户存储信息于辅存的基本逻辑单位。文件可以是字符流构成的无结构文件&#xff0c;也可以是包含相似记录的结构化文件。 类型&#xff1a; 按性质和用途&#xff1a;系统文件&#xff08;由系统软件构成的文件&a…

ASP.NET|日常开发中读写TXT文本详解

ASP.NET&#xff5c;日常开发中读写TXT文本详解 前言一、读取 TXT 文本1.1 使用StreamReader类 二、写入 TXT 文本2.1 使用StreamWriter类 三、文件编码问题3.1 常见编码格式 四、错误处理和性能考虑4.1 错误处理4.2 性能考虑 结束语优质源码分享 ASP.NET&#xff5c;日常开发中…

notepad++快捷键-多行编辑中如何使所有行的光标都向后移动一个单词的长度(每行单词长度不一定一致)

问题&#xff1a;在使用notepad进行多行编辑&#xff08;多行光标移动一个单词长度&#xff09;时&#xff08;将下图由左边变为右边&#xff09;&#xff0c;在使用Ctrl左键拖拽选中多行后&#xff0c;想要将每行的光标向后移动一个单词的长度&#xff08;每行的单词长度不一样…

【IC】Hybrid Bonding技术

从纳米到埃米&#xff0c;芯片制造商正在竭尽全力缩小电路的尺寸。但面对算力需求的激增&#xff0c;一项涉及更大尺寸&#xff08;数百或数千纳米&#xff09;的技术——混合键合&#xff08;Hybrid Bonding&#xff09;——将在未来五年内扮演重要角色。近日&#xff0c;IEEE…

洛谷 B3643 图的存储 C语言

题目&#xff1a;https://www.luogu.com.cn/problem/B3643 题目描述 给定一个 n 个顶点 m 条边的无向图。请以邻接矩阵和邻接表的形式输出这一张图。 输入格式 第一行输入两个正整数 n 和 m&#xff0c;表示图的顶点数和边数。 第二行开始&#xff0c;往后 m 行&#xff0…

MATLAB里面,try-catch-end系列语言的含义与用法(含例程)

在 MATLAB 中&#xff0c;try-catch-end 语句用于处理可能会引发错误的代码。它允许你在“尝试”部分执行代码&#xff0c;如果代码执行过程中发生错误&#xff0c;将转到“捕获”部分执行相应的处理。这种错误处理机制可以提高程序的健壮性&#xff0c;避免因小错误导致整个程…

Python练习之列表的使用

&#xff08;搭配主页知识点&#xff09; 【练习要求】 针对知识点列表定义、追加、列表元素读取、查找安排的本实例。要求实现&#xff1a;有一个列表&#xff0c;内容是:[21,25,21,23,22,20]&#xff0c;记录的是一批学生的年龄请通过列表的功能(方法)&#xff0c;对其进行…

安装虚拟机(VMware)教程+win7

VMware 一.下载VMware Wworkstation Pro二、安装VMware三、安装虚拟机 一.下载VMware Wworkstation Pro 1.去vmware官网下载 官网 2.网盘下载 通过网盘分享的文件&#xff1a;vmware 链接: https://pan.baidu.com/s/1bOff79NFAmDlISQo6LK6PQ?pwdhunr 提取码: hunr --来自百…

C语言总共n位数,将后面的K个数与前面的数对调位置,前后二部分的数字顺序不变

例如&#xff1a;n5&#xff0c;k2&#xff0c;要处理的数字是12345&#xff0c;则处理后变成45123 这个问题可以通过以下步骤解决&#xff1a; 确定前后两部分的分界点。 对前后两部分分别进行反转。 以下是一个简单的C语言示例代码&#xff1a; #include<stdio.h>…

C# Winform双色纸牌接龙小游戏源码

文章目录 一、设计来源双色纸牌接龙小游戏讲解1.1 主界面1.2 游戏界面1.3 游戏界面快成功了 二、效果和源码2.1 动态效果2.2 源代码 源码下载更多优质源码分享 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/144419994 …