router

81 阅读1分钟

router

依赖

直接看这这里 初始化

开始

创建路由器实例

一般在/src/router/下创建index.ts,即/src/router/index.ts

import { createRouter, createWebHistory } from "vue-router"//依赖
const router = createRouter({
    history:createWebHistory(),// 
    routes:[
        {
            path:'/home',
            name:'home',
            component : ()=> import('@/pages/home/index.vue')
        },
        {
            path:'/',
            redirect: '/home'
        }
    ]
})
export default router

注册路由器组件

const app = createApp(App)
app.use(router)

路由路径传参

const routes = [
  // 动态字段以冒号开始
  { path: '/users/:id', component: User },
]

接收

{{ $route.params.id }}
匹配模式匹配路径route.params
/users/:username/users/eduardo{ username: 'eduardo' }
/users/:username/posts/:postId/users/eduardo/posts/123{ username: 'eduardo', postId: '123' }
import { useRouter } from 'vue-router'

const router = useRouter()

// 字符串路径
router.push('/users/eduardo')

// 带有路径的对象
router.push({ path: '/users/eduardo' })

// 命名的路由,并加上参数,让路由建立 url
router.push({ name: 'user', params: { username: 'eduardo' } })

// 带查询参数,结果是 /register?plan=private
router.push({ path: '/register', query: { plan: 'private' } })

// 带 hash,结果是 /about#team
router.push({ path: '/about', hash: '#team' })

路由守卫

@/router/defend.ts 位置其实没固定,但我选择放这里,是路由的东西放这里容易管理 引入写@/router/index.ts路由文件defend(router)也行

import useUserStore from "@/store/user";
import pinia from "@/store";
const defend = (router: any) => {
  // 未登录可以访问的路由
  const whiteList = ["/book_login", "/"];
  // 导入仓库实例
  const userStore = useUserStore(pinia);

  router.beforeEach((to: any, from: any, next: any) => {
    // 判断to.name是为了防止循环login
    if (userStore.userToken != null && to.name !== "login") {
      next();
    } else {
      if (whiteList.includes(to.path)) {
        next();
      } else {
        next({ name: "login", query: { redirect: to.fullPath } });
      }
    }
    return false;
  });
};

export default defend;