【Vue路由(router)进一步详解】

news2025/1/30 15:57:34

Vue路由(router)进一步详解

    • query属性
      • 具体实例代码如下:
    • params属性
      • 具体实例代码如下:
    • props属性
    • replace属性
    • 编程式路由导航
    • 路由缓存
      • 具体代码:
    • 总结

本篇文章主要针对已经掌握Vue路由(router)基础以及路由嵌套的用户群体,如果你是Vue路由初学者的话,不仿先去看看 【Vue路由(router)的基本使用】这篇文章

接上一篇文章理解Vue路由中常用的知识点

在实际开发过程中,我们可能不单单要实现简单的页面跳转动作,可能在页面跳转的同时,我们需要携带一些数据给对应的路由组件,也就是说,涉及路由的传参,那怎么实现路由传参呢,其实有三种方式可以使得携带参数至指定的路由组件,他们分别是queryparams以及在学组件时已经熟知的props


query属性

切换路由并传递参数用法

传递参数:

<!-- 方法一,字符串写法 -->
<router-link :to="/跳转路径/跳转路径?参数一='xxxx'&参数二='XXXXX'">跳转</router-link>

<!-- 方法二,对象写法 -->
<router-link
  :to="{
    path:'/路径/路径/XXX',
    query:{
      data1:'XXX',
      data2:'XXX',
      .....
    }
  }"
>>跳转</router-link>

值得注意的一个点是,在上述用法中,我们所传递的参数都是写死的参数,但开发中更多的情况是我们传递的参数可能是动态的数据,对象写法还是一样的,但是字符串写法又该如何实现呢?

如下:
尚硅谷Vue讲师张天禹介绍了ES6中字符串模板加上直接赋值的写法:

<router-link :to="`/home/messageA/detailA?id=${m.id}&title=${m.title}`">跳转</router-link>

路由组件中接收参数:

$router.query.XXX
$router.query.XXX
$router.query.XXX

具体实例代码如下:

本篇文章是在【Vue路由(router)的基本使用】的基础上写的,所以重复的,没有改动的代码我就不再展示,这里我们用TestA.vue组件举例,数据存储在TestA.vue中,但我希望把数据传递到它的子路由上,实现动态的数据展示

创建TestA.vue的子路由组件DataList.vue:

<template>
  <div>
      <ul>
          <!-- 采用插值语法就可以拿到父级路由中的数据 -->
          <li>{{$route.query.introduce}}</li>
      </ul>
  </div>
</template>

<script>
export default {
    name:'DataList'
}
</script>

<style>

</style>

src/router/index.js的变化:

//该文件用于创建整个应用的router
//首先,需要引用vue-router
import VueRouter from "vue-router";

//引入路由组件
import TestA from '../pages/TestA'
import TestB from '../pages/TestB'
// 引入二级路由组件
import TestBHzw from '../pages/TestBHzw'
import TestBHyrz from '../pages/TestBHyrz'

import DataList from '../pages/DataList'

//创建并暴露一个VueRouter
export default new VueRouter({
    routes:[
        //配置路由路径和路由组件
        {
            //这里的路径可自由定义,但是为了初学者好理解,我就采用和组件同样的命名,防止在写路径的时候搞混
            path:'/TestA',
            component:TestA,     //要跳转到的组件   
            children:[
                {
                    path:'DataList',
                    component:DataList
                }
            ]
        },
        {
            path:'/TestB',
            component:TestB,
            // 配置二级路由
            children:[
                {
                    path:'TestBHzw',     //重点注意,不要加 /
                    component:TestBHzw
                },
                {
                    path:'TestBHyrz',
                    component:TestBHyrz
                }
            ]
        }
    ]
})

TestA.vue:

<template>
  <div>
    <h4>著名动漫简介</h4>
    <ul>
      <li v-for="i in DataList" :key="i.id">
        <!-- 使用query参数传递动态参数 -->
        <router-link :to="{
          path:'/TestA/DataList',
          query:{
            introduce:i.introduce
          }
        }">{{i.name}}</router-link>
      </li>
    </ul>
    <router-view></router-view>
  </div>
