Vue2路由

1.路由

1.1.Vue路由基础

Vue属于单页应用(SPA),即整个应用程序中只有一个html页面。

在单页应用中(SPA),由于只是更改DOM来模拟多页面,所以页面浏览历史记录的功能就丧失了。此时,就需要前端路由来实现浏览历史记录的功能。

<div id="app"><p><!-- 使用 router-link 组件来导航. to属性指定导航地址--><router-link to="/home">home</router-link><router-link to="/news">news</router-link></p><!-- 路由出口(路由匹配到的组件将渲染在这里) --><router-view></router-view>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script src="https://cdn.jsdelivr.net/npm/vue-router/dist/vue-router.js"></script>
<script type="text/javascript">// 1. 定义(路由)组件。const Home = {template: '<div>首页</div>'}const News = {template: '<div>新闻</div>'}// 2. 定义路由规则对象(每个路由应该映射一个组件)const routes = [{path: '/home',component: Home},{path: '/news',component: News}]// 3. 创建 router 实例,然后传 `routes` 配置const router = new VueRouter({//如果路由规则对象名也为routes,那么就可以简写为 routesroutes:routes     })// 4. 将路由对象挂载到Vue实例上// 通过 router 配置参数注入路由,从而让整个应用都有路由功能var vm = new Vue({el: '#app',data: {},// 将路由添加到Vue中router})
</script>

注意:

上面代码中,router-link标签默认会被渲染成一个a标签

路由重定向:上面代码中,我们应该设置打开浏览器就默认调整到 “首页”,所以需要把根路由/重定向到/home。 修改路由配置:

