1.0.路由基本简介和使用
路由:就是一一对应关系的集合
工作原理 : 前端路由的本质, 对url的hash值进行改变和监听,切换对应页面组件的dom结构
1.1 vue-router介绍
vue-router模块包
它和 Vue.js 深度集成
可以定义 - 视图表(映射规则)
模块化的
提供2个内置全局组件
<router-view></router-view>
<router-link to="/hash">xxx</router-link>
声明式导航自动激活的 CSS class 的链接
router-link-exact-active 与 router-link-active
1.2 路由 - 组件分类
一般的: .vue文件分2类, 一个是页面组件, 一个是复用组件
.vue文件本质无区别, 为方便程序员好管理与理解,做的区分
src/views(或pages) 文件夹 和 src/components文件夹
- 页面组件 - 页面展示 - 配合路由用
- 复用组件 - 展示数据/常用于复用
总结: views下的页面组件, 配合路由切换, components下的一般引入到views下的vue中复用展示数据
1.3安装并配置路由
- 安装
yarn add vue-router@3.5.3
#OR
npm i vue-router@3.5.3
注意: 路由已更新到最新的4.0.0版本以上,需搭配vue3使用,如果是vue2的项目,需安装4版本以下的
- 导入路由
import VueRouter from 'vue-router'
- 使用路由插件
// 在vue中,使用使用vue的插件,都需要调用Vue.use()
Vue.use(VueRouter)
- 引入跳转的组件
import Find from './Find.vue'
import My from './My.vue'
import Part from './Part.vue'
- 创建路由规则数组
const routes = [
{
path: "/find",
component: Find
},
{
path: "/my",
component: My
},
{
path: "/part",
component: Part
}
]
- 创建路由对象 - 传入规则
const router = new VueRouter({
routes
})
- 关联到vue实例
new Vue({
router
})
- 用router-view占位展示的组件
<router-view></router-view>
总结1: 下载路由模块, 编写对应规则注入到vue实例上, 使用router-view挂载点显示切换的路由
总结2: 一切都围绕着hash值变化为准
补充: 以上配置,可通过脚手架手动配置的选项,自己添加,会自动生成
2.0 声明式导航 - 基础使用
可用全局组件router-link来替代a标签
- vue-router提供了一个全局组件 router-link
- router-link实质上最终会渲染成a链接 to属性等价于提供 href属性(to无需#)
- router-link提供了声明式导航高亮的功能(自带类名)
示例:
<template>
<div>
<h1>App组件</h1>
<ul>
<li><router-link to="/home">首页</router-link></li>
<li><router-link to="/movie">电影</router-link></li>
<li><router-link to="/about">关于</router-link></li>
</ul>
<router-view></router-view>
</div>
</template>
当点击对应链接时,hash值发生变化,定义好的路由规则会监听变化,当发现到与path中定义的规则一致时,会对应切换到 component中定义好的组件
总结: 链接导航, 用router-link配合to, 实现点击切换路由
2.1声明式导航 - 跳转传参
在跳转路由时, 可以给路由对应的组件内传值
在router-link上的to属性传值, 语法格式如下
1.query传参。 适用场景:页面搜索
方式: /path?参数名=值 --- 不需要在路由对象中提前配置
2.params传参。 适用场景:详情页
方式: /path/值 --- 需要路由对象提前配置 path: “/path/:参数名”
{
path: "/part/:username", // 有:的路径代表要接收具体的值
component: Part
},
对应页面组件接收传递过来的值
- $route.query.参数名
- $route.params.参数名
3.0路由 - 重定向
匹配path后, 强制切换到目标path上
- 网页打开url默认hash值是/路径
- redirect是设置要重定向到哪个路由路径
例如: 网页默认打开, 匹配路由"/", 强制切换到"/home"上
const routes = [
{
path: "/", // 默认hash值路径
redirect: "/home" // 重定向到/find
// 浏览器url中#后的路径被改变成/find-重新匹配数组规则
}
]
总结: 强制重定向后, 还会重新来数组里匹配一次规则
3.1路由404
统一处理异常地址:那些个正常配置的地址之外的地址。
示例: 通过通配符*,设置404页面
import NotFound from "@/components/NotFound";
const routes = [
{
path: "/",
redirect: "/home" // 重定向
},
// ...正常路由
{ // 当上面路由都不匹配, 匹配这个通配符, 显示NotFound页面
path: "*",
component: NotFound
}
]
总结: 如果路由未命中任何规则, 给出一个兜底的404页面
4.0编程式导航
用JS代码跳转, 声明式导航用a标签
4.1编程式导航 - 基础使用
语法:
this.$router.push({
path: "路由路径",
或
name: "路由名"
})
4.2 编程式导航 - 跳转传参
目标: JS跳转路由, 传参
语法 query / params 任选 一个
this.$router.push({
path: "路由路径"
name: "路由名",
query: {
"参数名": 值
}
params: {
"参数名": 值
}
})
// 对应路由接收 $route.params.参数名 取值
// 对应路由接收 $route.query.参数名 取值
注意:
1.用query方法传参,path与name都可以使用,虽然用name跳转, 但是url的hash值还是切换path路径值
2.使用path会自动忽略params,若要用params传参,必须在路由对象中添加name属性,以供使用
3.如果当前url上"hash值和?参数"与你要跳转到的"hash值和?参数"一致, 爆出冗余导航的问题, 不会跳转路由,会报错
// 跳转页面不传参
this.$router.push('/路由路径')
this.$router.push({path: '路由路径'})
this.$router.push({name: '路由名称'})
// 跳转并query传参-方式1
this.$router.push("/路由路径?参数1=值1&参数2=值2")
// 跳转并query传参-方式2
this.$router.push({
path: "路由路径",
query: {
"参数1":值1,
"参数2":值2
}
})
// 跳转并params传参-方式1
this.$router.push("/路由路径/值1/值2")
// 跳转并params传参-方式2
this.$router.push({
name: "路由名称",
params: {
"参数1":值1,
"参数2":值2
}
})
// 后退
$router.back()
5.0路由嵌套
原理:router-view中再次包含router-view。
背景:一个组件内部包含的业务还是很复杂,需要再次进行拆分。
示例:
routes:[
{
path: '/page1',
component: Page1, // 这个组件内部还有router-view
children: [
{
path:'', // path为空,表示当 #/page1时,显示 Page1组件+组件1
component: 组件1 //
},
{
path:'/xx1', // path以/开头,表示当 #/xx1时,显示 Page1组件+组件2
component: 组件2
},
{
path:'xx2', // path以/开头,表示当 /page1/xx2时,显示 Page1组件+组件3
component: 组件3
}
]
}
]
总结:
- 在已有的路由容器中,再实现一套路由,再套一个路由容器,叫:嵌套路由。
- 嵌套路由除了 router-view 之间需要嵌套,路由规则也需要通过children来实现嵌套
未完待续......