一幅长文细学Vue(七)——路由

7 路由

摘要:在本文中我们会谈及路由的知识点,了解前端路由工作的过程以及如何在Vue3中配置路由,知道怎么使用嵌套路由和实现动态路由匹配,以及使用编程式导航和导航守卫。

声明:为了文章的清爽性,在文章内部的代码演示中只会附上部分演示代码,main.js文件的代码通常不贴出,如果感兴趣可以前往代码仓库获取
作者:来自ArimaMisaki创作

文章目录

  • 7 路由
    • 7.1 路由的概念
    • 7.2 前端路由的工作方式
    • 7.3 简易路由
    • 7.4 Vue路由解决方案
    • 7.5 Vue-router的基本使用
    • 7.6 路由重定向
    • 7.7 路由链接美化
    • 7.8 嵌套路由
    • 7.9 动态路由
    • 7.10 获取动态路由参数值的两种方案
    • 7.11 编程式导航
      • 7.11.1 什么是编程式导航
      • 7.11.2 vue-router中编程式导航的API
    • 7.12 命名路由
      • 7.12.1 声明式导航
      • 7.12.2 编程式导航
    • 7.13 导航守卫
      • 7.13.1 全局导航守卫
      • 7.13.2 守卫方法的三个形参

7.1 路由的概念

后端路由:请求方式、请求地址于function处理函数之间的对应关系。

SPA:一个web网站只有唯一的一个HTML页面,所有组件的展示和切换都在这唯一的一个页面内实现。此时不同组件之间的切换需要通过前端路由来实现。

前端路由:Hash地址和组件之间的对应关系;点击不同的链接可以切换不同的哈希地址从而达到切换组件的效果。


7.2 前端路由的工作方式

说明

  1. 用户点击了页面的路由链接
  2. URL地址栏中的Hash值发生了变化
  3. 前端路由监听到Hash地址的变化
  4. 前端路由把当前Hash地址对应的组件渲染到浏览器中

7.3 简易路由

说明:使用动态组件+location.hash+window.onhashchange可以达到一个简易路由的效果,这里不再演示。


7.4 Vue路由解决方案

说明:在实际开发中,只要是Vue项目,我们都可以使用官方推荐的Vue-router来实现路由。

版本:vue-router有3.x和4.x的版本,其中3.x只能搭配Vue2,4.x只能搭配Vue3

安装:npm i vue-router@next -S


7.5 Vue-router的基本使用

链接标签:router-link

路由组件标签:router-view

说明:使用router-link标签代替传统的a标签,可以让我们在不刷新网页的情况下改变哈希地址,其中router-link标签中带有属性to,其值为哈希地址;我们可以将router-link对应的组件渲染到router-view标签之上。

使用步骤

  1. 在项目中创建router.js路由模块
  2. 从vue-router中按需导入两个方法;其中createRouter用于创建路由,createWebHashHistory用于指定路由工作模式
  3. 创建路由实例对象
  4. 向外共享路由实例对象
  5. 在main.js中导入并挂载路由模块
<template><div><h1>Vue-router的基本使用</h1><hr><router-link to="/home">首页</router-link><router-link to="/movie">电影</router-link><router-link to="/about">关于</router-link><hr><router-view></router-view></div>
</template><script>
export default {name:'MyApp'
}
</script>
import {createRouter,createWebHashHistory} from 'vue-router'
import Home from './MyHome.vue'
import About from './MyAbout.vue'
import Movie from "./MyMovie.vue"// 1.创建路由实例对象
const router = createRouter({// 2.指定路由工作模式,为了简化学习,我们采用Hash模式history:createWebHashHistory(),// 3.指定路由地址及其对应组件routes:[{path:'/home',component:Home},{path:'/movie',component:Movie},{path:'/about',component:About}]
})// 4.前往main.js调用app.use全局挂载该路由实例对象
export default router
import { createApp } from 'vue'
import App from "./components/02.start/App.vue"
import router from "./components/02.start/Router"const app = createApp(App)
app.use(router)
app.mount('#app')

7.6 路由重定向

说明:路由重定向是值用户在访问地址A的时候,强制用户跳转到地址C,从而展示特定的组件页面。

解决方案:在routes数组中需要重定向的对象中添加redirect属性,并设置其值为重定向的地址。

import {createRouter,createWebHashHistory} from 'vue-router'
import Home from './MyHome.vue'
import About from './MyAbout.vue'
import Movie from "./MyMovie.vue"// 1.创建路由实例对象
const router = createRouter({// 2.指定路由工作模式,为了简化学习,我们采用Hash模式history:createWebHashHistory(),// 3.指定路由地址及其对应组件routes:[{path:'/',redirect:'/home'},{path:'/home',component:Home},{path:'/movie',component:Movie},{path:'/about',component:About}]
})// 4.前往main.js调用app.use全局挂载该路由实例对象
export default router