</template>

<script>
export default {
    name:'TestA',
    data(){
      return{
        DataList:[
          {
            id:1,
            name:'《海贼王》',
            introduce:'《航海王》是日本漫画家尾田荣一郎作画的少年漫画作品,于1997年7月22日在集英社《周刊少年Jump》开始连载。改编的电视动画《航海王》于1999年10月20日起在富士电视台首播。'
          },
          {
            id:2,
            name:'《火影忍者》',
            introduce:'电视动画《火影忍者》改编自日本漫画家岸本齐史的同名漫画,2002年10月3日在东京电视台系列全6局、岐阜放送首播,共220话;第二季《火影忍者疾风传》于2007年2月15日-2017年3月23日在东京电视台播出,共500话;累计全720话。'
          },
          {
            id:3,
            name:'《斗破苍穹》',
            introduce:'《斗破苍穹》是一部由阅文集团旗下起点中文网作家天蚕土豆同名玄幻长篇经典小说改编的动画。该动画第一季已于2017年1月7日在腾讯视频上映,bilibili同步跟播,共十二集。'
          },
          {
            id:4,
            name:'《鬼灭之刃》',
            introduce:'《鬼灭之刃》是日本漫画家吾峠呼世晴所著的少年漫画,自2016年2月15日—2020年5月11日在集英社《周刊少年Jump》上连载。已完结。'
          }
        ]
      }
    }
}
</script>

<style scoped>
h4{
  text-align: center;
}
a{
  text-decoration: none;
}
.active:visited{
  color: brown;
}
</style>

其他组件是没有改动过的

效果图:
此时,我们处于一级路由,TestA.vue组件的子路由是没有展示的
在这里插入图片描述
当我们鼠标点击对应动漫列表时,就会出现动漫的简介,此时就完成了利用query参数传递数据。
在这里插入图片描述
在这里插入图片描述


params属性

params属性起到的作用和query差不多,都是用于传递和接收参数,只不过,它是在src/router/index.js中进行配置

{
        path:'/一级路径',
        component:XXX,
        children:[
            {
                path:'二级路径',
                component:XXX,
                children:[
                    name:'name',
                    path:'XXX/:name/:data',   //使用占位符声明,接收params参数,相当于说先占个位置,在路由组件中就可以按照位置进行参数传递
                    component:XXX
                ]
            },
        ]
    }

传递参数:

<!-- 方法一,字符串写法 -->
<router-link :to="XXX/XXX/XXX/参数一/参数二">跳转</router-link>

<!-- 方法二,对象写法 -->
<router-link
   :to="{
       name:'XXX',
       params:{
           参数一:'XXX',
           参数二:'XXX'
       }
   }"
>跳转</router-link>

需要强调的一个点是: 路由携带params参数时,若使用to的对象写法,则不能使用path配置项,必须使用name配置!

接收参数:

$router.params.XXX
$router.params.XXX

具体实例代码如下:

TestA.vue:

<template>
  <div>
    <h4>著名动漫简介</h4>
    <ul>
      <li v-for="i in DataList" :key="i.id">
        <!-- 使用params参数传递动态参数 注意:params传递参数必须配合name属性-->
        <router-link :to="{
          name:'DataName',
          params:{
            introduce:i.introduce
          }
        }">{{i.name}}</router-link>
      </li>
    </ul>
    <router-view></router-view>
  </div>
</template>

