📝个人主页:五敷有你
🔥系列专栏:Vue
⛺️稳中求进,晒太阳
目录
单页面应用:(SPA):所有功能在 一个html页面上 实现
开发分类 | 实现方式 | 页面性能 | 开发效率 | 用户体验 | 学习成本 | 首屏加载 | SEO |
单页 | 一个html | 按需更新 性能高 | 高 | 非常好 | 高 | 慢 | 差 |
多页 | 多个html页面 | 整页更新 性能低 | 中等 | 一般 | 中等 | 快 | 优 |
生活中的路由:设备和ip的映射关系
Vue中的路由: 路径和组件的映射关系
作用:修改地址栏路径时,切换显示匹配的组件
说明:Vue官方的一个路由插件,是一个第三方包
使用步骤:(写在main.js)
1. 下载:下载VueRouter 模板到当前工程 版本3.6.5
- yarn add vue-router@3.6.5
- npm i vue-router@3.6.5
2. 引入
import VueRouter from 'vue-router'
3 .安装注册
Vue.use(VueRouter)
4. 创建路由对象
const router=new VueRouter()
5.注入,将路由对象注入到newVue实例中,建立关联
- new Vue({
- render:h=>h(App),
- router:router
- }).$mount('#app')
1.创建需要的组件(views目录),配置路由规则
- import Find from './views/Find.vue'
- import Find from './views/Find.vue'
- import Find from './views/Find.vue'
-
- const router=new VueRouter({
- routes:[
- {path:"/find",component:Find},
- {path:"/find",component:Find},
- {path:"/find",component:Find},
- ]
- })
2.配置导航,配置路由出口(路径匹配的组件的位置)
- <div class="footer_warp">
- <a href="#/find">发现音乐</a>
- <a href="#/my">我的音乐</a>
- <a href="#/friend">朋友</a>
- </div>
- <div>
- <router-view></router-view>
- </div>
注意:.vue文件 本质无区别
路由相关的组件,为什么放在views目录呢?
组件分类
问题:所有的路由都堆在main.js中合适么?
目标:将所有的模块抽离出来
好处:拆分模块
封装到router/index.js下
- import myMusic from '@/components/myMusic.vue'
- import myFriends from '@/components/myFriends.vue'
- import findMusic from '@/components/findMusic.vue'
- import Vue from 'vue'
- import VueRouter from 'vue-router'
- Vue.use(VueRouter)
- const router=new VueRouter({
- routes:[
- //router 路由规则
- //route 一条路由规则{path:"路径",component:组件名}
- {path:"/my",component:myMusic},
- {path:"/find",component:findMusic},
- {path:"/friend",component:myFriends},
- ]
- })
-
- <--导出路由-->
- export default router;
之后再在main.js中导入
import router from './router/index'
vue-router提供了一个全局组件router-link(取代a标签)
- <router-link to="find">发现音乐router-link>
- <router-link to="friend">我的朋友router-link>
- <router-link to="my">我的音乐router-link>
- <router-link to="find" class="router-link-exact-active router-link-active">发现音乐router-link>
- <router-link to="friend">我的朋友router-link>
- <router-link to="my">我的音乐router-link>
router-link自动给当前导航添加了两个高亮类名
1.router-link-active 模糊匹配(用的多)
to="/my" 可以匹配 /my /my/a /my
2.router-link-exact-active 精确匹配
to="/my" 仅可以匹配 /my
目标:在跳转的路由的时候传参
- <div class="nav">
- <router-link to="find?key=发现音乐">发现音乐router-link>
- <router-link to="friend?key=我的朋友">我的朋友router-link>
- <router-link to="my?key=我的音乐">我的音乐router-link>
- div>
- <template>
- <div class="main">
- <h1>{{ $route.query.key }}h1>
- <p>朋友的音乐p>
- <p>朋友的音乐p>
- <p>朋友的音乐p>
- <p>朋友的音乐p>
- div>
- template>
- const router=new VueRouter({
- routes:[
- {path:"/my/:word",component:myMusic},
- {path:"/find/:word",component:findMusic},
- {path:"/friend/:word",component:myFriends},
- ]
- })
2. 配置导航链接
to="path/参数值"
<router-link to="/my/我的音乐">我的音乐router-link>
3.对应页面组件接受传递过来的值
$route.params.参数名
<h1>{{ $route.params.word }}h1>
问题:网页打开,url默认时是/路径,未匹配到组件时,会出现空白
说明:重定向 →匹配path后,强制跳转path路径
语法:{path:匹配路径,redirect:重定向的路径},
- const router=new VueRouter({
- routes:[
- {path:"/",redirect:"/find/爱你"},
- {path:"/my/:words",component:myMusic},
- {path:"/find/:words",component:findMusic},
- {path:"/friend/:words",component:myFriends},
- ]
- })
作用:当路径找不到匹配时,给个提示页面
位置:配置路由的最后
语法:path:"*"(任意路径)-前面不匹配就命中最后一个
- const router=new VueRouter({
- routes:[
- {path:"/",redirect:"/find/爱你"},
- {path:"/my/:words",component:myMusic},
- {path:"/find/:words",component:findMusic},
- {path:"/friend/:words",component:myFriends},
- {path:"*",component:NotFind},
- ]
- })
问题:路由的路径带有#,能否真正切成路径形式
hash路由(默认) 例如: http://localhost:8080/#/home
history路由(常用) 例如: http://localhost:8080/home
在index.js中
- const router=new VueRouter({
- mode:"history",
- routes:[
-
- {path:"/",redirect:"/find/爱你"},
- {path:"/my/:words",component:myMusic},
- {path:"/find/:words",component:findMusic},
- {path:"/friend/:words",component:myFriends},
- {path:"*",component:NotFind},
- ]
- })
问题:点击按钮怎么跳转
编程式导航,用js代码跳转
两种语法:
- 简单写法:
- this.$router.push("/路由路径")
- 复杂写法:
- this.$router.push({
- path:'/路由路径',
- })
query传参
- 简写:
- this.$router.push('/路径?参数1=值,参数2=值,参数3=值')
-
- 完整写法:
- this.$router.push({
- path:"/路径",
- query:{
- 参数名1:"值",
- 参数名2:"值"
- }
- })
- 对应取值
- <h1>{{ $route.query.key }}h1>
动态传参
- 简写:
- this.$router.push("/路径/${this.inpValue}")
- 完整写法:
- this.$router.push({
- path:"路径/关键词"
- })
-
- //取值
- this.$route.param.words
name 命名路由跳转(适合path路径长的场景)
- {name:'路由名',path:'/path/xxx',component:xxx}
- //query传参
- this.$router.push({
- name:"路由名",
- query:{
-
- }
- })
- //动态路由传参
- this.$router.push({
- name:"路由名",
- param:{
-
- }
- })