7.7 路由链接美化

引入:由于我们不再使用传统的a标签,这也就导致了无法再使用传统的css美化样式对其进行美化。

说明:我们对于router-link有两个美化的解决方案:

  • 使用默认的class类:被激活的路由链接,默认会应用一个叫做router-link-active的类名。开发者可以使用此类名选择器,为激活的路由链接设置样式。
  • 自定义路由的class类:在创建路由的实例对象时,可以基于与history平级,添加一个linkActiveClass属性,值为自定义的类名。

7.8 嵌套路由

说明:通过路由实现组件的嵌套展示,叫做嵌套路由。也就是说,在一个大组件中包含了多个小组件,一个页面可以通过路由来切换不同的大组件,大组件中也可以根据嵌套路由来切换不同的小组件。

使用嵌套路由的方式是在父路由的创建路由方法中添加children规则;children是一个数组,里面可以存放多个路由对象,嵌套子路由对象和一般的路由对象写法完全一样。

image-20220831204830322

写法

import {createRouter,createWebHashHistory} from 'vue-router'
import Home from './MyHome.vue'
import About from './MyAbout.vue'
import Movie from "./MyMovie.vue"import Tab1 from './tabs/MyTab1.vue'
import Tab2 from './tabs/MyTab2.vue'// 1.创建路由实例对象
const router = createRouter({// 2.指定路由工作模式,为了简化学习,我们采用Hash模式history:createWebHashHistory(),// 3.指定路由地址及其对应组件routes:[{path:'/',redirect:'/home'},{path:'/home',component:Home},{path:'/movie',component:Movie,name:'mov'},{path:'/movie/:id',component:Movie},{path:'/about',component:About},{path:'/about',component:About,redirect:'/about/tab1',children:[// 子级路由不要以斜线开头{path:'tab1',component:Tab1},{path:'tab2',component:Tab2}]}]
})// 4.前往main.js调用app.use全局挂载该路由实例对象
export default router

7.9 动态路由

引入:在之前的学习中实际上出现了一个问题。当我们指定一个路由链接时,都需要为其指定一个路由规则,这样做的话随着路由链接的增多,若规则大同小异,则会使得代码复用性差。

image-20220901214740389

说明:动态路由的做法是:把Hash地址中可变的部分定义为参数项,从而提高路由规则的复用性,具体的做法是在vue-router中使用英文的冒号:来定义路由的参数项。

<router-link to="/home">首页</router-link><router-link to="/movie/1">电影1</router-link><router-link to="/movie/2">电影2</router-link><router-link to="/movie/3">电影3</router-link><router-link to="/about">关于</router-link>
{path:'/movie/:id',component:Movie},

7.10 获取动态路由参数值的两种方案

说明:在动态路由中,我们可以通过:的方式来指定动态参数值;当时我们不知道如何在组件中获取该参数值。为此,Vue提供了两种做法可用于获取参数对象。

  • $route.parms参数对象
  • 使用props来接收路由参数

7.11 编程式导航

7.11.1 什么是编程式导航

说明:通过调用API实现导航的方式,叫做编程式导航;与之对应的,通过点击链接实现导航的方式,叫做声明式导航。如:

  • 普通页面中点击<a>链接,vue项目中点击<router-link>都属于声明式导航
  • 普通网页中调用location.href跳转到新页面的方式,属于编程式导航

7.11.2 vue-router中编程式导航的API

说明:Vue-router提供了许多编程式导航的API,其中最常用的两个API分别是:

  1. this.$router.push(‘hash地址’):用于跳转到对应哈希地址的组件
  2. this.$router.go(数值n):n设置为-1可以回退上一个组件页面
<template><div><h1>MyHome组件</h1></div><button @click="toMovie(3)">跳转到电影3</button></template><script>export default {name:'MyHome',methods:{toMovie(id){this.$router.push('/movie/'+id)}}}</script>
<template><div><h1>MyMovie标签</h1><button @click="goBack()">回退上一个页面</button></div></template><script>export default {name:'MyMovie',methods:{goBack(){this.$router.go(-1);}}}</script>

7.12 命名路由

7.12.1 声明式导航

说明:通过name属性为路由规则定义名称的方式叫做命名路由。

<template><div><h1>MyHome组件</h1><router-link :to="{name:'mov'}">go to movie</router-link></div></template><script>export default {name:'MyHome',}</script>
{path:'/movie',component:Movie,name:'mov'}