<script>
export default {
    name:'TestA',
    data(){
      return{
        DataList:[
          {
            id:1,
            name:'《海贼王》',
            introduce:'《航海王》是日本漫画家尾田荣一郎作画的少年漫画作品,于1997年7月22日在集英社《周刊少年Jump》开始连载。改编的电视动画《航海王》于1999年10月20日起在富士电视台首播。'
          },
          {
            id:2,
            name:'《火影忍者》',
            introduce:'电视动画《火影忍者》改编自日本漫画家岸本齐史的同名漫画,2002年10月3日在东京电视台系列全6局、岐阜放送首播,共220话;第二季《火影忍者疾风传》于2007年2月15日-2017年3月23日在东京电视台播出,共500话;累计全720话。'
          },
          {
            id:3,
            name:'《斗破苍穹》',
            introduce:'《斗破苍穹》是一部由阅文集团旗下起点中文网作家天蚕土豆同名玄幻长篇经典小说改编的动画。该动画第一季已于2017年1月7日在腾讯视频上映,bilibili同步跟播,共十二集。'
          },
          {
            id:4,
            name:'《鬼灭之刃》',
            introduce:'《鬼灭之刃》是日本漫画家吾峠呼世晴所著的少年漫画,自2016年2月15日—2020年5月11日在集英社《周刊少年Jump》上连载。已完结。'
          }
        ]
      }
    }
}
</script>

<style scoped>
h4{
  text-align: center;
}
a{
  text-decoration: none;
}
.active:visited{
  color: brown;
}
</style>

src/router/index.js:

//该文件用于创建整个应用的router
//首先,需要引用vue-router
import VueRouter from "vue-router";

//引入路由组件
import TestA from '../pages/TestA'
import TestB from '../pages/TestB'
// 引入二级路由组件
import TestBHzw from '../pages/TestBHzw'
import TestBHyrz from '../pages/TestBHyrz'

import DataList from '../pages/DataList'

//创建并暴露一个VueRouter
export default new VueRouter({
    routes:[
        //配置路由路径和路由组件
        {
            //这里的路径可自由定义,但是为了初学者好理解,我就采用和组件同样的命名,防止在写路径的时候搞混
            path:'/TestA',
            component:TestA,     //要跳转到的组件   
            children:[
                {
                    // 给二级路由起名字
                    name:'DataName',
                    path:'DataList/:introduce',     //起到占位作用
                    component:DataList
                }
            ]
        },
        {
            path:'/TestB',
            component:TestB,
            // 配置二级路由
            children:[
                {
                    path:'TestBHzw',     //重点注意,不要加 /
                    component:TestBHzw
                },
                {
                    path:'TestBHyrz',
                    component:TestBHyrz
                }
            ]
        }
    ]
})

DataList.vue:

<template>
  <div>
      <ul>
          <!-- 采用插值语法就可以拿到父级路由中的数据 -->
          <li>{{$route.params.introduce}}</li>
      </ul>
  </div>
</template>

<script>
export default {
    name:'DataList'
}
</script>

<style>

</style>

效果图
鼠标未点击之前:
在这里插入图片描述
鼠标点击之后
在这里插入图片描述

在这里插入图片描述


props属性

props属性的用法和params属性都差不多,都是要在src/router/index.js文件中配置,我就不过多展示例子了。

{
	name:'XXX',
	path:'XXXxxx',
	component:xxx,

	//第一种写法:props值为对象,该对象中所有的key-value的组合最终都会通过props传给路由组件
	// props:{a:900}

	//第二种写法:props值为布尔值,布尔值为true,则把路由收到的所有params参数通过props传给路由组件
	// props:true
	
	//第三种写法:props值为函数,该函数返回的对象中每一组key-value都会通过props传给路由组件
	props(route){
		return {
			id:route.query.id,
			name:route.query.name
		}
	}
}

replace属性

replace属性的作用是控制浏览器的操作历史记录的模式

浏览器的历史记录有两种写入方式:
push: 追加历史记录,即在前一条的记录上在新加一条浏览记录
replace: 覆盖历史记录,即在添加新记录的同时回收原有记录,替换掉原有记录

浏览器默认默认状态下是为push模式

开启replace模式:

<!-- 只需要在标签内加上replace属性即可实现 -->
<router-link replace .......>跳转</router-link>

编程式路由导航

