Vue——【路由】

一、什么是路由

1、VueRouter的作用

        VueRouter是Vue.js官方提供的路由管理器,用于实现单页面应用中的路由跳转功能。通过VueRouter,我们可以声明式地定义页面之间的导航关系,然后根据这些定义的规则,VueRouter会监听浏览器的URL变化,并且根据定义的规则匹配到对应的组件进行渲染。同时,VueRouter还支持路由参数、动态路由、嵌套路由等功能,能够满足复杂的路由需求。通过使用VueRouter,我们可以实现页面的切换、前进、后退,还可以实现动态加载组件,提高应用的性能和用户体验。

2、VueRouter的基本概念

        路由表示一个映射关系,即 URL 路径到组件的映射。在 VueRouter 中,一个路由对象通常包含两个主要部分:path(路径)和 component(组件)。

二、Vue路由的主要特点包括:

        1. 嵌套路由:可以根据页面的层次结构定义嵌套的路由规则,方便管理复杂的页面布局和导航。

        2. 动态路由:可以定义带有参数的路由规则,根据不同的参数来展示不同的页面内容。

        3. 路由懒加载:可以按需加载页面组件,提高应用程序的性能和加载速度。

        4. 导航守卫:可以在路由跳转前后执行一些逻辑操作,比如检查用户是否登录等。

        5. 编程式导航:可以通过编写代码动态地进行页面导航,而不是通过用户的手动点击链接。

三、VueRouter的基本用法

1、创建路由实例

创建路由实例大概有以下几个步骤:

  1.1安装VueRouter

npm install vue-router  
或者  
yarn add vue-router

1.2在index.js中引入vue和vueRouter

import Vue from "vue";
import VueRouter from "vue-router";

1.3在index.js中通知vue使用Router 

Vue.use(VueRouter);

1.4定义路由

        每个路由应该映射一个路径到一个组件。这些路由被定义在一个数组内,数组的每个元素都是一个路由记录(route record)。

const routes = [  {  path: '/',  name: 'Home',  component: () => import('@/components/Home.vue') // 懒加载组件  },  {  path: '/about',  name: 'About',  // component: About, // 如果不是懒加载,可以直接这样引入  component: () => import('@/components/About.vue') // 懒加载组件  }  // 定义更多的路由...  
];

1.5创建路由实例

const router = new Router({  mode: 'history', // 使用HTML5 History模式  base: process.env.BASE_URL, // 基本路径,从环境变量中获取  routes // 简写,相当于 routes: routes  
});

1.6导出路由实例

export default router;

1.7在Vue实例中使用路由实例

在你的Vue应用入口文件(如src/main.js)中,引入并使用导出的路由实例。

import Vue from 'vue';  
import App from './App.vue';  
import router from './router'; // 引入路由实例  new Vue({  router, // 将路由实例注入到Vue实例中  render: h => h(App),  
}).$mount('#app');

2、定义路由映射的基本步骤

2.1引入组件

        首先,你需要引入你想要通过路由访问的Vue组件。

// 引入组件  
import Home from '@/components/Home.vue';  
import About from '@/components/About.vue';  

2.2定义路由

        然后,创建一个路由数组,并在其中定义你的路由。每个路由都是一个对象,它至少包含pathcomponent属性。

