Vue3 vue-router
十二月 16, 2020
vue-router
安装
1 | yarn add vue-router@4 |
打造路由实例
- 在 src 目录下新建 router,再新建 index.ts
- router/index.ts (step 1)
1 | // index.ts |
- 在 main.ts 中引入
1 | import router from "./router"; |
在 src 目录下新建 pages 文件夹,再新建一些即将打造的路由(home,application,cate,about,list,not-found),里面写组件
createRouter() 中有两个参数
- history 用于选择路由模式
1
2
3
4
5
6
7
8
9
10路由模式
1. hash模式 比如: #/home
- 兼容性强,ie/其他浏览器
- 写法很别扭
2. history模式 比如: /home
- 新出的,基于html5做出来的,功能强大
- 缺点
- 看起来太像后端接口,所以一旦使用history模式就必须和后端配合使用
- 这家伙看起来也像反向代理标识符,所以切记不能和反向代理标识符一致
- 不兼容ie6-8- routes 路由表
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16用于确定一个路由对应一个组件
{
path: 路由路径 比如: /home
component:路由渲染的组件
meta 元数据 用于携带数据,比如做类似: 权限的功能
redirect 重定向
alias 别名【小名】
children 子路由表 /home/hot
beforeEnter 路由独享守卫,用于判断你是否有权限进入当前路由
}
component后面跟着的组件要使用路由懒加载
1. 写法
1. ()=> import() vue的异步组件
2. /*webpackChunkName:'chunkName'*/ // webpack的代码分割功能router/index.ts (step 2)
1 | // index.ts |
错误路由书写
1 | { |
一级路由和路由嵌套
一级路由
- 在 App.vue 中
- 使用 router-link(这是导航)
- to(声明式跳转链接)
- 使用 router-view(这是视图)
1 | <template> |
路由嵌套
- 在 src/pages/home/index.vue 中
- 路由表即 router 文件夹 index.ts 中 路由要写 children 等数据
1 | <template> |
路由监听
- 小案例 404 的时候上方导航不见
- 通过 navFlag 控制导航的销毁与创建
- 引入 useRoute 并实例化 const route = useRoute()
- watch(()=>route.path,()=>{对应的操作}) 来实现监听路由
1 | import { defineComponent, watch, reactive, toRefs } from "vue"; |
激活路由
- 在 router-link 标签中加 active-class 属性
- 切换的时候动态切换类名实现效果
1 | <li> |
动态路由
- 什么是动态路由?
- url 是变化的,但是呢组件用的是同一个,这就是动态路由
- 动态传参
- 我们从一个组件中将数据携带在 url 上传递到另一个组件中去
- 动态接参
- 我们从 url 中获取参数,然后拿到参数之后进行使用【作为请求的参数】
- /about/index.vue 中 to 属性书写对象,name,params,query 属性
1 | <!-- /about/index.vue --> |
- to 中加了 params 中的 id 属性,所以要在 router 文件夹的 index 中编辑
1 | { |
- 在 pages/list/index.vue 接收传过来的参数
- 从 vue-router 中引入 useRouter 并在 setup 中实例化
- 创建一个 reactive 数据接收参数
- 在挂载阶段,从 route.params 或者 route.query 中拿取数据赋值给 reactive 数据
- return
- 在 template 中使用数据
1 | <template> |
命令式跳转页面
- 从 vue-router 中引入 useRouter
- router 实例中有 push/replace 方法 里面写路径
1 | <template> |
路由的追加、删除、路由是否存在的判断
路由追加
- 引入 useRouter
- 使用实例 router.addRoute() 里面接收对象,之前怎么写路由就怎么写
1 | <template> |
路由删除,路由判断
- router.removeRoute(‘RouterName’)
1 | router.removeRoute("new"); |
- router.hasRoute(‘RouterName’)
1 | router.hasRoute("new"); // 返回布尔值 |
1 | <template> |
过渡动效
- 安装
1 | $ yarn add animate.css |
- 全局引入,在 main.ts 书写
1 | // main.ts |
- 进入 App.vue
- 把之前的 router-view 组件用 transtion 组件包裹起来
- transtion 有三个属性
- mode
- enter-active-class
- leave-active-class
1 | <!-- App.vue --> |
路由元数据
- 我们可以在 routes 中通过 meta 选项来携带一个数据,这个数据可以用来做很多事情,比如
- 头部内容的变化
- 面包屑导航
- 在 router 文件夹中修改 about 路由添加 meta 属性
1 | { |
- 进入 about 组件
- 引入 useroute
- route.meta.title 使用
1 | <template> |
vue-router 中小 tips
- useRoute: 使用数据的时候用它
- useRouter: 使用方法的时候用它
- createRoute: 创建路由的时候用它
导航守卫
什么是导航守卫
- 导航守卫是 vue 提供的用于拦截路由的一种方式
- 类比: 停车场的那个起落杆/保安
导航守卫的类型
- 全局导航守卫【3】
- 全局前置守卫 beforeEach
- 全局解析守卫【用法类似全局前置守卫】 beforeResolve
- 全局后置守卫 afterEach
- 路由独享守卫【1】 beforeEnter
- 组件级守卫【3】
- 组件内前置守卫 beforeRouteEnter
- 组件内更新守卫 beforeRouteUpdate
- 组件内后置守卫 beforeRouteLeave
- 全局导航守卫【3】
令牌: token
- token 的产生: 登录完成之后,后端会返回给我们
提供模拟数据的平台
查看评论