在实际生活中,我们在浏览某些页面的时候会看见一些比如 下一步返回 之类的按钮,而这些按钮并不是导航原本具有的,但却实现了页面跳转的功能,其实在Vue中,也给我们准备了两个函数,只需调用这两个函数,即可实现页面的前进和后退,无需借助导航来切换,也简化了我们开发中的代码操作

this.$router.back()    //实现的功能就是后退
this.$router.forward()    //实现的功能就是前进

这个理解起来比较简单,就是记录你的浏览记录,假若是刚进入网站,在第一个页面,点击前进肯定是没反应的,所以,编程式路由导航起到的就是辅助性作用
在这里插入图片描述


路由缓存

路由组件中的缓存也是实际开发中比较常用的一个技巧,体现在用户在一个页面输入表单信息,当切换出这个页面再次返回时,组件还能保留用户输入的内容,让不展示的组件保持挂载,不需要再次挂载,这样的好处就是增强了页面与用户之间的交互性

其实只需要在<router-link>标签外再包裹上一层<keep-alive>标签即可

<!-- 这里的include属性是指指定的组件缓存,如果不加这个属性,也就意味着所有路由组件都缓存 -->
<keep-alive include="News"> 
   <router-view></router-view>
</keep-alive> 

具体代码:

改动部分:

TestB.vue:

<template>
  <div>
    <h4>我是内容二</h4>
    <!-- 多级路由 -->
    <div class="box">
      <!-- 此处路径一定要写完整路径 -->
      <!-- <router-link to="/TestB/TestBHzw" active-class="active">点击查看《海贼王的简介》</router-link>&nbsp;&nbsp;&nbsp;
      <router-link to="/TestB/TestBHyrz" active-class="active">点击查看《火影忍者的简介》</router-link> -->
      
      <router-link to="/TestB/TestBHyrz" active-class="active">点击查看《火影忍者的简介》</router-link>&nbsp;&nbsp;&nbsp;
      <!-- 路由缓存 -->
      <router-link to="/TestB/TestBHzw">填写信息</router-link>
      <hr>
      <keep-alive include="TestBHzw">
        <router-view></router-view>
      </keep-alive>
      
    </div>
  </div>
</template>

<script>
export default {
    name:'TestB',
}
</script>

<style scoped>
h4{
  text-align: center;
}
.box{
  text-align: center;
}
a{
  text-decoration: none;
}
.active:visited{
  color: brown;
}
</style>

TestBHzw.vue:

<template>
  <div>
    姓名:<input type="text"><br>
    性别:<input type="text"><br>
    年龄:<input type="text">
  </div>
</template>

<script>
export default {
    name:'TestBHzw'
}
</script>

<style>

</style>

值得注意的是:
如果我没有加<keep-alive>标签,那么当我信息填到一半切换路由,再次切换回来时,之前填的将不会保留
在这里插入图片描述

加上标签后,即便我来回切换,之前填的信息依然保留,可以继续往下填

但是,如果不限定include属性,则就是代表在此路由下的所有路由组件都会保持挂载,这样不利于提高性能,也没那个必要。用在该用的组件上就可以了
在这里插入图片描述


总结

以上知识点就是我对**Vue-Router(路由)**的一个更深一层的学习和理解,虽然学习的不算太深,但我相信至少对于初学者而言,是一篇不错的学习笔记,希望在我自己提升的同时,也能帮助一些刚接触Vue的同学,到这里,我自己对Vue路由的学习算是告一段落啦,等自己把基础的学会了,在往更深一层学习吧

在这里插入图片描述

如果觉得还不错的话,记得点赞收藏哟!!!
别忘了给我关注呀!!!

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

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

相关文章

Vue业务组件封装(二)Form表单

前言 这个系列主要是分享自己在工作中常用到的业务组件&#xff0c;以及如何对这些组件进行有效的封装和封装的思路。注&#xff1a;都是基于element ui进行二次封装。 封装组件的基本方法就是通过props和emit进行父子组件的传值和通信。利用插槽、组件等增加组件的可扩展性和复…