// 定义路由  
// 每个路由应该映射一个路径到一个组件  
const routes = [  {  path: '/',  name: 'Home',  component: Home  },  {  path: '/about',  name: 'About',  // 可以使用异步组件来优化加载时间  component: () => import('@/components/About.vue')  }  

2.3创建路由实例

        使用Vue Router的构造函数new Router(),并传入一个包含routes属性的配置对象来创建路由实例。routes属性的值就是你之前定义的路由数组。

2.4导出路由实例

        最后,将路由实例导出,以便在你的Vue应用中使用它。

3、将路由实例挂载到Vue实例上

 Vue CLI项目中的main.js示例  :


import Vue from 'vue';  
import App from './App.vue';  
import router from './router';  
  
Vue.config.productionTip = false;  
  
new Vue({  
  router, // 将路由实例传递给Vue实例  
  render: h => h(App) // 渲染App组件  
  // $mount('#app') 这一行在Vue CLI项目中是省略的  
});  

4、路由链接和路由视图的使用 

        路由链接(通常使用<router-link>组件)和路由视图(<router-view>组件)是Vue Router中两个非常核心的组件,它们分别用于导航和渲染页面内容。

4.1路由链接(<router-link>) 

  <router-link>是Vue Router提供的一个组件,用于创建导航链接。当用户点击这些链接时,它们会触发Vue Router的导航逻辑,而不是重新加载页面。<router-link>组件会渲染成标准的<a>标签,但是你可以通过tag属性来改变它渲染成的标签类型(比如<li><span>等)

<router-link to="/">Home</router-link>  
<router-link :to="{ name: 'about' }">About</router-link>

        在上面的例子中,第一个<router-link>使用了字符串来指定路径(/),而第二个则使用了对象语法,其中name属性指定了路由的名称(这要求你在路由配置中为每个路由指定一个唯一的name)。 

注意:tag属性的使用:

<router-link to="/foo" tag="li">Foo</router-link>

 4.2路由视图(<router-view>

  <router-view>是Vue Router的另一个组件,它用于渲染匹配到的路由组件。你可以把它想象成一个占位符,Vue Router会根据当前的路由路径来决定渲染哪个组件到这个占位符的位置,也就是你需要让目标组件在哪里展示,就将这个路由视图添加到哪里。

<template>  <div id="app">  <header>  <router-link to="/">Home</router-link>  <router-link to="/about">About</router-link>  </header>  <main>  <!-- 路由视图,用于渲染匹配到的组件 -->  <router-view></router-view>  </main>  </div>  
</template>

        在上面的例子中,当用户点击<router-link>导航链接时,Vue Router会更新URL并查找匹配的路由。一旦找到匹配的路由,它就会将对应的组件渲染到<router-view>所在的位置。

4.3小结

  • <router-link>用于创建导航链接,用户点击后会触发Vue Router的导航逻辑。
  • <router-view>是路由组件的占位符,Vue Router会根据当前路由渲染相应的组件到这个位置。

四、路由参数和动态路由

1、路由参数

        Vue路由参数是Vue Router中用于在路由跳转时传递数据的一种方式。这些参数可以是查询参数(query)或动态路由参数(params),它们允许在路由的URL中携带额外的信息,并在目标组件中访问这些信息。

1.1 查询参数(Query Parameters)

        查询参数通过URL的查询字符串(即URL中?后面的部分)传递。它们类似于HTTP GET请求中的查询参数,可以在URL中直接看到。

1.1.1传递查询参数

<router-link>组件中,可以通过to属性的对象形式传递查询参数。

<router-link :to="{ path: '/user', query: { id: 123, name: 'John' }}">User</router-link>
 1.1.2接收查询参数

        可以使用this.$router.query来接收查询参数

export default {  mounted() {  console.log(this.$route.query.id); // 输出: 123  console.log(this.$route.query.name); // 输出: John  }  
}

1.2. 动态路由参数(Dynamic Route Parameters)

动态路由参数通过URL中的动态片段(即路径中的:参数名部分)传递。它们通常用于构建具有不同参数的URL,而不是将所有信息都放在查询字符串中。

         1.2.1定义动态路由
const routes = [  { path: '/user/:id', component: User }  
];
        1.2.2传递动态路由参数

        在<router-link>组件中,可以直接在to属性的路径中指定动态路由参数的值。

<router-link :to="'/user/' + userId">User</router-link>
        1.2.3接收动态路由参数

        在目标组件中,可以通过$route.params对象访问这些动态路由参数.但在大多数情况下,对于直接定义的动态路由参数,我们直接使用$route.params即可。然而,对于命名路由和子路由中的params参数,它们实际上是通过props属性传递给子组件的,而不是直接通过$route.params访问。

2、动态路由

        把匹配到的所有路由,全部映射到同一个组件

        2.1、动态路由

        使用路由表配置传递参数

        使用动态路由,首先需要在index.js中定义配置动态路由参数

                path字段中配置动态路径参数,以冒号开头

{path: '/detail/:id',component: () => import('@/components/listchild.vue')},

这里的“ component: () => import('@/components/listchild.vue')”采用按需引入的方式

         在路由链接处使用:to的动态绑定形式在<router-link>中将参数绑定,当路由被激活使用时,将对应的参数传递到目标组件

<router-link :to='"/detail/"+item.id'>路由链接</router-link>

 在目标组件中可以使用"console.log(this.$route.params.id)"打印出对应传递的参数

        2.2动态路由的传参方式

        动态路由的传参有两种,一种是params传参,一种是query传参,接下来我们用一个例子来仔细探讨以下这两种方式

首先我们先创建一个商品展示的组件命名为list.vue,我们使用这个组件展示商品,再创建一个组件命名为listchild.vue,这个组件我们用来展示商品详细信息,之后的操作则是将所有的商品路由映射到listchild组件上实现动态路由传参

2.2.1params传参 

 list.vue结构:

<template><div class="list-content"><ul class="list"><li class="item" v-for="item in proList" :key="item.id"><!-- 通过params传递参数 --><router-link :to='{name:"detail" , params:{id:item.id}}'><img :src="item.img"><span>{{ item.title }}---{{ item.price }}</span></router-link></li></ul></div>
</template>

         在list.vue中使用:to以对象方式动态链接路由

index.js结构

 //通过params传递参数{path: '/detail/:id',name: 'detail',//命名路由component: () => import('@/components/listchild.vue')},

使用命名路由识别定义的路由,传递参数

注意:

在路由表中的目标路由的path路径中如果没有配置id,当我们刷新详情页面的时候,传递的参数会丢失,因此我们需要在使用的时候在路由表的目标路径中的path字段添加:id

 具体参数是否传递,我们可以在目标组件中使用console.log(this.$route.params.id)来接收打印查看,具体代码实现:

export default{created(){console.log(this.$route.params.id)}
}
</script>
2.2.2query传参

index.js

  // query传参{path: '/detail',name: 'detail',//命名路由component: () => import('@/components/listchild.vue')},

list.vue

  <!-- query传递参数 --><router-link :to='{path:"/detail" , query:{id:item.id}}'><img :src="item.img"><span>{{ item.title }}---{{ item.price }}</span></router-link>

 同样的,参数是否传递需要使用console.log(this.$route.query.id)

<script >
export default{
created(){console.log(this.$route.query.id)
}
}
</script>

2.3小结【params和query的区别】

1)params只能配合name使用,否则参数会丢失,解决参数丢失的方法:在路由表中的path中配置动态id即可,query配合path和name都可以使用

2)params在地址栏中不显示参数信息,当然不显示的前提是没有在path中配置动态id,query显示传递的参数信息

3)接收参数的方式不同:params使用this.$route.params接收,query使用this.$route.query接收

 2.4$route和$router的区别

$route:每个组件的$route是不同的,包含的是当前路由的相关配置信息

 $router是整个应用的路由配置信息的集合,整个应用是由一个

五、props解耦

在Vue中,props是父组件向子组件传递数据的一种方式。有时候,直接在子组件中使用this.$props.someProp来访问这些属性可能会让模板或计算属性变得冗长且难以阅读。为了简化这个过程,Vue提供了一种称为“props解耦”(props destructuring)的技术,它允许你将props解构到组件的局部作用域中。

使用props解耦,你可以直接在组件的方法、计算属性或模板中使用props的值,而不需要每次都通过this.$props来访问它们。 

接下来我们来看三种模式【布尔模式 / 对象模式 / 函数模式

1、布尔模式

在路由配置表中设置props属性为true,此时将会默认将$route.params数据传给组件,组件需要通过自身的props属性取出params中的属性,以props的形式传递给目标组件

 路由表配置:

{path: '/detail/:id',name: 'detail',//命名路由props: true,component: () => import('@/components/listchild.vue')},

路由链接:

 <router-link :to='{name:"detail" , params:{id:item.id}}'><img :src="item.img"><span>{{ item.title }}---{{ item.price }}</span></router-link>

 目标组件:

 props:['id'],

 使用props接收,可以使用插值表达式释放参数的值

注意:props如果是true时只能和params配合使用,query无法完成传递

2、对象模式

如果props是一个对象,其下所有属性均会被传入组件,需要注意的是当前props必须是静态的【固定的信息】

路由表配置:

{path: '/detail/:id',name: 'detail',//命名路由props: {id: 1,username: '张三'},component: () => import('@/components/listchild.vue')},

路由链接:

 <router-link :to='{name:"detail" , params:{id:item.id}}'><img :src="item.img"><span>{{ item.title }}---{{ item.price }}</span></router-link>

目标组件接收:

props:['id','username'],

注意,只能传递静态数据 

3、函数模式

props也可以是一个函数的返回值,

路由配置

//函数模式{path: '/detail/:id?/:title?',name: 'detail',//命名路由props(route) {return {id: route.params.id,title: route.params.title}},component: () => import('@/components/listchild.vue')},

路由链接

<router-link :to='{name:"detail" , params:{id:item.id,title:item.title}}'><img :src="item.img"><span>{{ item.title }}---{{ item.price }}</span></router-link>

目标组件

props:['id','title'],

六、结语

        今天的分享就到这里了,如果您觉得这篇文章还不错,请点赞、分享给更多的朋友吧!同时,也欢迎关注我的博客,获取更多精彩内容。

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

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

相关文章

使用 OpenCV 进行视频中的行人检测

在计算机视觉领域&#xff0c;行人检测是一个重要的研究方向&#xff0c;它在视频监控、自动驾驶、人机交互等领域都有着广泛的应用。本文将介绍如何使用 OpenCV 库来实现视频中的行人检测。 环境准备 首先&#xff0c;我们需要安装 OpenCV 库。可以通过以下命令来安装&#…

javaEE初阶——多线程(1)

文章目录 一些背景知识操作系统&#xff08;OS&#xff09;&#xff08;计算机的大管家&#xff09;操作系统的基本概念&#xff1a;市面上常见的操作操作系统&#xff1a; 关于前端与后端的介绍&#xff1a;&#xff08;针对服务的体系架构&#xff09;计算机是如何工作的&…

Apple Vision Pro开发003-PolySpatial2.0新建项目

unity6.0下载链接:Unity 实时开发平台 | 3D、2D、VR 和 AR 引擎 一、新建项目 二、导入开发包 com.unity.polyspatial.visionos 输入版本号 2.0.4 com.unity.polyspatial&#xff08;单独导入&#xff09;&#xff0c;或者直接安装 三、对应设置 其他的操作与之前的版本相同…

学习threejs,使用设置normalMap法向量贴图创建更加细致的凹凸和褶皱

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.MeshPhongMaterial高…

Python办公自动化案例:将演示文稿批量导出为图片和PDF文件

案例:将演示文稿批量导出为图片和PDF文件 准备资料:准备好PPT,并起好名称,放在同一目录下。 批量的将ppt,pptx转换为pdf和图片,代码如下: import comtypes.client import osdef init_powerpoint():powerp

数据结构 ——— 直接选择排序算法的实现

目录 直接选择排序算法的思想 优化直接选择排序算法的思想 代码实现&#xff08;默认升序&#xff09; 直接选择排序算法的思想 直接选择排序算法的思想类似与直接插入排序 区别在于从大到小选择最小的元素或者最大的元素直接放在元素应该停留的位置每次从待排序的元素中选…

linux从0到1——shell编程9

声明&#xff01; 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&a…

selinux及防火墙

selinux说明 SELinux 是 Security-Enhanced Linux 的缩写&#xff0c;意思是安全强化的 linux 。 SELinux 主要由美国国家安全局&#xff08; NSA &#xff09;开发&#xff0c;当初开发的目的是为了避免资源的误用。 httpd进程标签&#xff08;/usr/share/nginx/html &#…

前端:JavaScript (学习笔记)【2】

目录 一&#xff0c;数组的使用 1&#xff0c;数组的创建 [ ] 2&#xff0c;数组的元素和长度 3&#xff0c;数组的遍历方式 4&#xff0c;数组的常用方法 二&#xff0c;JavaScript中的对象 1&#xff0c;常用对象 &#xff08;1&#xff09;String和java中的Stri…

QML学习 —— 28、3种等待指示控件(附源码)

效果如下 说明 BusyIndicator应用于指示在加载内容或UI被阻止等待资源可用时的活动。BusyIndicator类似于一个不确定的ProgressBar。两者都可以用来指示背景活动。主要区别在于视觉效果,ProgressBar还可以显示具体的进度(当可以确定时)。由于视觉差异,繁忙指示器和不确定的…

Java 基于SpringBoot+Vue的家政服务管理平台

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

DataGear 5.2.0 发布,数据可视化分析平台

DataGear 企业版 1.3.0 已发布&#xff0c;欢迎体验&#xff01; http://datagear.tech/pro/ DataGear 5.2.0 发布&#xff0c;图表插件支持定义依赖库、严重 BUG 修复、功能改进、安全增强&#xff0c;具体更新内容如下&#xff1a; 重构&#xff1a;各模块管理功能访问路径…

nature communications论文 解读

题目《Transfer learning with graph neural networks for improved molecular property prediction in the multi-fidelity setting》 这篇文章主要讨论了如何在多保真数据环境&#xff08;multi-fidelity setting&#xff09;下&#xff0c;利用图神经网络&#xff08;GNNs&…

Flutter:SlideTransition位移动画,Interval动画延迟

配置vsync&#xff0c;需要实现一下with SingleTickerProviderStateMixinclass _MyHomePageState extends State<MyHomePage> with SingleTickerProviderStateMixin{// 定义 AnimationControllerlate AnimationController _controller;overridevoid initState() {super.…

svn 崩溃、 cleanup失败 怎么办

在使用svn的过程中&#xff0c;可能出现整个svn崩溃&#xff0c; 例如cleanup 失败的情况&#xff0c;类似于 这时可以下载本贴资源文件并解压。 或者直接访问网站 SQLite Download Page 进行下载 解压后得到 sqlite3.exe 放到发生问题的svn根目录的.svn路径下 右键呼出pow…

GPT系列文章

GPT系列文章 GPT1 GPT1是由OpenAI公司发表在2018年要早于我们之前介绍的所熟知的BERT系列文章。总结&#xff1a;GPT 是一种半监督学习&#xff0c;采用两阶段任务模型&#xff0c;通过使用无监督的 Pre-training 和有监督的 Fine-tuning 来实现强大的自然语言理解。在 Pre-t…

Linux线程(Linux和Windows的线程区别、Linux的线程函数、互斥、同步)

Linux线程&#xff08;Linux和Windows的线程区别、Linux的线程函数、互斥、同步&#xff09; 1. 线程介绍 线程的概念&#xff1a; 线程是 CPU 调度的基本单位。它被包含在进程之中&#xff0c;是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流&#xff0…

Large Spatial Model:End-to-end Unposed Images to Semantic 3D 论文解读

目录 一、概述 二、相关工作 1、SfM和可微神经表示 2、端到端的Image-to-3D 三、LSM 1、密集几何预测 2、2D信息特征提取 3、点特征融合 4、可微渲染 5、损失函数 四、实验 一、概述 该论文提出一种大型空间模型&#xff08;Larget Spatial Model,LSM&#xff09;…

Leetcode207. 课程表(HOT100)

链接 题解&#xff1a;先统计入度为0的点&#xff0c;如果一个节点入度为0&#xff0c;说明没有课程指向它&#xff0c;那么你就可以学习它了。反之说明还有先修课。 注意&#xff1a;图存在拓扑排序等价于图不存在环。其实可以想出&#xff1a;如果是一个环&#xff0c;那么…

JavaScript将至

JS是什么&#xff1f; 是一种运行在客户端&#xff08;浏览器&#xff09;的编程语言&#xff0c;实现人机交互效果 作用捏&#xff1f; 网页特效 (监听用户的一些行为让网页作出对应的反馈) 表单验证 (针对表单数据的合法性进行判断) 数据交互 (获取后台的数据, 渲染到前…