7.12.2 编程式导航

说明:调用push函数期间指定一个配置对象,name是要跳转到的路由规则,params是携带的路由参数。

<template><div><h1>MyHome组件</h1><router-link :to="{name:'mov'}">go to movie</router-link><button @click="gotoMovie">去电影组件</button></div></template><script>export default {name:'MyHome',methods:{gotoMovie(){this.$router.push({name:'mov'})}}}</script>

7.13 导航守卫

说明:导航守卫可以控制路由的访问权限。

示意图

image-20220907134549057

7.13.1 全局导航守卫

说明:全局导航守卫会拦截每个路由规则,从而对每个路由进行访问权限的控制;导航守卫本质上是一个钩子,在使用路由之前时我们都会使用这个钩子。

使用方式:router.beforeEach(fn)


7.13.2 守卫方法的三个形参

to:目标路由对象

from:当前导航正要离开的路由对象

next:一个函数,表示放行;如果在守卫方法中不声明next形参,则默认允许用户访问每一个路由;如果守卫方法声明了next形参,则必须调用next函数后才能访问路由

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

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

相关文章

Codeforces 913 二进制背包(柠檬水) 暴力贪心特殊背包(选题)

A B C 给你N(N<30)种水瓶每种水瓶有无限个 每个的体积是2^(i-1)价格是cost[i] 要求你花最少的钱弄出L体积的水 先从前到后扫一遍cost[i1]min(cost[i1],cost[i]*2) 再从后往前扫一遍cost[i]min(cost[i],cost[i1) 保证了价格的最优化 然后从0开始到30 如果二进制有当前体积的…

android baidupush

实战 QQ demo源码&#xff08;本例中有该应用&#xff09; 服务器端下载&#xff1a;http://download.csdn.net/download/knight_black_bob/9822551 android eclipse 版&#xff1a;http://download.csdn.net/download/knight_black_bob/9822553 android stdio 版本&#xff1…

jQuery源码分析--Event模块(1)

jQuery的Event模块提供了强大的功能&#xff1a;事件代理&#xff0c;自定义事件&#xff0c;自定义数据等。今天记录一下它实现的原理。 我们都知道&#xff0c;在js的原生事件中&#xff0c;有事件对象和回调函数这两样东西。但是事件对象是只读的&#xff0c;所以jQuery就用…

JSP内置对象(9个常用的内置对象)

为什么80%的码农都做不了架构师&#xff1f;>>> 2012-08-06 1.request对象 客户端的请求信息被封装在request对象中&#xff0c;通过它才能了解到客户的需求&#xff0c;然后做出响应。它是HttpServletRequest类的实例。 序号 方 法 说 明 1 object getAttribute(S…

用户可计算型出题程序

此次程序是对上次程序的再次开发&#xff0c;我将自己视作另一个在开发者&#xff0c;在对自己前面程序进行再次审视时&#xff0c;有了别样的感受&#xff0c;自己写的程序&#xff0c;一定要为别人(也有可能是自己)留一条活路。闲话不多说&#xff0c;进入大家最喜欢的**环节…

使用React、Node.js、MongoDB、Socket.IO开发一个角色投票应用的学习过程(三)

前篇 使用React、Node.js、MongoDB、Socket.IO开发一个角色投票应用的学习过程&#xff08;一&#xff09;使用React、Node.js、MongoDB、Socket.IO开发一个角色投票应用的学习过程&#xff08;二&#xff09;原文第十三步&#xff0c;Express API路由 第一个路由是用来创建角色…

匿名方法,lambad表达式,匿名类

其实lambad表达式就是“函数”或者说是“方法”写法的一个进化&#xff0c;越来越简化而已&#xff0c;如数学方法里的f(X)。 匿名方法&#xff1a;顾名思义&#xff0c;匿名方法就是没有名称的方法&#xff0c;但是有定义参数。 匿名方法最明显的好处就是可以降低另写一个方法…

Python3.1-标准库之Numpy

这系列用来介绍Python的标准库的支持Numpy部分。资料来自http://wiki.scipy.org/Tentative_NumPy_Tutorial&#xff0c;页面有许多链接&#xff0c;这里是直接翻译&#xff0c;所以会无法链接。可以大致看完该博文&#xff0c;再去看英文版。 1、先决条件 想要运行numpy&#x…

黑马Android全套视频无加密完整版

课程描述&#xff1a;java基础到javaweb开发&#xff0c;从基础入门到实战。安卓基础到实战。实体班近5个月的课程实录&#xff01;&#xff01;&#xff01;课程表&#xff1a;xml&dom_sax_dom4j编程tomcat与web程序结构与Http协议与HttpUrlConnectionjava web之servletja…

强大的CSS3动画库animate.css

今天要给大家介绍一款强大的CSS3动画库animate.css&#xff0c;animate.css定义了大概50多种动画形式&#xff0c;包括淡入淡出&#xff0c;文字飞入、左右摇摆动画等等。使用animate.css也非常简单&#xff0c;你可以给页面上的任意元素&#xff0c;特别是文字添加各种神奇的动…

有关系统环境变量的设置问题

不知道各位朋友有没有想过这样用的问题&#xff0c;我们在使用windows使用在cmd下运行Ping、Netstat等之类的命令时&#xff0c;为什么可以使用呢&#xff1f; 这些后面牵涉到哪些东西呢&#xff1f; 我们今天就来介绍下有关这方面的知识。我们现在以win8作为测试对象&#xff…

linux下安装配置jdk(解压版)

在linux下登录oracle官网&#xff0c;下载解压版jdk 传送门系统默认下载到“下载”目录中创建要将该文件解压的文件夹&#xff1a;其中 -p 参数代表递归创建文件夹&#xff08;可以创建多级目录&#xff09; 进入到下载目录&#xff0c;将下载好的jdk解压到指定目录配置环境…

谈谈Angular关于$watch,$apply 以及 $digest的工作原理

这篇文章主要是面向那些刚开始学AngularJs和想要了解数据绑定&#xff08;data-binding&#xff09;是怎么工作的&#xff0c; 如果你已经熟悉如何使用angularjs了&#xff0c;我强烈建议你不用阅读了。 angularjs使用者想要知道data-binding是如何工作的&#xff0c;就会遇到很…

Tachyon更名为 Alluxio,并发布1.0版本

详细参考 http://www.alluxio.org/releases/alluxio-1-0-0-release.html http://geek.csdn.net/news/detail/57243 http://www.alluxio.org/ Alluxio介绍 Alluxio 1.0版本&#xff0c;作为世界上首款以内存为中心的虚拟分布式存储系统&#xff0c;它能够统一数据访问并成为连接…

一幅长文细学MongoDB(四)——索引

4 索引 文章目录4 索引4.1 概述4.2 索引类型4.3 索引创建4.3 删除索引4.4 查看索引执行计划4.5 涵盖的查询4.1 概述 说明&#xff1a;索引支持在MongoDB中高效地查询。如果没有索引&#xff0c;MongoDB必须执行全集合扫描&#xff0c;即扫描集合中的每个文档&#xff0c;以选择…

【转】Android图片加载神器之Fresco-加载图片基础[详细图解Fresco的使用]

Fresco简单的使用—SimpleDraweeView 百学须先立志—学前须知&#xff1a; 在我们平时加载图片(不管是下载还是加载本地图片…..)的时候&#xff0c;我们经常会遇到这样一个需求&#xff0c;那就是当图片正在加载时应该呈现正在加载时的图像&#xff0c;当图片加载失败时应该呈…

对象映射工具AutoMapper介绍

AutoMapper是用来解决对象之间映射转换的类库。对于我们开发人员来说&#xff0c;写对象之间互相转换的代码是一件极其浪费生命的事情&#xff0c;AutoMapper能够帮助我们节省不少时间。 一. AutoMapper解决了什么问题? 要问AutoMapper解决了什么问题&#xff1f; 难道不是对象…

MindSpore安装教程【简洁易懂】

1 官网 MindSpore官网&#xff1a;MindSpore安装指南 2 关注社区 3 下载 查看自己python版本&#xff1a;使用python -V查看自己python版本 进入官网选择相应配置&#xff1a; 验证是否安装成功&#xff1a;python -c "import mindspore;mindspore.run_check()"&a…

一幅长文细学Vue(十三)——组合式中的生命周期

13 组合式API&#xff08;四&#xff09; 摘要&#xff1a;每个 Vue 组件实例在创建时都需要经历一系列的初始化步骤&#xff0c;比如设置好数据侦听&#xff0c;编译模板&#xff0c;挂载实例到 DOM&#xff0c;以及在数据改变时更新 DOM。在此过程中&#xff0c;它也会运行被…

OSGI 生命周期

1 生命周期管理 对于非模块化应用&#xff0c;生命周期将应用作为一个整体来操作&#xff1b;而对于模块化应用&#xff0c;则可以以细粒度的方式来管理应用的某一个独立部分。OSGi生命周期管理 OSGi生命周期层有两种不同的作用&#xff1a; 在应用程序外部&#xff0c;定义了对…