JavaScript实现留言板

目录 1.案例说明&#xff1a; 2.html部分 3.css部分 4.js代码 5.全部代码 6.效果图&#xff1a; 1.案例说明&#xff1a; 利用JavaScript、css以及html制作一个简易的留言板 要求在页面文本框中输入一些文字之后&#xff0c;点击“提交”按钮&#xff0c;就可以让输入的…

React+Mobx|综合项目实践(附项目源码、地址)

欢迎来到我的博客 📔博主是一名大学在读本科生,主要学习方向是前端。 🍭目前已经更新了【Vue】、【React–从基础到实战】、【TypeScript】等等系列专栏 🛠目前正在学习的是🔥 R e a c t 框架 React框架 Reac

【学姐面试宝典】前端基础篇Ⅳ(JavaScript)

前言 博主主页&#x1f449;&#x1f3fb;蜡笔雏田学代码 专栏链接&#x1f449;&#x1f3fb;【前端面试专栏】 今天继续学习前端面试题相关的知识&#xff01; 感兴趣的小伙伴一起来看看吧~&#x1f91e; 文章目录webpack 的作用什么是按需加载如何理解前端模块化讲讲 JS 的语…

npm i 报错及解决方案

目录报错案例1报错案例2报错案例3报错案例4报错案例5报错案例1 npm ERR! Cannot read properties of null (reading pickAlgorithm)解决方案&#xff1a;清理缓存后再次安装 npm cache clear --force报错案例2 npm ERR! gyp info it worked if it ends with ok ... npm ERR!…

前端使用lottie-web,使用AE导出的JSON动画贴心教程

Lottie简介 官方介绍&#xff1a;Lottie是一个库&#xff0c;可以解析使用AE制作的动画&#xff08;需要用bodymovie导出为json格式&#xff09;,支持web、ios、android、flutter和react native。 在web端&#xff0c;lottie-web库可以解析导出的动画json文件&#xff0c;并将其…

【博主推荐】html好看的图片轮播多种风格(源码)

html好看的图片轮播多种风格所有轮播图动态效果展示1.普通自带按钮切换轮播图1.1 效果展示1.2 源码2.自动切换图片2.1 效果展示2.2 源码3.鼠标拖动切换图片3.1 效果展示4.数字按钮拖动切换图片4.1 效果展示5.图片带缩略图5.1 效果展示6.上下拖动切换图片6.1 效果展示7. 3D切换图…

X-Frame-Options简介

最近安全检查&#xff0c;发现没有保障和避免自己的网页嵌入到别人的站点里面&#xff0c;于是需要设置X-Frame-Options增加安全性。 网上查了查资料&#xff0c;这里记录一下。 可以使用下面工具进行验证&#xff1a;Clickjacking Tool | Test | UI Redressing 1、X-Frame-Op…

3.js中判断数组中是否存在某个对象/值,判断数组里的对象是否存在某个值 的五种方法 及应用场景|判断数组里有没有某对象,有不添加,没有则添加到数组

3.js中判断数组中是否存在某个对象/值&#xff0c;判断数组里的对象是否存在某个值 的五种方法 及应用场景 一、当数组中的数据是简单类型时&#xff1a; 应用js中的indexof方法&#xff1a;存在则返回当前项索引&#xff0c;不存在则返回 -1。 var arr[1,2,3,4]var str2// …

ECharts设置双x轴

下面给大家分享一下ECharts的几种功能&#xff0c;循序渐进地实现一个复杂的曲线图。 V1.0&#xff1a; 代码&#xff1a; let option {title: { text: V1.0 },legend: { data:[销量] },// x轴的数据xAxis: {data: ["王","胡歌","曾小贤",&q…

Vue3使用axios的配置教程详解

1.安装 npm install --save axios vue-axios2.在src根目录创建service文件夹。然后创建axios.js 2.1在axios.js添加拦截器,请求拦截:initAxios.interceptors.request;响应拦截:initAxios.interceptors.response import axios from "axios";const initAxios axios.…

