vue-router 路由传参方式/缓存路由/路由跳转

article/2025/11/3 23:08:16

基础

前端路由

用来开发 SPA(单页面应用)

单页面应用

  • 整个应用只有一个完整页面,页面变化都是在这一个页面更新的
  • 点击链接不会刷新整个页面,会局部更新,也会更新浏览历史(地址)
  • 点击链接也不会发送请求,自己写 ajax 代码发送请求

前端路由的原理

  • 点击链接不会刷新整个页面 --> 给 a 标签绑定点击事件,阻止其默认行为
  • 会更新浏览历史(地址) --> 调用 history.push(path),就可以更新了
  • 会局部更新 --> 内部会监听浏览历史的变化(history.listen(listener)),一旦发生变化就会遍历路由的所有配置,看当前路径(浏览地址)是否匹配上路由路径(path),匹配上就加载 component

vue-router 提供组件

  • <router-link> 用来路由链接导航
  • <router-view> 用来显示当前路由组件

$route$router

$route

route用来获取路由参数(params/query)和路径(path)

$router

用来编程式导航(push/replace/go/back/forward)
在这里插入图片描述

路由传参方式总结

params参数

  • 路由配置
{path:"/xxx/:id",  //:id 动态路由匹配,能匹配多个地址component:Xxx
}
  • 跳转路由路径
<router-link to="/xxx/xxx/1">xxx</router-link>
  • 子路由接收 :id的参数
  this.$route.params.id // 当 :id 的参数发生变化时,需要使用watch监视属性的变化,来更新数据 watch: {$route: {handler(newVal) {const id = +newVal.params.id;this.message = this.messages.find((message) => message.id === id);},// 正常情况下,watch只有值发生变化的时候才会调用// 一上来会调用一次immediate: true,},},

query

  • 路由链接设置
<router-link to="/xxx?brand='rolls'&engine='6.75'"></router-link>
  • 子组件的获取
this.$route.query

props

  • 将原先的params参数和query参数以props方式传递给组件

  • 子组件路由配置

props(route) {return {...route.params,...route.query,};
},    
  • 子组件声明接收
props: ['id', 'name', 'age']
  • 子组件使用
this.xxx

命名路由

  • 路由配置,需要name属性
{name: "Detail", // 命名路由path: "detail/:id",component: Detail,
}
  • 路由路径
<router-link:to="{name: 'Detail', // 跳转哪个命名路由params: {id: message.id,},query: {name: 'jack',age: 18,},}"
>xxx</router-link>

相同层级路由传递

  • 传参
<router-view key="value"></router-view>
  • 路由组件声明接收
 props: ['key']
  • 路由组件使用
this.xxx 

最基础使用

配置

下载包

yarn add vue-router

views组件

  • About和Home组件
<template><h1>About</h1>
</template><script>
export default {name: 'About',
};
</script><style>
</style>

src下定义router文件夹

// 因为要安装到Vue上面
import Vue from "vue";
import VueRouter from "vue-router";// 引入组件
import About from "../views/About/index.vue";
import Home from "../views/Home/index.vue";//     安装插件
//     一旦安装插件,就会给全局注册两个组件:router-link  router-view
//     还会给原型上添加一个属性
Vue.use(VueRouter);const router = new VueRouter({// 定义路由的配置routes: [{path: "/about", // 路由路径component: About // 路由组件},{path: "/home",component: Home},{// 当路径是/时,会切换到/homepath: "/",redirect: "/home" // 重定向}]
});export default router;

main.js应用路由

import Vue from "vue";
// 引入路由
import router from "./router/index";
import App from "./App.vue";Vue.config.productionTip = false;new Vue({render: h => h(App),// 应用路由router
}).$mount("#app");

app.vue显示

  • router-link 路由链接导航
    切换地址
  • router-view 显示对应的路由组件
    内部会根据当前的地址,遍历路由中routes配置,找到相应的组件显示
<template><div class="container"><h1>Router Page</h1><div class="row"><div class="col-md-4"><ul class="nav nav-pills nav-stacked"><li><router-link to="/about">About</router-link></li><li><router-link to="/home">Home</router-link></li></ul></div><div class="col-md-8"><!-- 显示对应的路由组件 --><router-view></router-view></div></div></div>
</template><script>
export default {name: 'App',
};
</script><style>
</style>

