Vue ⑥-路由

在这里插入图片描述

单页应用程序

单页应用程序,即 Single-Page Application,简称 SPA,是一种使用 JavaScript、HTML 和 CSS 构建的 Web 应用程序。SPA 的核心是前端路由,它使得用户在访问网站时,只需加载一次页面,然后通过前端路由来切换页面,而不需要重新加载整个页面。所有功能在 一个 html 页面 上实现
在这里插入图片描述

单页面应用程序,之所以开发效率高,性能高,用户体验好

最大的原因就是:页面按需更新

要按需更新,首先就需要明确:访问路径组件 的对应关系!

访问路径 和 组件的对应关系如何确定呢? 路由

路由

生活中的路由:设备和 ip 的映射关系

比如路由器通过源 ip 和目的 ip 确定数据包的下一跳。

Vue中路由:路径组件映射 关系
在这里插入图片描述

VueRouter

目标:认识插件 VueRouter,掌握 VueRouter 的基本使用步骤

作用:修改地址栏路径时,切换显示匹配的组件

说明:Vue 官方的一个路由插件,是一个第三方包

官网:https://v3.router.vuejs.org/zh/

VueRouter 的 使用 (5 + 2)

5个基础步骤 (固定)

  1. 下载: 下载 VueRouter 模块到当前工程
npm install vue-router
  1. 创建 ./router/index.js 文件,引入 VueRouter 模块
import VueRouter from 'vue-router'
  1. 安装注册
Vue.use(VueRouter)
  1. 创建路由对象
const router = new VueRouter()
  1. 注入,将路由对象注入到 new Vue 实例(main.js)中,建立关联
import router from './router/index'new Vue({render: h => h(App),router
}).$mount('#app')

2 个核心步骤

  1. 创建需要的组件 (views目录),配置路由规则

这里创建 Find.vue My.vue Friend.vue 三个组件 (在 ./views 目录下)

  1. 配置路由规则,在 ./router/index.js 文件中配置路由规则
import Find from './views/Find'
import My from './views/My'
import Friend from './views/Friend'// 创建了一个路由对象
const router = new VueRouter({// routes 路由规则们// route  一条路由规则 { path: 路径, component: 组件 }routes: [{ path: '/find', component: Find },{ path: '/my', component: My },{ path: '/friend', component: Friend },]
})export default router
  1. 配置导航,配置路由出口(路径匹配的组件显示的位置),在 App.vue 文件中配置导航
<template><div><div class="footer_wrap"><a href="#/find">发现音乐</a><a href="#/my">我的音乐</a><a href="#/friend">朋友</a></div><div class="top"><!-- 路由出口 → 匹配的组件所展示的位置 --><router-view></router-view></div></div>
</template>

组件存放目录问题

注意.vue文件 本质无区别。
路由相关的组件,为什么放在 views 目录呢?组件分类

组件分类: .vue文件分2类: 页面组件 & 复用组件

分类开来 更易维护

  • src/views 文件夹
    • 页面组件 - 页面展示 - 配合路由用
  • src/components 文件夹
    • 复用组件 - 展示数据 - 常用于复用

声明式导航

导航链接

需求:实现导航高亮效果

vue-router 提供了一个全局组件 router-link (取代 a 标签)

  • 能跳转,配置 to 属性指定路径(必须) 。本质还是 a 标签 ,to 无需 #
  • 能高亮,默认就会提供高亮类名,可以直接设置高亮样式
<!-- 原来的 -->
<a href="#/find">发现音乐</a>
<a href="#/my">我的音乐</a>
<a href="#/friend">朋友</a><!-- 改成 -->
<router-link to="/find">发现音乐</router-link>
<router-link to="/my">我的音乐</router-link>
<router-link to="/friend">朋友</router-link>

精准匹配 & 模糊匹配

说明:我们发现 router-link 自动给当前导航添加了 两个高亮类名
在这里插入图片描述

  • router-link-active模糊匹配 (用的多)

    • to="/my" 可以匹配 /my /my/a /my/b
  • router-link-exact-active精确匹配

    • to="/my" 仅可以匹配 /my

自定义高亮类名

说明:router-link两个高亮类名太长了,我们希望能定制怎么办?

语法:

const router = new VueRouter({routes: [...],linkActiveClass: "类名1", // 模糊匹配linkExactActiveClass: "类名2" // 精确匹配
})