用idea创建vue项目

目录 一、安装node.js &#xff08;1&#xff09;下载安装包 &#xff08;2&#xff09;测试node.js是否安装成功 &#xff08;3&#xff09;安装vue和全局vue-cli 二、idea安装vue.js插件 三、创建vue项目 四、修改配置文件 五、配置idea运行的环境 一、安装node.js …

ERROR: npm v9.4.1 is known not to run on Node.js v8.13.0.

前面全是废话&#xff0c;大家可以直接看序号8下面的nvm的命令以及序号11之后的问题解决&#xff0c;希望能帮助到你们&#xff01;是个什么问题呢&#xff1f;昨天领导给了个前后端分离的项目&#xff0c;让不才我搭建一下环境&#xff0c;我兴高采烈的拿着项目搭建手册按照文…

微信小程序开发 app.json全局配置

JSON 是一种数据格式&#xff0c;在实际开发中&#xff0c;JSON 总是以配置文件的形式出现。app.json 是当前小程序的全局配置&#xff0c;可以通过app.json对小程序项目进行设置所有页面路径、窗口外观、界面表现、底部 tab 等。{"pages": ["pages/index/index…

vue中实现文件批量打包压缩下载(以及下载跨域问题分析)

上次做了一个选择多个数据生成多个二维码并下载&#xff0c;当时项目催的紧&#xff0c;就简单写了个循环生成二维码下载&#xff0c;一次性会下载很多文件&#xff0c;特别难整理&#xff1b; 刚好这次项目又遇到类似这种功能&#xff0c;需要一次性批量下载多个文件&#xf…

浅谈uniapp的flex布局

文章目录1 flex布局1.1 flex-direction1.2 flex-wrap1.3 justify-content1.4 align-items1.5 align-content属性1.6 其他项目属性1.6.1 order属性1.6.2 flex-grow属性1.6.3 flex-shrink属性1.6.4 flex属性1 flex布局 ​ flex是Flexible Box的缩写&#xff0c;意为”弹性布局”…

TypeError: this.$message is not a function报错情况解决

在最近负责的一个前端项目中&#xff0c;使用this.$message报错了&#xff0c;之前也没注意&#xff0c;然后这次抽空看了一下问题 报错原因是因为我用了这种提示写法&#xff1a; 首先&#xff0c;我最开始是用基础写法&#xff1a; 但是这种写法有个弊端&#xff0c;就是如…

【JS 构造|原型|原型链|继承(圣杯模式)|ES6类语法】上篇

⌚️⌚️⌚️个人格言&#xff1a;时间是亳不留情的&#xff0c;它真使人在自己制造的镜子里照见自己的真相! &#x1f4d6;Git专栏&#xff1a;&#x1f4d1;Git篇&#x1f525;&#x1f525;&#x1f525; &#x1f4d6;JavaScript专栏&#xff1a;&#x1f4d1;js实用技巧篇…

腾讯地图api使用——地图选点自动定位到当前位置

WebService API | 腾讯位置服务 用户在使用腾讯地图api时&#xff0c;需先申请腾讯位置服务API Key&#xff0c;该key在调用时用于唯一标识开发者身份。 1.自动获取当前位置 引入以下js文件 https://mapapi.qq.com/web/mapComponents/geoLocation/v/geolocation.min.js //获…

FAST_LIO_SAM 融入后端优化的FASTLIO SLAM 系统 前端:FAST_LIO2 后端:LIO_SAM

FAST_LIO_SAM Front_end : fastlio2 Back_end : lio_sam Videos : FAST-LIO-SAM Bilibili_link Source code : FAST_LIO_SAM Related worked 1.FAST-LIO2为紧耦合的lio slam系统&#xff0c;因其缺乏前端&#xff0c;所以缺少全局一致性&#xff0c;参考lio_sam的后端部分&…