Vue Router 是 Vue.js 的官方路由。它与 Vue.js 核心深度集成,让用 Vue.js 构建单页应用变得轻而易举。就是我在页面上点击一个按钮需要跳转到对应的页面,这就是路由跳转。
router-link
#请注意,我们没有使用常规的 a
标签,而是使用一个自定义组件 router-link
来创建链接。这使得 Vue Router 可以在不重新加载页面的情况下更改 URL,处理 URL 的生成以及编码。
- <router-link to="/">Go to Homerouter-link>
- <router-link to="/about">Go to Aboutrouter-link>
router-view
#router-view
将显示与 url 对应的组件。你可以把它放在任何地方,以适应你的布局。
很多时候,我们需要将给定匹配模式的路由映射到同一个组件。例如,我们可能有一个 User
组件,它应该对所有用户进行渲染,但用户 ID 不同。在 Vue Router 中,我们可以在路径中使用一个动态字段来实现,我们称之为 路径参数 :
- //普通路由
- {
- path:"/user",
- name:"user",
- component:()=>import(xxx)
- }
- //传参
- {
- path:"/product/:id",
- name:"product",
- component:xxx
- }
-
- //在页面中获取
- $route.params.id
- //404路由
- //要配置在最后面
- {
- path:"*"
- }
正如其名,vue-router 提供的导航守卫主要用来通过跳转或取消的方式守卫导航。这里有很多方式植入路由导航中:全局的,单个路由独享的,或者组件级的。
你可以使用 router.beforeEach
注册一个全局前置守卫:
- const router = createRouter({ ... })
-
- router.beforeEach((to, from) => {
- // ...
- // 返回 false 以取消导航
- return false
- })
每个守卫方法接收三个参数:
to
: 即将要进入的目标from
: 当前导航正要离开的路由
- const UserDetails = {
- template: `...`,
- beforeRouteEnter(to, from) {
- // 在渲染该组件的对应路由被验证前调用
- // 不能获取组件实例 `this` !
- // 因为当守卫执行时,组件实例还没被创建!
- },
- beforeRouteUpdate(to, from) {
- // 在当前路由改变,但是该组件被复用时调用
- // 举例来说,对于一个带有动态参数的路径 `/users/:id`,在 `/users/1` 和 `/users/2` 之间跳转的时候,
- // 由于会渲染同样的 `UserDetails` 组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用。
- // 因为在这种情况发生的时候,组件已经挂载好了,导航守卫可以访问组件实例 `this`
- },
- beforeRouteLeave(to, from) {
- // 在导航离开渲染该组件的对应路由时调用
- // 与 `beforeRouteUpdate` 一样,它可以访问组件实例 `this`
- },
- }
你可能希望将任意信息附加到路由上,如过渡名称、谁可以访问路由等。这些事情可以通过接收属性对象的meta
属性来实现,并且它可以在路由地址和导航守卫上都被访问到。
一个路由匹配到的所有路由记录会暴露为 $route
对象(还有在导航守卫中的路由对象)的$route.matched
数组。我们需要遍历这个数组来检查路由记录中的 meta
字段,但是 Vue Router 还为你提供了一个 $route.meta
方法,它是一个非递归合并所有 meta
字段的(从父字段到子字段)的方法
- router.beforeEach((to, from) => {
- // 而不是去检查每条路由记录
- // to.matched.some(record => record.meta.requiresAuth)
- if (to.meta.requiresAuth && !auth.isLoggedIn()) {
- // 此路由需要授权,请检查是否已登录
- // 如果没有,则重定向到登录页面
- return {
- path: '/login',
- // 保存我们所在的位置,以便以后再来
- query: { redirect: to.fullPath },
- }
- }
- })
如果大家想了解更多可以去Vue Router进行学习。