Vue 3 路由简单应用

Vue Router 是 Vue.js 的官方路由管理器。它和 Vue.js 的核心深度集成,使得构建单页面应用(SPA)变得简单而高效。Vue 3 是 Vue.js 的最新主要版本,它带来了许多新特性和改进,相应地,Vue Router 也进行了更新以充分利用这些新特性。

Vue Router 的安装和使用

首先,你需要安装 Vue Router。如果你使用 Vue CLI 创建项目,可以在创建时直接包含 Vue Router。如果是现有项目,可以通过 npm 或 yarn 进行安装:

shell 复制代码
npm install vue-router@next
# 或者
yarn add vue-router@next

接下来,你需要在你的 Vue 应用中设置路由。这涉及到创建一个路由器实例并将其传递给 Vue 应用实例:

javascript 复制代码
import { createRouter, createWebHistory } from 'vue-router';
import Home from '../views/Home.vue';
import About from '../views/About.vue';

// 定义路由
const routes = [
  { path: '/', component: Home },
  { path: '/about', component: About },
];

// 创建路由器实例
const router = createRouter({
  history: createWebHistory(),
  routes,
});

// 创建并挂载根实例
const app = createApp(App);
app.use(router);
app.mount('#app');

路由导航

一旦设置了路由,你就可以在应用中通过 <router-link> 组件来导航。例如:

html 复制代码
<router-link to="/">Home</router-link>
<router-link to="/about">About</router-link>

<router-link> 会被渲染为带有正确 href 属性的 <a> 标签,但是它会阻止浏览器默认的链接点击行为,从而避免重新加载页面。

路由视图

当路由匹配时,相应的组件将会被渲染到 <router-view> 组件中:

html 复制代码
<router-view></router-view>

核心概念

动态路由匹配

Vue Router 允许你定义动态路由,这些路由可以匹配多种模式,并且可以根据 URL 参数来渲染组件:

javascript 复制代码
const routes = [
  { path: '/users/:id', component: User },
];

在组件内,你可以通过 this.$route.params.id 来访问这个动态段。

嵌套路由

Vue Router 也支持嵌套路由,允许你构建更复杂的应用结构:

javascript 复制代码
const routes = [
  {
    path: '/user/:id',
    component: User,
    children: [
      {
        // 当 /user/:id/profile 匹配成功,
        // UserProfile 将被渲染在 User 的 <router-view> 中
        path: 'profile',
        component: UserProfile,
      },
    ],
  },
];

导航守卫

导航守卫是一些可以在路由导航发生之前或之后执行的钩子。它们可以用来保护路由,解析数据,或者做一些在路由转换时的通用需求:

javascript 复制代码
router.beforeEach((to, from, next) => {
  // 检查用户是否登录
  if (to.meta.requiresAuth && !auth.isLoggedIn()) {
    next('/login');
  } else {
    next();
  }
});

路由元信息

在 Vue Router 中,你可以为每个路由定义额外的信息,即元信息(meta fields)。这些信息在路由对象的 meta 字段内定义,并且可以在导航守卫中访问,用来控制访问权限、设置页面标题等。

javascript 复制代码
const routes = [
  {
    path: '/secure',
    component: SecurePage,
    meta: { requiresAuth: true }
  },
  {
    path: '/public',
    component: PublicPage,
    meta: { title: 'Public Page' }
  },
];

router.beforeEach((to, from, next) => {
  if (to.matched.some(record => record.meta.requiresAuth)) {
    // 此路由需要授权,请检查是否已登录
    // 如果没有,重定向到登录页面
    if (!isLoggedIn()) {
      next('/login');
    } else {
      next();
    }
  } else {
    next(); // 确保一定要调用 next()
  }

  if (to.meta.title) {
    document.title = to.meta.title;
  }
});

过渡效果

Vue Router 允许你为路由之间的切换添加过渡效果。这是通过将 <router-view> 包裹在 <transition> 元素内实现的。

html 复制代码
<transition name="fade" mode="out-in">
  <router-view></router-view>
</transition>

然后你可以在 CSS 中定义过渡样式:

css 复制代码
.fade-enter-active, .fade-leave-active {
  transition: opacity .5s;
}
.fade-enter, .fade-leave-to /* .fade-leave-active in <2.1.8 */ {
  opacity: 0;
}

路由懒加载

路由懒加载是一种优化技术,用于减少应用的初始加载时间。通过将每个路由页面分成独立的代码块,这些代码块只有在用户实际访问该路由时才会被加载。

在 Vue Router 中,你可以通过动态导入(使用 import() 语法)来定义路由组件,这会告诉 Webpack 自动将这个组件分割成一个单独的代码块。

javascript 复制代码
const User = () => import('../components/User.vue');

const routes = [
  {
    path: '/user/:id',
    component: User
  }
];

路由状态

Vue Router 的状态是响应式的,这意味着你可以从任何组件内访问当前路由信息,并且当路由改变时,任何依赖这些信息的组件都会自动更新。路由对象 $route 和路由器实例 $router 提供了访问当前路由状态的接口。

  • $route 包含了当前路由的信息,如路径、查询参数、散列值等。
  • $router 是路由器实例,允许你进行编程式的导航,如 $router.push 或 $router.replace。
javascript 复制代码
export default {
  computed: {
    // 使用计算属性来返回当前路由的状态
    username() {
      // 假设路径是 /user/username
      return this.$route.params.username;
    }
  }
};

在 Vue 3 中,由于 Composition API 的引入,你还可以使用 useRoute 和 useRouter 这样的组合式函数来访问路由状态和路由器实例。

javascript 复制代码
import { useRoute, useRouter } from 'vue-router';

export default {
  setup() {
    const route = useRoute();
    const router = useRouter();
    // 使用 route 和 router 对象
  }
};
相关推荐
卸任7 小时前
Vibe coding工具使用心得
前端·ai编程
brien98 小时前
为什么模型标称 1M,Google Antigravity 聊到 256K 却突然失忆?我们给它做了个原生行内监控圆环
前端
修炼的dance8 小时前
录屏关键帧间隔多少合适?六档实测,2秒到10秒小了75.6%
前端
Lank_M8 小时前
关键帧从1秒拉到10秒,录屏小87.3%,摄像头小10.8%
前端
补码缩写8 小时前
用 ffprobe 拆录屏,八成字节在 29 个关键帧上
前端
百思不得小李8 小时前
一个复杂的动态表单是如何实现的
前端·设计模式
陈随易8 小时前
Cmder 停更 17 个月,2.0 支持 Windows Terminal
前端·后端·程序员
风骏时光牛马9 小时前
前沿视界
前端
kyriewen9 小时前
我扫了 814 个依赖,97 个还敢要 Node 10
前端·javascript·程序员
陈随易9 小时前
3000 万人在用的翻译插件,重写一遍就是一门生意
前端·后端·程序员