Vue路由的基本概念

Vue路由的基本概念

Vue 路由是一个非常重要的概念,它允许你在应用程序中创建多个页面并在这些页面之间进行导航。在 Vue 中,路由是通过 Vue Router 实现的。本文将介绍 Vue Router 的基本概念和用法,并对路由配置进行详细解析。

基础认知/路由

路由是指应用程序中的一个页面。在 Vue 中,路由通常由一个组件表示。

路由器

路由器是一个 JavaScript 对象,用于实现路由。在 Vue 中,路由器通常由 Vue Router 实现。

路由表

路由表是一个定义应用程序中所有路由的 JavaScript 对象。路由表指定了每个路由的路径、组件和其他参数。

##路由参数
路由参数是指在路由路径中的动态部分。路由参数可以通过 $route.params 对象访问。

配置路由

要配置路由,你需要按照以下步骤操作:

路由的安装配置

安装 Vue Router

使用 npm 安装

npm install vue-router

使用 yarn 安装

yarn add vue-router

基础使用

创建路由表

在创建 Vue 应用程序之前,你需要创建一个路由表。路由表是一个 JavaScript 对象,用于定义应用程序中的所有路由。例如:

// src/router/index.js

import Vue from 'vue';
import Router from 'vue-router';
import Home from '@/views/Home.vue';
import About from '@/views/About.vue';

Vue.use(Router);

export default new Router({
    
    
  mode: 'history',
  routes: [
    {
    
    
      path: '/',
      name: 'home',
      component: Home,
    },
    {
    
    
      path: '/about',
      name: 'about',
      component: About,
    },
  ],
});

在上面的代码中,我们创建了一个名为 index.js 的文件,并在其中定义了一个路由表。该路由表由两个路由组成:一个用于主页(路径为 /)和一个用于关于页面(路径为 /about)。每个路由都指定了一个名称、一个组件以及其他参数(例如路径)。

在 Vue 应用程序中使用路由器

一旦你创建了路由表,你需要在 Vue 应用程序中使用路由器。为此,请在 main.js 文件中导入路由器,并将其传递给 Vue 实例,如下所示:

// src/main.js

import Vue from 'vue';
import App from '@/App.vue';
import router from '@/router';

new Vue({
    
    
  router,
  render: (h) => h(App),
}).$mount('#app');

在上面的代码中,我们将路由器作为选项传递给 Vue 实例。现在,你的应用程序已经配置好了路由器。
路由参数
路由参数是指在路由路径中的动态部分。例如,在以下路由中:

{
    
    
  path: '/users/:id',
  component: User,
}

:id 是一个路由参数。你可以通过 $route.params.id 访问该参数的值。例如,如果 URL 是 /users/123,则 $route.params.id 的值将是 123。

嵌套路由
嵌套路由是指一个路由中包含另一个路由。例如,以下路由表定义了一个名为 User 的父路由和一个名为 Profile 的子路由:

{
    
    
  path: '/user/:id',
  component: User,
  children: [
    {
    
    
      path: 'profile',
      component: Profile,
    },
  ],
}

在上面的代码中,User 路由包含一个名为 Profile 的子路由。当导航到 /user/:id/profile 时,将渲染 Profile 组件。

##路由导航

在 Vue 中,路由导航是指在路由之间进行切换。你可以使用 元素或编程方式导航到一个路由。

元素是一个 Vue 组件,它允许你在应用程序中创建链接。例如:
<router-link to="/">Home</router-link>
<router-link to="/about">About</router-link>

在上面的代码中,我们使用 元素创建了两个链接,一个指向主页,一个指向关于页面。

编程式导航
你也可以使用编程式导航在路由之间进行切换。要导航到一个路由,你可以使用 $router.push() 方法。例如:

this.$router.push('/');

在上面的代码中,我们使用 $router.push() 方法将当前路由切换到主页。

路由守卫
路由守卫是指在路由导航期间执行的操作。你可以使用路由守卫来控制路由导航、检查用户身份验证以及执行其他操作。

全局路由守卫
全局路由守卫是指在所有路由导航期间执行的操作。你可以使用全局路由守卫来执行通用操作(例如检查用户是否已登录)。

const router = new VueRouter({
    
     ... });

router.beforeEach((to, from, next) => {
    
    
  // 检查用户是否已登录
  if (!isAuthenticated && to.path !== '/login') {
    
    
    next('/login');
  } else {
    
    
    next();
  }
});

在上面的代码中,我们使用 router.beforeEach() 方法注册了一个全局路由守卫。该守卫检查用户是否已登录,如果没有登录,则将路由导航到登录页面。

路由独享守卫
路由独享守卫是指在单个路由导航期间执行的操作。你可以使用路由独享守卫来控制单个路由的导航。

const router = new VueRouter({
    
    
  routes: [
    {
    
    
      path: '/dashboard',
      component: Dashboard,
      beforeEnter: (to, from, next) => {
    
    
        // 检查用户是否有权限访问该路由
        if (!hasPermission) {
    
    
          next('/unauthorized');
        } else {
    
    
          next();
        }
      },
    },
  ],
});

在上面的代码中,我们在 Dashboard 路由上使用了 beforeEnter 守卫。该守卫检查用户是否有权限访问该路由,如果没有则将路由导航到未授权页面。

组件内守卫
组件内守卫是指在组件导航期间执行的操作。你可以使用组件内守卫来控制组件的导航。

export default {
    
    
  beforeRouteEnter(to, from, next) {
    
    
    // 在进入该组件之前执行操作
    next();
  },

  beforeRouteLeave(to, from, next) {
    
    
    // 在离开该组件之前执行操作
    next();
  },
};

在上面的代码中,我们在一个组件中使用了 beforeRouteEnter 和 beforeRouteLeave 守卫。这些守卫允许我们在进入和离开该组件之前执行操作。

路由使用过程中遇到的问题总结

一.跳转重复路由参数更改,页面无刷新的解决方案()

  1. 创建监听路由函数,路径发生变化后,动态去获取数据
  2. 给路由添加key值。可以在根路由上为其分配一个唯一key。采用$route.fullpath作为其唯一key。这样vue就回认为内部路由每个都是不同的路由,在跳转时便会强制刷新组件

二.路由跳转不生效或者跳转后页面没有内容显示。

这种情况可能是因为路由配置有误或者路由组件的代码存在问题。建议检查路由配置是否正确,组件代码是否存在语法错误或者逻辑问题。还可以通过在浏览器控制台查看错误信息来定位问题。

三.路由参数传递错误或者获取不到路由参数。

可能是因为路由参数传递方式不正确或者组件代码没有正确获取路由参数。建议检查路由参数的传递方式是否正确,组件代码是否正确获取路由参数。

四.路由切换时页面闪烁或者出现短暂的空白页面。

可能是因为路由组件的代码存在问题或者路由切换时加载的资源过多导致页面加载速度变慢。建议检查组件代码是否存在性能问题,优化组件代码。还可以通过使用异步组件、代码拆分等方式来优化页面加载速度。

五.路由权限控制不生效或者存在漏洞。

路由权限控制的代码存在问题或者路由配置有误。建议检查路由权限控制的代码是否正确,路由配置是否正确

作者:郭鹏浩

猜你喜欢

转载自blog.csdn.net/ekcchina/article/details/131188477