一、路由简介
- 前端路由:
- SPA:
- 单页面应用程序;
- 基于前端路由技术;
- 优点:
- 局部刷新,用户体验更好;
- 数据传递容易,开发效率高;
- 缺点:
- 开发成本高;
- 首次加载会比较慢,不利于SEO优化;
二、vue-router 使用步骤
- 下包:
yarn add vue-router@3.5.3
- 下载太高版本的VueRoute会报错的;
main.js 导包:
import VueRouter from 'vue-router
- 注册:
- 使用
Vue.use(VueRouter) 进行注册;
- 一旦注册了路由插件,会给Vue提供两个全局组件和两个全局对象;
- 全局组件:
RouterLink 和 RouterView;
- 全局对象:
$router 和 $route;
- 创建路由规则数组:
- 属性名是固定的;
- 配置 path 和 component 的关系;
- Vue中路由指的是:
- 路径(path) 和 组件(component) 的映射关系(不同的路径对应不同的组件);
- 创建路由实例:
- 注入:
- 给出口
- 在合适的页面中增加给路由出口
<router-view />(单双标签都可);
- 路由的运作原理:
- 当 浏览器url地址 发生改变 的时候,在
router 数组中 从上往下 查找 对应的path,如果 命中(全等)了,则用 path 对应的 component 替换掉 <router-view /> 的位置。
- 示例展示:
import Vue from 'vue'
import App from './App.vue'
Vue.config.productionTip = false
import VueRouter from 'vue-router'
Vue.use(VueRouter)
import Find from './views/Find.vue'
import My from './views/My.vue'
import Friend from './views/Friend.vue'
import NotFind from './views/NotFind.vue'
const routes = [
{
path: '/',
redirect: '/find'
},
{
path: '/find',
component: Find
},
{
path: '/my',
component: My
},
{
path: '/friend',
component: Friend
},
{
path: '*',
component: () => import('./views/NotFind.vue')
}
]
const router = new VueRouter({
routes,
linkActiveClass: 'on-active',
linkExactActiveClass: 'off-active'
})
new Vue({
router,
render: h => h(App),
}).$mount('#app')
三、声明式导航 - RouterLink
router-link:
VueRouter 在 全局注册 的 组件,本质 就是 a标签;
3.1 ❗ RouterLink 怎么使用?
3.2 RouterLink 的 好处?
- 自带 激活时 的 类名,可以做高亮效果;
- 配置激活类型(类名自定义):
四、重定向和路由模式
4.1 Vue路由重定向
- 匹配
path 后,强制跳转 path路径;
- 如何检测默认路由?
- 如何重定向路由路径?
redirect 配置项,属性值 为要 强制切换 的 路由路径;

- 说明:
- 当检测到浏览器的url地址是
/的时候,就跳转到 Find 组件;
4.2 Vue路由配置404页面
- 放在 路由规则数组 最后面,
path 从上往下 匹配,如果前面没有匹配上的 path 就命中最后这个 * (任意路径都能访问该路径对应的组件);
- 配置步骤:
- 先准备一个
404 组件;
- 在 路由规则数组 的 最后面 添加一个配置项;
path 为 *(如果把该配置项放在前面,那显示的页面全部都是404了😂);

4.3 路由模式
- 路由有两种模式:
- 切换路由模式:
- 在 创建路由实例 的 配置项 中,有 mode属性,可以配置路由模式,属性值就是
hash 和 history;
- 示例展示:

五、声明式导航传参
- 在跳转路由时,可以给对应的组件内传值;
- 声明式导航 -
router-link;
5.1 查询字符串传参(参数出现在浏览器url地址上)
5.1.1 字符串拼接传参
- 跳转的时候传值:
- 在对应的组件接收值:
- 在标签中写不需要
this,在js中书写还是需要的;
this.$route.query;


5.1.2 配置对象传参
5.2 动态路由传参
- ❗ 动态路由传参,接收值 的时候,看 params;
- 先占位(改造规则数组),再传值(有几个占位的参数名,就产几个参数值),最后接值(
$route.params.参数名);
- 步骤:
- 需要先对 规则数组 对应的path 进行改造:

- 传参:
- 接值:
$route.params.参数名
this.$route.params.参数名
- 示例展示:

- ❗ 注意:
- 动态路由 不能通过
path + params 配合,因为path会忽略params;
- 这里的
path指的是,RouterLink的to属性的属性值中不能出现path;
- 正确方式:
name(需要给对应的路由取名,也叫命名路由) + params;
- 虽然写的是对象,但是最终会转为字符串;
六、编程式导航
$route 和 $router 区别:
$route:
$router:
- 实现路由跳转,
$router.push()实现跳转;
- 挂载后(使用
mounted钩子函数),延迟n秒,自动跳转到指定页面(主要是路由跳转和传参的语法展示):
mounted() {
setTimeout(() => {
this.$router.push('/path')
this.$router.push({
path: '/path'
})
this.$router.push('/path?属性名1=属性值1&属性名2=属性值2&……')
this.$router.push({
path: '/path',
query: {
属性名1: 属性值1,
属性名2: 属性值2,
……
}
})
{
path: '/path/:属性名1/:属性名2……',
}
this.$router.push('/path/属性值1/属性值2……')
{
path: '/path/:属性名1/:属性名2……',
name: '对应component'
}
this.$router.push({
name: '规则数组name属性值',
params: {
属性名1: 属性值1,
属性名2: 属性值2,
……
}
})
}, n);
}
- 示例展示:

七、路由嵌套
- 二级路由如何配置:
- 创建需要的二级路由组件;
- 在路由规则数组里面对应的对象里面新增
children 属性(属性值 = 数组对象),在里面配置二级路由规则对象(path + component);
- 对应第一季页面设置给出口,显示二级路由页面;
- 二级路由主要注意什么?
- 示例展示:
- 在views里创建对应二级页面组件并导入到main.js中;

- 在对应的规则数组里面,新增children属性,在里面配置二级路由规则对象;

- 在对应一级组件里面设置出口以及router-link的to属性;

八、导航守卫
import Vue from 'vue'
import VueRouter from 'vue-router'
const routes = []
const router = new VueRouter({
routes
})
router.beforeEach((to, from, next) => {
})
router.afterEach()
- 今后在项目中判断
token(令牌) 是否为空字符串,可知道用户是否登录;
- 示例展示:
next函数传值:
false,停留在原地;
- 不传之表示正常放行

九、路由元信息
- 通过
meta 字段可以给路由添加更多信息;
- 取值:
this.$route.meta.参数名