// 2. 定义路由规则对象(每个路由应该映射一个组件)
const routes = [{path: '/',            //根路由redirect: '/home'     //把根路由重定向到home},{path: '/home',component: Home},{path: '/news',component: News}
]

1.2.嵌套路由

实际应用界面,通常由多层嵌套的组件组合而成。 比如,我们 “首页”组件中,还嵌套着 “登录”和 “注册”组件,那么URL对应就是/home/login和/home/reg。

<div id="app"><p><!-- 使用 router-link 组件来导航. to属性指定导航地址--><router-link to="/home">home</router-link><router-link to="/news">news</router-link></p><!-- 路由出口(路由匹配到的组件将渲染在这里) --><router-view></router-view>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script src="https://cdn.jsdelivr.net/npm/vue-router/dist/vue-router.js"></script>
<script type="text/javascript">// 1. 定义(路由)组件。const Home = {template: `<div><h2>首页</h2><router-link to="/home/login">登录</router-link><router-link to="/home/reg">注册</router-link><router-view></router-view></div>`}const News = {template: '<div>新闻</div>'}const Login = {template: '<div>登陆</div>'}const Reg = {template: '<div>注册</div>'}// 2. 定义路由规则对象(每个路由应该映射一个组件)const routes = [{path: '/',                //根路由redirect: '/home'         //把根路由重定向到home},{path: '/home',component: Home,children: [               //配置子路由{path: '/home',redirect: '/home/login'},{path: '/home/login',component: Login},{path: '/home/reg',component: Reg}]}, {path: '/news',component: News},]// 3. 创建 router 实例,然后传 `routes` 配置const router = new VueRouter({//如果路由规则对象名也为routes,那么就可以简写为 routesroutes: routes})// 4. 将路由对象挂载到Vue实例上// 通过 router 配置参数注入路由,从而让整个应用都有路由功能var vm = new Vue({el: '#app',data: {},// 将路由添加到Vue中router})
</script>

1.3.路由传参

路由传参有多种方式,这里我们学习两种:params与query。

1.3.1.params形式传参

<div id="app"><p><router-link :to="{name:'Home',params:{msg:'hello world!'}}">home</router-link><router-link :to="{name:'News',params:{id:id,name:name}}">news</router-link></p><router-view></router-view>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script src="https://cdn.jsdelivr.net/npm/vue-router/dist/vue-router.js"></script>
<script type="text/javascript">const Home = {template: '<div>{{$route.params.msg}},首页</div>'}const News = {template: `<div>新闻;  参数1:{{$route.params.id}} 参数2:{{$route.params.name}}</div>`}const routes = [{path: '/home',name:'Home',              //每个路由规则中必须要有一个name属性component: Home}, {path: '/news',name:'News',component: News}]const router = new VueRouter({routes})var vm = new Vue({el: '#app',data: {id:1,name:'zhangsan'},router})
</script>

 注意:

  1. 使用v-bind绑定to属性。
  2. to属性的值是一个json对象,此对象有两个属性:name属性和params属性。
  3. name属性就是要路由的对象。所以,在路由规则列表中,每一个路由规则都应用有一个name值。
  4. params属性就是要传递的参数。也是一个json对象。
  5. 组件接收参数时,使用 this.$route.params.参数名 的形式。

1.3.2.query形式传参 

<div id="app"><p><router-link :to="{path:'/home',query:{msg:'hello world!'}}">home</router-link><router-link :to="{path:'/news',query:{id:id,name:name}}">news</router-link></p><router-view></router-view>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script src="https://cdn.jsdelivr.net/npm/vue-router/dist/vue-router.js"></script>
<script type="text/javascript">const Home = {template: '<div>{{$route.query.msg}},首页</div>'}const News = {template: `<div>新闻;  参数1:{{$route.query.id}}参数2:{{$route.query.name}}</div>`}const routes = [{path: '/home',component: Home}, {path: '/news',component: News}]const router = new VueRouter({routes})var vm = new Vue({el: '#app',data: {id:1,name:'zhangsan'},router})
</script>

注意:

  1. to属性的值仍然是一个josn对象,但是两个属性变了,一个是path,一个是query。
  2. path属性就是路由地址,对应路由规则中的path值。
  3. query属性就是要传递的参数。也是一个json对象。
  4. 组件接收参数时,使用 this.$route.query.参数名 的形式。

1.3.3.params方式与query方式的区别

query方式传值:

params方式传值:

总结:params方式与query方式的区别:

  1. query方式:
    类似于get方式,参数会在路由中显示,可以用做刷新后仍然存在的参数。
    利用路由规则中的path跳转。
  2. params方式:
    类似于post方式,参数不会在路由中显示,页面刷新后参数将不存在。
    利用路由规则中的name跳转。

2.编程式路由

2.1.利用JS实现路由跳转

router-link标签可以实现页面超链接形式的路由跳转。但是实际开发中,在很多情况下,需要通过某些逻辑判断来确定如何进行路由跳转。也就是说:需要在js代码中进行路由跳转。此时可以使用编程式路由。

  1. 使用this.$router.push方法可以实现路由跳转,方法的第一个参数可为string类型的路径,或者可以通过对象将相应参数传入。
  2. 通过this.$router.go(n)方法可以实现路由的前进后退,n表示跳转的个数,正数表示前进,负数表示后退。
  3. 如果只想实现前进后退可以使用this.$router.forward()(前进一页),以及this.$router.back()(后退一页)。
    <div id="app"><p><button @click="toHome">首页</button><button @click="toNews">新闻</button><button @click="toLogin">登陆</button><button @click="doForward1">前进</button><button @click="doForward2">前进</button><button @click="doBack1">后退</button><button @click="doBack2">后退</button></p><router-view></router-view>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/vue-router/dist/vue-router.js"></script>
    <script type="text/javascript">const Home = {template: '<div>首页</div>'}const News = {template: '<div>新闻:{{$route.query.name}}</div>'}const Login = {template: '<div>登陆</div>'}const routes = [{path: '/',component: Home}, {path: '/home',component: Home}, {path: '/news',component: News}, {path: '/login',component: Login}]const router = new VueRouter({routes})var vm = new Vue({el: '#app',data: {},router,methods:{toHome(){//无参数时,push方法中直接写路由地址this.$router.push('/home');},toNews(){//有参数时,push方法中写一个json对象this.$router.push({path:'/news',query:{name:'zhangsan'}});},toLogin(){this.$router.push('/login');},doForward1(){this.$router.forward();},doForward2(){this.$router.go(1);},doBack1(){this.$router.back();},doBack2(){this.$router.go(-1);}}})
    </script>

2.2.通过watch实现路由监听

通过watch属性设置监听$route变化,达到监听路由跳转的目的。

在上面代码中添加watch监听:

watch: {// 监听路由跳转。$route(newRoute, oldRoute) {console.log('watch', newRoute, oldRoute)}
}

2.3.导航守卫

路由跳转前做一些验证,比如登录验证,是网站中的普遍需求。 对此,vue-route 提供了实现导航守卫(navigation-guards)的功能。

你可以使用 router.beforeEach 注册一个全局前置守卫:

const router = new VueRouter({ ... })
router.beforeEach((to, from, next) => {// ...
})

每个守卫方法接收三个参数:

  1. to:即将要进入的目标路由对象(去哪里),可以使用 to.path 获取即将要进入路由地址。
  2. from:当前导航正要离开的路由对象(从哪来),可以使用 from.path 获取正要离开的路由地址。
  3. next:一个函数,表示继续执行下一个路由。(如果没有next,将不会进入到下一个路由)

下面例子中实现了如下功能:

  1. 列举需要判断登录状态的 “路由集合”,当跳转至集合中的路由时,如果“未登录状态”,则跳转到登录页面
  2. 当直接进入登录页面LoginPage时,如果“已登录状态”,则跳转到首页HomePage;
    <div id="box"><p><router-link to="/home">home</router-link><router-link to="/news">news</router-link><router-link to="/music">music</router-link><router-link to="/login">login</router-link></p><router-view></router-view>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/vue-router/dist/vue-router.js"></script>
    <script type="text/javascript">const Home = {template: '<div>首页</div>'}const News = {template: '<div>新闻</div>'}const Music = {template: '<div>音乐</div>'}const Login = {template: '<div>登录</div>'}const routes = [{path: '/',component: Home}, {path: '/home',component: Home}, {path: '/news',component: News}, {path: '/music',component: Music}, {path: '/login',component: Login}]const router = new VueRouter({routes // (缩写)相当于 routes: routes})var vm = new Vue({el: '#box',data: {},router})// 添加全局路由守卫router.beforeEach((to, from, next) => {//创建守卫规则集合(这里表示'/news'与'/music'路径是需要权限验证的)const nextRoute = ['/news', '/music'];// 使用isLogin来模拟是否登录let isLogin = false;// 判断to.path(要跳转的路径)是否是需要权限验证的if (nextRoute.indexOf(to.path) >= 0) {if (!isLogin) {router.push({path: '/login'})location.reload(); //必须要有}}// 已登录状态;当路由到login时,跳转至homeif (to.path === '/login') {if (isLogin) {router.push({path: '/home'});location.reload();}}next(); //必须要有});
    </script>

 

 

 

 

 

 

 

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

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

相关文章

nextjs项目中,使用postgres的完整案例

目的 通过此案例&#xff0c;可以简单快速的过一下数据库的操作&#xff0c;熟悉app-router这种模式下&#xff0c;client component和server component的两种组件中基本的接口使用。 技术栈 nextjs14.2.* app-routervercel/postgres0.10.*typescript5 重要事情说三遍1 ap…

uni-app写的微信小程序如何体积太大如何处理

方法一&#xff1a;对主包进行分包处理&#xff0c;将使用url: /pages/components/equipment/equipment跳转页面的全部拆分为分包&#xff0c;如url: /pagesS/components/equipment/equipment 在pages.json中添加 "subPackages": [{ "root"…

antd样式修改

1.Tab添加竖线 .ant-tabs .ant-tabs-tab {&::before {position: absolute;top: 50%;inset-inline-end: 0;width: 1px;height: 24px;background-color: #e1e1e1;transform: translateY(-50%);transition: background-color 0.2s;content: "";}} 像这样&#xff…

基于SSM的药品商城系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

科研绘图系列:R语言柱状图(histogram)

文章目录 介绍加载R包数据画图系统信息介绍 柱状图(Bar Chart),也称为条形图(Bar Graph),是一种常用的统计图表,用于展示不同类别的数据量。它由一系列垂直或水平的条形组成,每个条形的长度或高度代表相应类别的数值大小。 加载R包 library(tidyverse)# 显示中文 li…

增量知识 (Incremental Knowledge, IK)

在语义通信系统中&#xff0c;增量知识&#xff08;IK, Incremental Knowledge&#xff09;是一种增强数据传输效率和可靠性的技术&#xff0c;特别是用于混合自动重传请求&#xff08;HARQ, Hybrid Automatic Repeat reQuest&#xff09;机制时。它的核心思想是在传输失败后&a…

Android 15 推出新安全功能以保护敏感数据

Android 15 带来了增强的安全功能&#xff0c;可保护您的敏感健康、财务和个人数据免遭盗窃和欺诈。 它还为大屏幕设备带来了生产力改进&#xff0c;并对相机、消息和密钥等应用进行了更新。 Android 防盗保护 Google 开发并严格测试了一套全面的功能&#xff0c;以在盗窃之…

Stable Diffusion Web UI 大白话术语解释 (二)

归纳整理&#xff0c;Stable Diffusion Web UI 使用过程中&#xff0c;相关术语 ControlNet ControlNet 说简单点&#xff0c;就是你可以给 AI 一些“规则”&#xff0c;比如让它根据某些线条、结构或者骨架去画图。 这样能让 AI 画出更符合你要求的图片&#xff0c;特别适合画…

将爱传递 将“服务好”延伸

从泰康客户,转身成为泰康人,她直言是因为亲身感受了泰康“服务好”的魅力。 入司已8年的泰康养老浙江分公司HWP何英英,是泰康“服务好”的受益者。她从朋友的理赔中见证了泰康服务好的温度与力量,又被泰康养老的职域模式所吸引选择加入泰康。如今,她全身心投入在服务的第一线,…

PMP–知识卡片--项目生命周期与资源投入

预测型生命周期对变更并不友好&#xff0c;尤其是项目后期&#xff0c;变更代价太大&#xff0c;几乎让人无法接受。正如果所示&#xff0c;累计投入线代表项目累计的成本&#xff0c;也代表变更的代价。变更提出得越晚&#xff0c;代价越大。

实时语音转文字(基于NAudio+Whisper+VOSP+Websocket)

今天花了大半天时间研究一个实时语音转文字的程序&#xff0c;目的还包括能够唤醒服务&#xff0c;并把命令提供给第三方。 由于这方面的材料已经很多&#xff0c;我就只把过程中遇到的和解决方案简单说下。源代码开源在AudioWhisper: 实时语音转文字(基于NAudioWhisperVOSPWe…

1.几何算法-凸包

1.凸包的例子 1.1.简单求解 当着手设计一个计算凸包的算法时&#xff0c;此前所给出的凸包定义对我们没有多少帮助。按照定义&#xff0c;需要计算出“包含 P 的所有凸集的交”&#xff0c;可是这种集合有无限多个。而我们所观察到的“CH是一个凸多边形”这一事实&#xff0c…

libaom 源码分析:aomdec.c 文件

aomdec.c 功能:libaom 项目完成视频解码过程的 demo文件位置:libaom/apps/aomdec.c函数关系 命令行说明 终端输入 ./aomdec --help,输出如下,展示如何使用方法。Usage: ./aomdec <options> filenameOptions:--help Show usage options and exit…

pico+Unity交互开发——触碰抓取

一、VR交互的类型 Hover&#xff08;悬停&#xff09; 定义&#xff1a;发起交互的对象停留在可交互对象的交互区域。例如&#xff0c;当手触摸到物品表面&#xff08;可交互区域&#xff09;时&#xff0c;视为触发了Hover。 Grab&#xff08;抓取&#xff09; 概念&#xff…

Qt_软件添加版本信息

文章内容: 给生成的软件添加软件的版权等信息 #include <windows.h> //中文的话增加下面这一行 #pragma code_page(65001)VS_VERSION_INFO VERSIONINFO

基于Arduino的简易收音机

DIY FM收音机&#xff1a;使用Arduino和Si4703模块打造 引言 在本项目中&#xff0c;我们将使用Arduino Nano和Si4703 FM调谐模块来构建一个功能完备的FM收音机接收器。这个易于跟随的指南非常适合想要深入无线电频率和无线通信世界的业余爱好者和电子爱好者。 Si4703模块是…

cuda编程模型

host和device&#xff1a; host&#xff1a;即CPU&#xff0c;CPU所关联的内存就叫host memorydevice&#xff1a;即GPU&#xff0c;GPU内的内存就叫device memory运行CUDA程序主要有三步&#xff1a;1&#xff09;host-to-device transfer&#xff1a;将数据从host memory拷到…

python基于大数据的电影市场预测分析

一、摘要 智慧是改变生活和生产的一种来源&#xff0c;那么智慧的体现更大程度上是对于软件技术的改变。当今社会&#xff0c;好的思路&#xff0c;好的创新方式往往是改变人们生活的一种来源。最常见最直接的形式就是各种软件的创始思路&#xff0c;京东因为非典的流行才能够…

【Java知识】java进阶-反射的原理以及实现

文章目录 反射的原理类对象继承图反射的使用注意事项 Java反射机制是Java语言的一个特性&#xff0c;它允许程序在运行时动态地加载、探查、使用编译期间完全未知的类。反射机制使得Java程序可以处理一些在编译时并不确定的类&#xff0c;增加了程序的灵活性。 反射的原理 类的…

如何提高LabVIEW编程效率

提高LabVIEW编程效率对开发者来说非常重要&#xff0c;尤其是在处理复杂项目或紧迫的开发周期时。以下是一些可以显著提升LabVIEW编程效率的技巧&#xff0c;从代码结构、工具使用到团队协作的多个角度进行详细分析&#xff1a; 1. 模块化设计 模块化设计 是提高代码可维护性和…