在这里插入图片描述

跳转传参

目标:在跳转路由时, 进行传值

查询参数传参

语法格式如下:

  • to="/path?参数名=值"
  • 对应页面组件接收传递过来的值
    • $route.query.参数名

App.vue

<template><div id="app"><div class="link"><router-link to="/home">首页</router-link><router-link to="/search">搜索页</router-link></div><router-view></router-view></div>
</template>

router/index.js

const router = new VueRouter({routes: [{ path: '/home', component: Home },{ path: '/search', component: Search }]
})

Home.vue

<div class="hot-link">热门搜索:<router-link to="/search?key=程序员">程序员</router-link><router-link to="/search?ke=前端培训">前端培训</router-link><router-link to="/search?key=如何成为前端大牛">如何成为前端大牛</router-link>
</div>

Search.vue

<template><div class="search"><p>搜索关键字: {{ $route.query.key }} </p><p>搜索结果: </p><ul><li>.............</li></ul></div>
</template><script>
export default {name: 'MyFriend',created () {// 在created中,获取路由参数// this.$route.query.参数名 获取console.log(this.$route.query.key)}
}
</script>
动态路由传参
  1. 配置动态路由,在 ./router/index.js 文件中配置路由规则
const router = new VueRouter({routes: [{ path: '/home', component: Home },{ path: '/search/:words', component: Search }]
})
  1. 配置导航链接:to="/path/参数值"

  2. 对应页面组件接收传递过来的值:$route.params.参数名

App.vue

<template><div id="app"><div class="link"><router-link to="/home">首页</router-link><router-link to="/search">搜索页</router-link></div><router-view></router-view></div>
</template>

Home.vue

<div class="hot-link">热门搜索:<router-link to="/search/程序员">程序员</router-link><router-link to="/search/前端培训">前端培训</router-link><router-link to="/search/如何成为前端大牛">如何成为前端大牛</router-link>
</div>

Search.vue

<template><div class="search"><p>搜索关键字: {{ $route.params.words }} </p><p>搜索结果: </p><ul><li>.............</li></ul></div>
</template><script>
export default {name: 'MyFriend',created () {// 在created中,获取路由参数// this.$route.query.参数名 获取查询参数// this.$route.params.参数名 获取动态路由参数console.log(this.$route.params.words);}
}
</script>
动态路由参数可选符

问题:配了路由 path: "/search/:words" 为什么按下面步骤操作,会未匹配到组件,显示空白?

原因: /search/:words 表示,必须要传参数。如果不传参数,也希望匹配,可以加个可选符 "?"

{ path: '/search/:words?', component: Search }
两种传参方式的区别

查询参数传参 (比较适合传多个参数)

  • 跳转:to="/path?参数名=值&参数名2=值"
  • 获取:$route.query.参数名

动态路由传参 (优雅简洁,传单个参数比较方便)

  • 配置动态路由:path: "/path/:参数名"
  • 跳转:to="/path/参数值"
  • 获取:$route.params.参数名

路由重定向

问题:网页打开, url 默认是 / 路径,未匹配到组件时,会出现空白

说明:重定向 → 匹配path后, 强制跳转path路径

语法{ path: 匹配路径, redirect: 重定向到的路径 },

const router = new VueRouter({routes: [{ path: '/', redirect: '/home' }, // 重定向到 /home{ path: '/home', component: Home },{ path: '/search/:words?', component: Search }]
})

404

作用:当路径找不到匹配时,给个提示页面

位置:配在路由最后

语法:path: "*" (任意路径) – 前面不匹配就命中最后这个

const router = new VueRouter({routes: [{ path: '/', redirect: '/home' },{ path: '/home', component: Home },{ path: '/search/:words?', component: Search },{ path: '*', component: NotFound }]
})

模式设置

问题: 路由的路径看起来不自然,有#,能否切成真正路径形式?

  • hash路由(默认) 例如: http://localhost:8080/#/home
const router = new VueRouter({mode: 'hash',routes: [...]
})
  • history路由(常用) 例如: http://localhost:8080/home
const router = new VueRouter({mode: 'history',routes: [...]
})

编程式导航

基本跳转

问题:点击按钮跳转如何实现?

编程式导航:用 JS 代码来进行跳转

两种语法:

  • path 路径跳转(简易方便
this.$router.push('路由路径')this.$router.push({path: '路由路径'
})
  • name 命名路由跳转(适合 path 路径长的场景
this.$router.push({name: '路由名'
})
const router = new VueRouter({routes: [{ name: '路由名', path: '/path/xxx', component: XXX },]
})

Home.vue

<template><div class="home"><div class="logo-box"></div><div class="search-box"><input type="text"><button @click="goSearch">搜索一下</button></div><div class="hot-link">热门搜索:<router-link to="/search/程序员">程序员</router-link><router-link to="/search/前端培训">前端培训</router-link><router-link to="/search/如何成为前端大牛">如何成为前端大牛</router-link></div></div>
</template><script>
export default {name: 'FindMusic',methods: {goSearch () {// 1. 通过路径的方式跳转// (1) this.$router.push('路由路径') [简写]// this.$router.push('/search')// (2) this.$router.push({     [完整写法]//         path: '路由路径' //     })// this.$router.push({//   path: '/search'// })// 2. 通过命名路由的方式跳转 (需要给路由起名字) 适合长路径//    this.$router.push({//        name: '路由名'//    })this.$router.push({name: 'search'})}}
}
</script>

路由传参

问题:点击搜索按钮,跳转需要传参如何实现?

两种传参方式:查询参数 + 动态路由传参

两种跳转方式,对于两种传参方式都支持:

  • path 路径跳转传参(query传参)
this.$router.push('/路径?参数名1=参数值1&参数2=参数值2')this.$router.push({path: '/路径',query: {参数名1: '参数值1',参数名2: '参数值2'}
})
  • path 路径跳转传参 (动态路由传参)
this.$router.push('/路径/参数值')this.$router.push({path: '/路径/参数值'
})
  • name 命名路由跳转传参(query传参)
this.$router.push({name: '路由名字',query: {参数名1: '参数值1',参数名2: '参数值2'}
})
  • name 命名路由跳转传参 (动态路由传参)
this.$router.push({name: '路由名字',params: {参数名: '参数值'}
})

Home.vue

<template><div class="home"><div class="logo-box"></div><div class="search-box"><input v-model="inpValue" type="text"><button @click="goSearch">搜索一下</button></div><div class="hot-link">热门搜索:<router-link to="/search/黑马程序员">黑马程序员</router-link><router-link to="/search/前端培训">前端培训</router-link><router-link to="/search/如何成为前端大牛">如何成为前端大牛</router-link></div></div>
</template><script>
export default {name: 'FindMusic',data () {return {inpValue: ''}},methods: {goSearch () {// 1. 通过路径的方式跳转// (1) this.$router.push('路由路径') [简写]//     this.$router.push('路由路径?参数名=参数值')// this.$router.push('/search')// this.$router.push(`/search?key=${this.inpValue}`)// this.$router.push(`/search/${this.inpValue}`)// (2) this.$router.push({     [完整写法] 更适合传参//         path: '路由路径'//         query: {//            参数名: 参数值,//            参数名: 参数值//         }//     })// this.$router.push({//   path: '/search',//   query: {//     key: this.inpValue//   }// })// this.$router.push({//   path: `/search/${this.inpValue}`// })// 2. 通过命名路由的方式跳转 (需要给路由起名字) 适合长路径//    this.$router.push({//        name: '路由名'//        query: { 参数名: 参数值 },//        params: { 参数名: 参数值 }//    })this.$router.push({name: 'search',// query: {//   key: this.inpValue// }params: {words: this.inpValue}})}}
}
</script>

组件缓存 keep-alive

问题:从面经 点到 详情页,又点返回,数据重新加载了 → 希望回到原来的位置

原因:路由跳转后,组件被销毁了,返回回来组件又被重建了,所以数据重新被加载了

解决:利用 keep-alive 将组件缓存下来

keep-alive 是什么

  • keep-alive 是 Vue 的内置组件,当它包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们。
  • keep-alive 是一个抽象组件:它自身不会渲染成一个 DOM 元素,也不会出现在父组件链中。

keep-alive 的优点

  • 在组件切换过程中 把切换出去的组件保留在内存中,防止重复渲染 DOM
  • 减少加载时间及性能消耗,提高用户体验性。
<template><div class="h5-wrapper"><keep-alive><router-view></router-view></keep-alive></div>
</template>

keep-alive 的三个属性

  • include : 组件名数组,只有匹配的组件会被缓存
  • exclude : 组件名数组,任何匹配的组件都不会被缓存
  • max : 最多可以缓存多少组件实例
<template><div class="h5-wrapper" :include="['LayoutPage']"><keep-alive ><router-view></router-view></keep-alive></div>
</template>

keep-alive 的使用会触发两个生命周期函数

  • activated 当组件**被激活(使用)**的时候触发 → 进入这个页面的时候触发
  • deactivated 当组件不被使用的时候触发 → 离开这个页面的时候触发

组件缓存后就不会执行组件的created, mounted, destroyed 等钩子了

所以其提供了 activeddeactived 钩子,帮我们实现业务需求

activated () {console.log('actived 激活 → 进入页面');
},
deactivated() {console.log('deactived 失活 → 离开页面');
} 

自定义创建项目

目标:基于 VueCli 自定义创建项目架子

的三个属性

  • include : 组件名数组,只有匹配的组件会被缓存
  • exclude : 组件名数组,任何匹配的组件都不会被缓存
  • max : 最多可以缓存多少组件实例
<template><div class="h5-wrapper" :include="['LayoutPage']"><keep-alive ><router-view></router-view></keep-alive></div>
</template>

keep-alive 的使用会触发两个生命周期函数

  • activated 当组件**被激活(使用)**的时候触发 → 进入这个页面的时候触发
  • deactivated 当组件不被使用的时候触发 → 离开这个页面的时候触发

组件缓存后就不会执行组件的created, mounted, destroyed 等钩子了

所以其提供了 activeddeactived 钩子,帮我们实现业务需求

activated () {console.log('actived 激活 → 进入页面');
},
deactivated() {console.log('deactived 失活 → 离开页面');
} 

自定义创建项目

目标:基于 VueCli 自定义创建项目架子
在这里插入图片描述

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

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

相关文章

Hadoop复习(九)

Azkaban工作流管理器 选择 问题 1 判断题 2 / 2 分 工作流是指具有依赖的一组job任务&#xff0c;被依赖的job任务最后执行 正确 错误 问题 2 判断题 2 / 2 分 Azkaban兼容任何版本的Hadoop 正确 错误 问题 3 判断题 2 / 2 分 独立服务器模式下&#xff0c;Azkab…

SpringMVC相关知识(二)

一.重定向和转发 1.ModelandView 设置ModelAndView对象 , 根据view的名称 , 和视图解析器跳到指定的页面 页面 : {视图解析器前缀} viewName {视图解析器后缀} 相关代码&#xff1a; <!-- 视图解析器 --> <bean class"org.springframework.web.servlet.vi…

std::ratio 简单使用举例

author: hjjdebug date: 2025年 06月 09日 星期一 14:28:40 CST descrip: std::ratio 简单使用举例 文章目录 1. 先看一个简单的例子 1/2/1/35/62 std::ratio 的手册页3. std::ratio_add 到底是什么呢&#xff1f;4. 代码注释5. 加深理解.6. 自定义的std::ratio 与 std::ratio_…

Docker 优势与缺点全面解析:容器技术的利与弊

在当今云计算、微服务、DevOps盛行的时代&#xff0c;Docker 几乎成了开发者、运维工程师的标配工具之一。自2013年诞生以来&#xff0c;Docker 以其轻量、快速、易移植的特点&#xff0c;彻底改变了应用的构建、交付与部署方式。 但任何技术都有两面性&#xff0c;Docker 也不…

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…

排序算法总结(C++)

目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指&#xff1a;同样大小的样本 **&#xff08;同样大小的数据&#xff09;**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…

使用Redis作为缓存优化ElasticSearch读写性能

在现代数据密集型应用中,ElasticSearch凭借其强大的全文搜索能力成为许多系统的首选搜索引擎。然而,随着数据量和查询量的增长,ElasticSearch的读写性能可能会成为瓶颈。本文将详细介绍如何使用Redis作为缓存层来显著提升ElasticSearch的读写性能,包括完整的架构设计、详细…

获取wordpress某个栏目的内容数量

获取wordpress某个栏目的内容数量 <?php // 将以下 8 改成你的分类 ID 即可echo get_category(8)->count;?> 在制作wordpress模板时&#xff0c;有时会需要调用某个分类目录下的所有内容数量&#xff0c;通过这段简洁的代码就可以实现。 给WordPress自定义字段加…

uniapp 安卓 APP 后台持续运行(保活)的尝试办法

在移动应用开发领域&#xff0c;安卓系统的后台管理机制较为复杂&#xff0c;应用在后台容易被系统回收&#xff0c;导致无法持续运行。对于使用 Uniapp 开发的安卓 APP 来说&#xff0c;实现后台持续运行&#xff08;保活&#xff09;是很多开发者面临的重要需求&#xff0c;比…

深度学习——知识提炼

第一部分&#xff1a;引言与背景——为什么需要知识提炼&#xff1f; 一、模型压缩的背景 随着深度学习的发展&#xff0c;模型变得越来越大&#xff08;如 ResNet152、BERT、ViT、GPT 等&#xff09;&#xff0c;其参数量动辄数亿甚至上百亿。这些大模型虽然性能强大&#x…

开源之夏·西安电子科技大学站精彩回顾:OpenTiny开源技术下沉校园,点燃高校开发者技术热情

开源之夏2025编程活动正在如火如荼的进行中&#xff0c;当前也迎来了报名的倒计时阶段&#xff0c;开源之夏组织方也通过高校行系列活动进入各大高校&#xff0c;帮助高校开发者科普开源文化、开源活动、开源技术。 6月4日 开源之夏携手多位开源技术大咖、经验型选手走进西安电…

时间复杂度和算法选择

数据范围 时间复杂度 算法选择 n \leq 30 指数级别 O(2^n) 深度优先搜索&#xff08;DFS&#xff09; 剪枝、状态压缩动态规划 n \leq 100 O(n^3) Floyd 算法、动态规划、高斯消元 n \leq 1000 O(n^2) 、 O(n^2 \log n) 动态规划、二分…

数据分析实战2(Tableau)

1、Tableau功能 数据赋能&#xff08;让业务一线也可以轻松使用最新数据&#xff09; 分析师可以直接将数据看板发布到线上自动更新看板自由下载数据线上修改图表邮箱发送数据设置数据预警 数据探索&#xff08;通过统计分析和数据可视化&#xff0c;从数据发现问题&#xf…

CentOS7_Linux下安装Docker和docker-compose

目录 环境要求安装步骤1、修改镜像源配置文件2、卸载旧版本 Docker&#xff08;如有&#xff09;3、安装依赖工具4、添加 Docker 官方仓库5、安装 Docker 引擎6、启动 Docker 并设置开机自启7、验证安装8、配置镜像加速器创建配置文件重启 Docker 生效 9、允许非 root 用户操作…

ubuntu中使用docker

上一篇我已经下载了一个ubuntu:20.04的镜像&#xff1b; 1. 查看所有镜像 sudo docker images 2. 基于本地存在的ubuntu:20.04镜像创建一个容器&#xff0c;容器的名为cppubuntu-1。创建的时候就会启动容器。 sudo docker run -itd --name cppubuntu-1 ubuntu:20.04 结果出…

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇&#xff0c;相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程&#xff0c;其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线&#xff0c; n r n_r nr​ 根接收天线的 MIMO 系…

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定&#xff0c;这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中&#xff0c;积分电荷法最为常用&#xff0c;其原理是通过测量在电容器上积累的热释电电荷&#xff0c;从而确定热释电系数…

idea中 maven 本地仓库有jar包,但还是找不到,解决打包失败和无法引用的问题

1、删除本地仓库中的文件 进入本地仓库对应jar包文件目录中删除_remote.repositories文件和结尾为.lastUpdated的文件 2、回到IDEA刷新Maven 3、查看之前引用不了的jar是否引入成功

ALOHA ACT算法与源码笔记

算法 一文通透动作分块算法ACT&#xff1a;斯坦福ALOHA团队推出的动作序列预测算法(Action Chunking with Transformers) 比较简单&#xff0c;算法题目里就写了&#xff1a;Action Chunking with Transformers&#xff0c;比较有特色的地方就是Action Chunking&#xff0c;核…

数字ic后端设计从入门到精通6(含fusion compiler, tcl教学)repeater详解

Repeaters RC延迟与导线长度的关系&#xff1a; 导线的电阻&#xff08;R&#xff09;和电容&#xff08;C&#xff09;都会随着导线长度&#xff08;l&#xff09;的增加而增大。RC延迟是电阻和电容共同作用导致的信号延迟。由于RC延迟与R和C的乘积有关&#xff0c;因此它会随…