Vue 路由

news2024/11/23 11:48:18

参考文献:Vue中的路由

目录:

  • 一、路由理解:
  • 二、路由管理器理解:
  • 三、路由的使用:
  • 四、嵌套路由:
  • 五、路由传参:
    • 1.query传参:
    • 2. params传参:
  • 六、编程式路由导航:
  • 七、响应路由参数变化:
  • 八、路由守卫:
    • 1.全局守卫:
    • 2.独享守卫:
    • 3.组件守卫:

一、路由理解:

  • 一个路由就是一组映射关系(key,value),多个路由需要路由器(router)进行管理。
  • 其中key是路径,value是组件。
  • 作用:设定访问路径,并将路径和组件映射起来(就是用于局部刷新页面,不需要请求服务器来切换页面)

二、路由管理器理解:

  • Vue-router是路由管理插件。主要用于管理URL,实现URL和组件的对应,及通过URL进行组件之间的切换,从而使构建单页面应用变得更加简单。
  • 单页面应用(single page web application, SPA)的核心思想之一,就是更新视图而不重新请求页面,简单来说,它在加载页面时,不会重新加载整个页面,只会更新某个指定的容器中的内容(局部刷新机制)
  • vue-router可以实现当用户单击页面中的超链接A时,页面显示内容(组件)A;单击超链接B时,页面显示内容(组件)B。(局部刷新机制)
  • 举个例子:
    在这里插入图片描述
    在这里插入图片描述
    我们可以看到页面是局部刷新,导航栏并不会随着页面的切换而变化。

三、路由的使用:

  • App.vue页面:
<template>
  <div id="app" class="container" align="center">
    <!--
      使用 router-link 组件来导航
      通过传入 'to' 属性指定链接,<router-link> 默认会被渲染成一个 '<a>' 标签
    -->
    <router-link to="/staff" class="col-md-6">员工信息列表</router-link>
    <router-link to="/student" class="col-md-6">学生信息列表</router-link>
    <!--
      router-view 作为路由出口
      路由匹配到的组件将渲染在这里
      点击某个 router-link 组件,router-link 组件中的界面会渲染到 router-view 中,而不是刷新整个页面,这就是路由的好处(类似javascript中的innerHTML)
    -->
    <router-view></router-view>
  </div>  
</template>

<script>
	export default {
	}
</script>

<style>
</style>

  • 组件StaffList.vue:
<template>
  <div class="container">
    	<h2>这是员工列表组件</h2>
  </div>
</template>

<script>
	//指定模块的默认输出对象,使用import '../views/StaffList' 时会获得该对象
	export default {
	  name:"StaffList"
	}
</script>

<style>
</style>
  • 组件StudentList.vue:
<template>
  <div class="container">
    	<h2>这是学生列表组件</h2>
  </div>
</template>

<script>
	//指定模块的默认输出对象,使用import '../views/StudentList' 时会获得该对象
	export default {
	  name:"StudentList"
	}
</script>

<style>
</style>
  • index.js:
import Vue from 'vue';
//导入路由管理器插件
import VueRouter from 'vue-router';
//导入StaffList.vue
import StaffList from '../views/StaffList';
//导入StudentList.vue
import StudentList from '../views/StudentList';
//使用路由管理器插件
Vue.use(VueRouter)
const routes = [//路由数组
	  { //单条路由
		  path:'/student', //指定访问哪个URL会显示该组件
		  name: 'StudentList',//路由名字
		  component: StudentList 
	  },//路由一,绑定key-value,实现访问/student会显示组件StudentList 
	  { 
		  path:'/staff', 
		  name: 'StaffList',//路由名字
		  component: StaffList
	  }//路由二,绑定key-value,实现访问/staff会显示组件StaffList
	 /*
	    每条路由记录为一个对象。
	        name:指定路由名字,用于命名路由
	        path:指定url路径,即访问哪个url时会显示component属性指定的组件
	        component:访问这条路由时要显示的组件
    */
]
const router = new VueRouter({//路由管理器,用来管理路由
  	  mode: 'history',//history模式下URL没有#,更加符合业务需要
  	  routes:routes,//设置该路由管理器负责管理的路由数组
  	  base: process.env.BASE_URL//base代表应用的基路径,process.env.BASE_URL是指从从环境进程中根据运行环境获取的api的base_url
})
export default router;//将路由管理对象作为index.js的默认导出对象,作用:如果import './router/index' 的话会获得该router对象
  • main.js:
//导入vue
import Vue from 'vue'
import App from './App.vue'

//导入我们创建的router,这个router来自index.js
import router from './router/index'
//使用router
Vue.use(router)
//创建Vue实例,并传入路由管理器对象
const app = new Vue({
 	  router: router,
 	  render: h => h(App)
}).$mount('#app')
  • 效果:
    首先进入App.vue界面,该界面有两个router-link和一个router-view
    在这里插入图片描述
    点击员工信息列表router-link,会跳转到对应URL,然后浏览器根据URL查找路由数组获得该URL对应的组件,渲染到router-view。注意此时虽然URL变了,但是布局还是App.vue界面的布局:两个router-link和一个router-view。
    在这里插入图片描述
    点击学生信息列表也是一样的效果,router-view显示对应URL的组件信息,而不是将整个页面都渲染成router-view对应的组件信息。

四、嵌套路由:

  • 多级路由用到了route的children属性,routes中的属性成为一级路由,一级路由中children属性中的路由称为二级路由,以此类推。
  • 注意:除一级路由中路径要写斜杠/ 二级路由和多级路由中的路径不写斜杠/。
  • 跳转多级路由时,to=“路由路径” 要写全!从一级路由开始写!(如: to=“/home/news”)
  • 可以给路由配置name属性,传递参数的时候会用到,添加name属性后跳转就不用写全路径,可以直接写路由的name (:to=“{name:‘news’}”)