在这里插入图片描述

嵌套路由

新建子组件

在这里插入图片描述

<template><h2>Message</h2>
</template><script>
export default {name: 'Message',
};
</script><style>
</style>

引入组件,配置路由

import Message from '../views/Home/Message/index.vue'
import News from '../views/Home/News/index.vue'{path: "/home",component: Home,// 子路由,即使只有一个值也应该是数组children: [{path: "/home/message",component: Message},{// 当路径不是 / 开头,就会已父路由路径补全,也是一种简写// 注意,简写一定不要再加 /path: "news",component: News}]
},

home组件显示

<template><div><h1>Home</h1><ul class="nav nav-tabs"><li><router-link to="/home/message">message</router-link></li><li><router-link to="/home/news">news</router-link></li></ul><router-view></router-view></div>
</template>

在这里插入图片描述

路由传参

params参数

message添加元素

  • 效果图
    在这里插入图片描述
<template><div><h2>Message</h2><ul><li v-for="item in messageData" :key="item.id"><!-- to后面必须跟字符串,:绑定以后字符串才会被当做js去解析 --><router-link :to="`/home/message/detail/${item.id}`">{{item.content}}</router-link></li></ul><router-view></router-view></div>
</template><script>
export default {name: 'Message',data() {return {// 定义一个假数据messageData: [],};},// 模拟请求数据mounted() {setTimeout(() => {this.messageData = [{ id: 1, content: 'message01' },{ id: 2, content: 'message02' },{ id: 3, content: 'message03' },];}, 1000);},
};
</script><style>
</style>

在这里插入图片描述

创建Deail

<template><ul><li>id:{{ chilData.id }}</li><li>name:{{ chilData.name }}</li><li>content:{{ chilData.content }}</li></ul>
</template><script>
export default {name: 'Detail',data() {return {baseData: [{ id: 1, name: 'name111', content: 'content111' },{ id: 2, name: 'name222', content: 'content222' },{ id: 3, name: 'name333', content: 'content333' },],chilData: {},};},watch: {$route: {handler(newVal) {const id = +newVal.params.id;this.chilData = this.baseData.find((item) => item.id === id);},// 正常情况下,watch只有值发生变化的时候才会调用// 一上来会调用一次immediate: true,},},
};
</script><style>
</style>

动态路由配置

import Detail from "../views/Home/Message/Detail/index.vue";{path: "/home",component: Home,children: [{path: "/home/message",component: Message,children: [{// 动态路由,能够匹配多个路由,简写,省略 /path: "detail/:id",component: Detail}]},{path: "news",component: News}]
},

在这里插入图片描述

Detail

  • 在其this原型链上有一个$route
  mounted() {console.log(this);},
<template><div><ul><li>{{ showData.id }}</li><li>{{ showData.brand }}</li><li>{{ showData.color }}</li></ul></div>
</template><script>
export default {name: 'Detail',data() {return {detailData: [{ id: 1, brand: '劳斯', color: 'green' },{ id: 2, brand: '宾利', color: 'black' },{ id: 3, brand: '法拉利', color: 'red' },],showData: {},};},//   mounted() {//     console.log(this);//   },watch: {// 监视this原型链行的$route$route: {handler(newRouder) {// console.log(newRoder);  见图const id = +newRouder.params.id;this.showData = this.detailData.find((item) => item.id === id);},// 正常情况下,watch只有值发生变化的时候才会调用// 一上来会调用一次immediate: true,},},
};
</script><style>
</style>

在这里插入图片描述

  • wantch监视结果
    在这里插入图片描述

immediate

正常情况下,watch只有值发生变化的时候才会调用
增加这个属性一上来会调用一次

immediate: true,

在这里插入图片描述

watch监视 属性官方文档
在这里插入图片描述

done

在这里插入图片描述

query

路由链接设置

<template><div><h2>Message</h2><ul><li v-for="item in messageData" :key="item.id"><!-- query方法就是在之前基础上增加查询字符串 --><router-link:to="`/home/message/detail/${item.id}?brand='rolls'&engine='6.75'`">{{ item.content }}</router-link></li></ul><router-view></router-view></div>
</template>

子组件获取

this.$route.query

在这里插入图片描述

props

路由传递

<!-- 将原先的params参数和query参数以props方式传递给组件 -->
<router-link:to="`/home/message/detail/${item.id}?brand='rolls'&engine='6.75'`">{{ item.content }}</router-link
>

在这里插入图片描述
#3# 子组件配置

 {path: "detail/:id",component: Detail,// 增加props方法props(routeQuery) {// console.log(routeQuery);return {...routeQuery.params,...routeQuery.query}}}

子组件声明接收


-没有props接收,可以在$attrs上面看到,也可以在组件挂载的时候打印this查看
在这里插入图片描述

  • props接收了,$attrs就没有了
  watch: {$route: {handler(newRouder) {const id = +newRouder.params.id;this.showData = this.detailData.find((item) => item.id === id);},immediate: true,},},// props接收props: ['id', 'brand', 'engine'],

3在这里插入图片描述

this使用

this.xxx

命名路由

  • 路由取个名字

路由传递

<template><div><h2>Message</h2><ul><li v-for="item in messageData" :key="item.id"><!-- 是个对象,有个name属性,就是要去的组件名称,在路由中配置 --><router-link:to="{name: 'Detail',params: {id: item.id,},query: {brand: 'rolls',engine: 6.75,},}">{{ item.content }}</router-link></li></ul><router-view></router-view></div>
</template>

路由配置

{path: "/home/message",component: Message,children: [{// 名称,和组件名称一样,一定要有name: "Detail",path: "detail/:id",component: Detail,props(routeQuery) {return {...routeQuery.params,...routeQuery.query};}}]
},

接收

  • 同上面一样,可以props接收
    在这里插入图片描述

相同层级组件传递

  • 给相同层级的路由组件一起传递公共参数传参

传参

<template><div class="container"><h1>Router Page</h1><div class="row"><div class="col-md-4"><ul class="nav nav-pills nav-stacked"><!-- 给相同层级的路由组件一起传递参数 --><li><router-link to="/about">About</router-link></li><li><router-link to="/home">Home</router-link></li></ul></div><div class="col-md-8"><!-- 这样去传参,只要显示哪个组件,就给哪个组件传参 --><router-view rolls="royce"></router-view></div></div></div>
</template>

路由组件声明接收

<template><h1>About</h1>
</template><script>
export default {name: 'About',// 接收公共组件数据props: ['rolls'],
};
</script><style>
</style>

路由组件使用

  • this直接使用即可
    在这里插入图片描述

命名视图

命名路由

缓存路由组件

组件卸载与加载

  • 一个组件加载,另一个组件会卸载,这样性能不哈
    在这里插入图片描述

在这里插入图片描述

路由组件缓存

在这里插入图片描述

 <!-- app组件,要缓存哪个路由,就要在外面包一个keep-alive --><keep-alive include="Home"><router-view rolls="royce"></router-view></keep-alive>
  • 缓存了,所以还能看到
    在这里插入图片描述
  • 没缓存,直接看不到
    在这里插入图片描述

缓存多个 include

数组也可以

 <keep-alive include="Home,About">

在这里插入图片描述
在这里插入图片描述

排除法 exxlude

<keep-alive exclude="About">

在这里插入图片描述

max 最多缓存数量

<keep-alive exclude="About" max="1">

缓存组件问题


<keep-alive exclude=""><router-view rolls="royce"></router-view>
</keep-alive>
// 这两个声明周期函数只针对keep-alive缓存的组件触发// 已激活,在显示activated() {console.log('About activated ');},// 未激活deactivated() {console.log('About deactivated');},
  • 优点:性能好,不会重新发请求
  • 缺点:数据一致是旧的
    == 缓存起来以后不会再走mounted,以前发送请求都在mounted发,但是现在缓存起来了不会再走mounted,不会再请求最新数据,不能保证数据最新的 ==
<template><h1>About</h1>
</template><script>
export default {name: 'About',props: ['rolls'],mounted() {console.log('about mounted');},beforeDestroy() {console.log('about beforeDestroy');},// 已激活,在显示activated() {console.log('About activated ');},// 未激活deactivated() {console.log('About deactivated');},
};
</script><style>
</style>

在这里插入图片描述

路由跳转

<router-link to=""

  • 路由链接导航
  • 如果点击链接或者按钮只需要进行路由跳转,
  • 例如:导航链接

编程式导航

  • 编程式导航
  • 如果点击链接或者按钮需要做一些其他事,再进行路由跳转,例子:登录按钮、修改按钮

push()

replace()

back()

forward()

<template><div><h2>Message</h2><ul><li v-for="item in messageData" :key="item.id"><!-- 是个对象,有个name属性 --><router-link:to="{name: 'Detail',params: {id: item.id,},query: {brand: 'rolls',engine: 6.75,},}">{{ item.content }}</router-link><!-- 增加按钮,可以回退 --><button @click="push(item.id)">push</button><!-- 替换,不可以回退 --><button @click="replace(item.id)">replace</button></li></ul><!-- 后退,简写 --><button @click="$router.back()">goBack</button><!-- 前进,简写 --><button @click="$router.forward()">goForward</button><router-view></router-view></div>
</template>
  methods: {// 编程式导航// 添加push(id) {// console.log(this);this.$router.push(`/home/message/detail/${id}?brand=rolls&engine=675`);},// 替换replace(id) {this.$router.replace(`/home/message/detail/${id}?brand=rolls&engine=675`);},},

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


http://chatgpt.dhexx.cn/article/b1JUOsP3.shtml

相关文章

Vue路由的$router.back(-1)回退时如何判断有没有上一个路由

每个页面的左上角有一个返回按钮< 点击时的代码是this.$router.back(-1)&#xff0c;返回上一个路由 但是用户点开其中一页&#xff0c;用户打开时并没有上一条路由的历史记录&#xff0c;所以点击<按钮时没有反应。 所以应该怎么判断有没有上一条路由的历史记录。 1.在页…

回程静态路由及trunk简单链路

六、trunk链路 可以实现连个交换机间不同vlan相同网段间的互访 [one]vlan 2 [one-vlan2]vlan 3 [one-vlan3]quit [one]port-group 1 [one-port-group-1]group-memberGigabitEthernet 0/0/1 Gigab&#xff09;itEthernet 0/0/3 [one-port-group-1]port link-type access …

Vue路由(vue-router)

一、Vue路由的相关概念 1、路由&#xff08;routing&#xff09;&#xff1a;是指从源到目的地时&#xff0c;决定端到端路径的决策过程。 2、前端路由&#xff1a;即由前端来维护一个路由规则。实现模式有两种。 (1)利用URL的Hash模式&#xff1a;就是常说的锚点&#xff0c;J…

Vue Router路由详解

文章目录 1. 介绍2. Vue Router 和 Vue 项目集成3. 声明式导航4. 编程式导航5. 重定向和4046. 嵌套路由7. 动态路由匹配 1. 介绍 Vue Router 是 Vue.js 官方的路由管理器。它和 Vue.js 的核心深度集成&#xff0c;让构建单页面应用变得易如反掌。包含的功能有&#xff1a; 嵌…

Vue 路由(Router)详细介绍(切换,传参,通信)

目录 前言 准备工作 基本使用 router-link router-view 基本流程 扩展内容 动态路由匹配 ​编辑 编程式导航 重定向 路由组件传参 HTML5 History模式 前言 在一个vue项目中&#xff0c;免不了对组件&#xff08;页面&#xff09;进行切换与跳转。而用 Vue.js Vu…

使用Best Trace工具查看VPS的去程和回程线路的路由

​ 去程线路查询操作比较简单&#xff0c;这里主要先说回在Linux VPS上安装Best Trace工具查询回程线路的方法 ​ Best Trace官网 回程线路路由查询 Linux版本Best Trace Ubuntu/Debian准备工作 apt install -y wget zip CentOS准备工作 yum -y install wget zip 下载 …

Vue路由(vue-router)详细讲解指南

中文文档&#xff1a;https://router.vuejs.org/zh/ Vue Router 是 Vue.js 官方的路由管理器。它和 Vue.js 的核心深度集成&#xff0c;让构建单页面应用变得易如反掌。路由实际上就是可以理解为指向&#xff0c;就是我在页面上点击一个按钮需要跳转到对应的页面&#xff0c;这…

静态路由配置

静态路由配置 一、静态路由简单配置方法 一、静态路由简单配置方法 设置静态路由步骤&#xff1a; 1.设置每个设备&#xff08;PC、路由器&#xff09;接口IP&#xff1a; 如图所示配置好各个接口的IP地址: 配置路由器AR1 0/0/0接口IP&#xff1a; [Huawei]interface Gigabi…

【接口篇 / Lan】(5.4) ❀ 02. 与交换机连接 (回程路由) ❀ FortiGate 防火墙

【简介】大多数企业都会配备三层交换机&#xff0c;通过划分VLAN更好的管理内部网络&#xff0c;三层交换机功能强大&#xff0c;本身带路由功能&#xff0c;可以控制VLAN之间的互相访问&#xff0c;这里要介绍的是三层交换机与防火墙连接上网。 回程路由 在没有等动态路由的情…

静态路由的配置以及简单分析

我们先把每个pc、路由器端口的ip配置好 然后在配置静态路由 在配置静态路由的时候&#xff0c;我们先配去程路由 在路由器R1 的命令行输入ip route-static 192.168.6.0 30 192.168.2.2 再去路由器R2 的命令行输入 ip route-static 192.168.1.0 30 192.168.2.1 配置回程路由 配置…

路由回环配置

一、拓扑模型 二、要求及分析 要求 配置pc等设备&#xff0c;要求互通 分析 1、配置IP地址 2、路由配置 三、配置IP r1配置 [r1]interface GigabitEthernet 0/0/0 [r1-GigabitEthernet0/0/0]ip address 192.168.1.100 24 [r1]interface GigabitEthernet 0/0/1 [r1-Gigab…

路由-回指路由

回指路由&#xff0c;是一个相对的概念。顾名思义&#xff0c;是指“回去的路由”。 当原路由是A区域-->B区域时&#xff0c;A向B发送访问请求&#xff0c;以A为源B为目标&#xff0c;此时B需要以A为目标地址&#xff0c;B为源配置一个静态路由&#xff0c;作为回指路由。 …

【计算机网络】Linux下路由配置总结

文章目录 路由的基础知识Linux内核路由表使用route -n命令查看Linux内核路由表三种路由类型说明(Flags)配置路由route的命令设置包转发静态路由配置 参考 路由的基础知识 1&#xff09;路由概念 路由&#xff1a; 跨越从源主机到目标主机的一个互联网络来转发数据包的过程路由…

Message消息框

//示例1.默认右下角 $.messager.show({title:我的消息,//可以用span标签拼接改变字体样式msg:data.msg,timeout:2000,showType:slide });//示例2.消息将显示在顶部中间 自定义消息框位置 $.messager.show({title:我的消息,msg:消息将在4秒后关闭。,showType:show,style:{right:…

简单的message提示框插件

下载&#xff1a;https://download.csdn.net/download/billhepeng/11929586

弹出Message

开发过程中&#xff0c;经常需要弹出各种信息提示框&#xff0c;很多框架都自定义了提示框&#xff0c;有的框架或许没有&#xff0c;我们也可以使用alert &#xff0c;confirm等IE自带的信息提示框&#xff0c;缺点就是太死板&#xff0c;无法修改其样式&#xff0c;所以很多时…

Handler,Message,Looper MessageQueue

##1 Handler简介 Handler&#xff0c;Looper&#xff0c;Message&#xff0c;MessageQueue是Android开发中经常遇到的知识点&#xff0c;也是Android面试题中常遇到的问题。 先来看一下Message在Android中传递的概览图 上面这张图基本反映了Handler发送和处理Message的流程。H…

message hook

简单的 WH_GETMESSAGE 钩子的使用。 MessageHook.h #ifndef __MessageHook_h__#define __MessageHook_h__#include <Windows.h>#include <tchar.h>#ifdef __cplusplusextern "C" {#endif#ifdef DLL_EXPORT#define DLLAPI __declspec(dllexport)#else#d…

Android Message机制

Android Message机制 ​ Android的Message机制&#xff0c;也叫handler机制&#xff0c;主要由3部分Message组成&#xff0c;这三部分分别是Looper、MessageQueue和Handler。 ​ Looper&#xff1a;循环体&#xff0c;其作用就是从MessageQueue中取出Message进行消费&#xf…

Windows 消息循环 GetMessage() PeekMessage()

GetMessage()函数的消息循环的汇编代码.while TRUEinvoke GetMessage,addr stMsg,NULL,0,0.break .if eax 0invoke TranslateMessage,addr stMsginvoke DispatchMessage,addr stMsg.endwret解读&#xff1a; 调用 GetMessage 函数,函数中都要用到一个MSG结构体&#xff0c;那是…