routes:[
   	{
   		path:'/about',
   		component:About,
   	},
   	{
   		path:'/home',
   		component:Home,
   		children:[ //通过children配置子级路由
   			{    
                name:'news'
   				path:'news', //此处一定不要写:/news
   				component:News
   			},
   			{
                name:'message'
   				path:'message',//此处一定不要写:/message
   				component:Message,
                children: [
                     {        
                            name:'msg'
                            path: 'msgdata',
                            component: Msgdata,
   			        }
   		        ]
   	}
   ]

五、路由传参:

1.query传参:

URL格式:
/a/b?id=666&title=你好

路由路径传递数据:

	<!-- 方法一:跳转并携带query参数,to的字符串写法 -->
   <router-link :to="'/home/message/detail?id=666&title=你好' ">跳转1</router-link>
	
   <!-- 方法二:跳转并携带query参数,to的对象写法 -->
   <router-link 
   	:to="{
   		path:'/home/message/detail',
   		query:{
   		   id:666,
           title:'你好'
   		}
   	}"
   >跳转2</router-link>

   <router-view></router-view>

路由接收数据并包装,传给组件:

routes:[
   	{
   		path:'/about',
   		component:About,
   	},
   	{
   		path:'/home',
   		component:Home,
   		children:[ //通过children配置子级路由
   			{    
                name:'news'
   				path:'news', //此处一定不要写:/news
   				component:News
   			},
   			{
                name:'message'
   				path:'message',//此处一定不要写:/message
   				component:Message,
                children: [
                     {
                            path: 'msgdata',
                            component: Msgdata,
                        	//在这里使用$route.query接收一下传来的参数,然后包装一下再传给Msgdata组件
                            props($route){
                               return {id:$route.query.id,title:$route.query.title}
                            }     
   			         }
   		        ]
   	}
]

组件接收包装后的数据:

<template>
  <div>
    <h3>信息编号:{{ id }}</h3>
    <h3>信息标题:{{ title }}</h3>
    <!--也可以不使用路由包装,这里直接使用$route.query.id ,$route.query.title,不过可读性较差 -->
  </div>
</template>
 
<script>
export default {
  name: "Msgdata",
  props: ["id", "title"]//一定要记得使用props接收路由传来的数据
};
</script>
 
<style>
</style>

2. params传参:

  • 使用params传参时路由路径中需要配置占位符。

URL格式:
/a/b/666/你好 (其中’666’和’你好’是参数)

路由路径传递数据:

  <!-- 方法一:跳转并携带params参数,to的字符串写法 -->	
 <router-link :to=" `/home/news/shownews/${n.id}/${n.name}` ">
跳转1
 </router-link> 
  <!-- 方法二:跳转并携带params参数,to的对象写法 -->
<router-link
         :to="{
         //注意:用params传递参数时用到他的对象写法中不可使用 path:'路径',只能用name='路由name'
           name: 'shownews',
           params: {
             id: n.id,
             name: n.name,
           },
         }"
       >
跳转2
</router-link>

路由接收数据并包装,传给组件:

name: 'shownews',
// params 写法先在路径中占位
path: 'shownews/:id/:name',
component: ShowNews,
// props:true表示包装数据 props会接收所有params参数 以props的形式传递给ShowNews组件
props: true

组件接收包装后的数据:

<template>
  <ul>
    <li>编号{{ id }}</li>
    <li>姓名{{ name }}</li>
     <!--这里也可以直接使用$route.param.id ,$route.param.name,不过可读性较差 -->
  </ul>
</template>
 
<script>
export default {
  name: "ShowNews",
  props: ["id", "title"]//一定要记得使用props接收路由传来的数据
};
</script>

六、编程式路由导航:

  • 除了使用 router-link 创建 a 标签来定义导航链接,我们还可以借助 router 的实例方法,通过编写代码来实现。
  • 在 Vue 实例内部,可以通过 $router 访问路由实例。因此想要导航到不同的 URL可以,调用 this.$router.push方法。
声名式编程式
<router-link :to="a/b">router.push(a/b)
const userId = '123'
//不带参
this.$router.push({ path: '/home' })// -> /home
//1.params传参:
//方法一:字符串传参
this.$router.push({ path: `/user/${userId}` }) // -> /user/123
//方法二:对象传参
//注意,如果提供了path,params会被忽略,所以使用params对象传参时要用name属性而不是path
this.$router.push({ name: 'user', params: { userId }}) // -> /user/123
//2.query传参:
//方法一:字符串传参:
this.$router.push({ path: '/register?plan=private')// -> /register?plan=private
//方法二:对象传参:
this.$router.push({ path: '/register', query: { plan: 'private' }})// -> /register?plan=private

七、响应路由参数变化:

  • 当使用路由参数时,例如从 /user/foo 导航到 /user/bar(其中foo和bar都是参数),原来的组件实例会被复用。因为两个路由都渲染同个组件,比起销毁再创建,复用则显得更加高效。不过,这也意味着组件的生命周期钩子不会再被调用。
  • 复用组件时,想对路由参数的变化作出响应的话,你可以简单地 watch (监测变化) $route 对象:
  watch: {
    $route(to, from) {
      // 对路由变化作出响应...
    }
  }

八、路由守卫:

  • 路由守卫的作用 : 对路由进行权限管理,必须符合条件才能访问。

  • 路由守卫有三种: 全局守卫、独享守卫、组件内守卫。

1.全局守卫:

在所有的路由发生改变前都执行 使用路由守卫就不能直接暴露路由实例,需要接收一下

然后调用里面的beforeEach((to,from,next)=>{})

有三个参数to:去哪个路径,from:从哪个路径里来,next:是个函数调用的时候next()放行

// 配置在实例对象外 初始化时调用,每次发生路由变化前调用
 router.beforeEach((to,from,next)=>{
   	console.log('beforeEach',to,from)
   	if(to.meta.isAuth){ //判断当前路由是否需要进行权限控制
   		if(localStorage.getItem('school') === 'atguigu'){ //权限控制的具体规则
   			next() //放行
   		}else{
   			alert('暂无权限查看')
   			// next({name:'guanyu'})
   		}
   	}else{
   		next() //放行
   	}
   })
   
   //全局后置守卫:初始化时执行、每次路由切换后执行
   router.afterEach((to,from)=>{
   	console.log('afterEach',to,from)
   	if(to.meta.title){ 
   		document.title = to.meta.title //修改网页的title
   	}else{
   		document.title = 'vue_test'
   	}
   })

2.独享守卫:

放在需要进行权限设置的路由里面,参数语法和全局一样 当访问这个路径前才执行beforeEnter()

beforeEnter(to,from,next){
   	console.log('beforeEnter',to,from)
   	if(to.meta.isAuth){ //判断当前路由是否需要进行权限控制
   		if(localStorage.getItem('school') === 'atguigu'){
   			next()
   		}else{
   			alert('暂无权限查看')
   			// next({name:'guanyu'})
   		}
   	}else{
   		next()
   	}
   }

3.组件守卫:

放在组件里和methods,components同级别 。

必须是通过路由规则进入该组件才可以调用。
beforeRouteEnter(),beforeRouteLeave()。

   //进入守卫:通过路由规则,进入该组件时被调用
beforeRouteEnter (to, from, next) {
   },
   //离开守卫:通过路由规则,离开该组件时被调用
beforeRouteLeave (to, from, next) {
   }

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

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

相关文章

数字孪生技术有没有真正的实用价值?

作为一个数字孪生领域的技术公司负责人&#xff0c;我尽可能用比较直白的话来描述一下我对数字孪生行业以及数字孪生价值的理解。 纵观数字孪生相关的公司&#xff0c;主要有两个流派&#xff0c;一派是具有互联网基因的数字孪生创业公司&#xff0c;一派是在工业软件领域实力…

ConfigurableListableBeanFactory和BeanDefinitionRegistry关系

前言 &#xff1a;在查看springBoot源码的过程中&#xff0c;遇到了这个问题&#xff0c;上网查了一些资料&#xff0c;理解了一些&#xff0c;这里顺便把这个问题给记录一下。 在springBoot调用Refresh方法里面 &#xff0c;有一个叫invokeBeanFactoryPostProcessors的方法【…

HIve数仓新零售项目ODS层的构建

HIve数仓新零售项目 注&#xff1a;大家觉得博客好的话&#xff0c;别忘了点赞收藏呀&#xff0c;本人每周都会更新关于人工智能和大数据相关的内容&#xff0c;内容多为原创&#xff0c;Python Java Scala SQL 代码&#xff0c;CV NLP 推荐系统等&#xff0c;Spark Flink Kaf…

WindowsPE(二)空白区添加代码新增,扩大,合并节

空白区添加代码 在 PE 中插入一段调用 MessageBox 的代码。 获取MessageBox地址&#xff0c;构造ShellCode代码 利 OD 定位出 MessageBoxA 函数的地址为 0x77D507EA 。 构造 shellcode &#xff1a; unsigned char shellcode[] {0x6A, 0x00, // pus…

ORB-SLAM2 ---- Initializer::ReconstructF函数

目录 1.函数作用 2.函数解析 2.1 调用函数解析 2.2 Initializer::ReconstructF函数总体思路 2.2.1 代码 2.2.2 总体思路解析 2.2.3 根据基础矩阵和相机的内参数矩阵计算本质矩阵 2.2.4 从本质矩阵求解两个R解和两个t解&#xff0c;共四组解 2.2.5 分别验证求解的4种…

准备面试题【面试】

前言 写作于 2022-11-13 19:27:08 发布于 2022-11-20 16:34:44 准备 程序员囧辉 我要进大厂 面试阿里&#xff0c;HashMap 这一篇就够了 Java 基础高频面试题&#xff08;2022年最新版&#xff09; 问遍了身边的面试官朋友&#xff0c;我整理出这份 Java 集合高频面试题…

【mysql】mysql 数据备份与恢复使用详解

一、前言 对一个运行中的线上系统来说&#xff0c;定期对数据库进行备份是非常重要的&#xff0c;备份不仅可以确保数据的局部完整性&#xff0c;一定程度上也为数据安全性提供了保障&#xff0c;设想如果某种极端的场景下&#xff0c;比如磁盘损坏导致某个时间段数据丢失&…

什么是Spring,Spring的核心和设计思想你了解吗?

目录 1.初识Spring 1.1 什么是容器 1.2 什么是IoC 2.什么是IoC容器. 2.1 什么是DI 哈喽呀,你好呀,欢迎呀,快来看一下这篇宝藏博客吧~~~ 1.初识Spring Srping指的是Spring Framework(Spring 框架).我们经常会听见框架二字,其中java中最最主流的框架当属Spring.Spring是一…

SAP S4 FI后台详细配置教程- PART4 (科目及税费相关配置篇)

目录 1、总帐科目 1.1编辑科目表清单 1.2 科目表分配给公司代码 1.3 定义科目组 1.4 定义留存收益科目 2、销售/购置税 2.1 维护销售/购置税务代码税率 2.2 配置销项/销项税会计科目 大家好本篇是&#xff1a;SAP S4 FI后台详细配置教程- PART4 &#xff08;科目及税…

Fiddler的安装和使用

文章目录1、Fiddler的安装2、Fiddler的使用3、抓包工具的原理1、Fiddler的安装 官网链接&#xff1a;https://www.telerik.com/fiddler 进入官网首页 页面跳转后 2、Fiddler的使用 下载好后直接安装&#xff0c;安装后打开&#xff0c;它就会自动抓取HTTP包&#xff0c;在左…

[附源码]SSM计算机毕业设计-东湖社区志愿者管理平台JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

力扣113题引发的关于DFS和回溯的一点思考

最近刚学回溯和DFS&#xff0c;刷力扣遇到一道题&#xff08;113题&#xff09;&#xff0c;如下&#xff1a; 我们不细究回溯和DFS的区别联系。关于这道题的2种写法&#xff0c;我把第一种称为回溯。 class Solution {List<List<Integer>> res new LinkedList&l…

29.Nacos的简介与安装(springcloud)

1.Nacos 简介官网&#xff1a; https://nacos.io/zh-cn/Nacos 致力于发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集&#xff0c;帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。 Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是…

【Android Studio Gradle】发布aar到私有Artifactory仓库

1. 前言 在【Android Studio Gradle】使用Artifactory构建本地仓库中介绍了如何利用工具配置一个maven私有库&#xff0c;那么在开发library的时候为了方便难免会用到需要将该库发布到这个仓库的功能。经过测试和配置&#xff0c;确实在Artifactory仓库中也可以通过gradlew命令…

【MySQL基础】为什么大部分人选择使用MySQL数据库?

目录 一、为什么大部分人选择使用MySQL数据库&#xff1f; 二、MySQL简介 1.MySQL介绍 2.MySQL的特点 3. MySQL的版本 从用户的角度&#xff0c;针对不同的用户 从单纯的版本数字区分 &#x1f49f; 创作不易&#xff0c;不妨点赞&#x1f49a;评论❤️收藏&#x1f49…

我把皮小浪の的 蓝色妖姬系列做进了java窗口

— &#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 秩沅 原创 收录于专栏 unity实战入门 ⭐效果图如下 ⭐⭐涉及的相关类的包含关系图 ⭐# 视频入口&#xff1a;请点击 文章目录一…

比 O(nlog(n)) 做得更好——2.改变问题以及排序和填充数组

改变问题&#xff0c;以及对键进行排序和填充数组。 目录 【第1篇】比 O(nlog(n)) 做得更好——1.创造合适的条件 长按关注《Python学研大本营》&#xff0c;加入读者群&#xff0c;分享更多精彩 扫码关注《Python学研大本营》&#xff0c;加入读者群&#xff0c;分享更多精彩 …

【Redis-04】Redis两种持久化方式

Redis是基于内存的数据结构服务器&#xff0c;保存了大量的键值对数据&#xff0c;所以持久化到磁盘是非常必要的&#xff0c;Redis提供了两种持久化的方式&#xff0c;分别是RDB和AOF。下面我们看下这两种持久化方式的具体实现原理。 1.RDB持久化 首先&#xff0c;RDB持久化方…

【Spring(二)】java对象属性的配置(Bean的配置)

有关Spring的所有文章都收录于我的专栏&#xff1a;&#x1f449;Spring&#x1f448; 目录 一、前言 二、通过Setter方法配置Bean 三、通过构造器配置Bean   1. 通过属性名配置   2. 通过索引配置   3. 通过属性类型配置 四、通过p命名空间配置bean 五、引用/注入其他bean…

openEuler快速入门-openEuler系统安装openGauss数据库安装

文章目录前言一、安装openEuler系统安装二、运行虚拟机&#xff0c;配置三、安装openGauss数据库总结前言 openEuler&#xff1a;openEuler 是一款开源操作系统。当前 openEuler 内核源于 Linux&#xff0c;支持鲲鹏及其它多种处理器&#xff0c;能够充分释放计算芯片的潜能&a…