详解vue路由

详解Vue路由

Vue.js是一个基于Web的JavaScript框架,它被广泛用于现代web应用程序的构建中。Vue使用可复用的组件和可组合的组件模式来构建用户界面,其中Vue路由是其中一个核心功能。在这篇文章中,我们将会详细介绍如何使用Vue路由构建单页应用程序。

什么是Vue路由?

Vue路由是Vue.js框架提供的一种官方解决方案,用于将不同URL对应到不同的Vue组件中。Vue路由是一种让单页应用程序更易于管理的方式,它使用户可以在单页应用程序中浏览不同的页面,同时也允许用户以一种非常自然的方式对页面进行切换。

安装Vue路由

Vue.js框架默认不包含Vue路由,需要单独安装。可以使用npm或yarn安装:

# 使用npm
npm install vue-router

# 使用yarn
yarn add vue-router

配置Vue路由

在Vue应用程序中使用Vue路由需要进行配置。首先,在Vue应用程序的入口文件中导入Vue路由:

import Vue from 'vue';
import VueRouter from 'vue-router';

Vue.use(VueRouter);

然后,定义Vue路由器:

const router = new VueRouter({
  routes: []
});

这里的routes是一个数组,包含应用程序的路由。下面我们将演示如何配置一个简单的Vue路由示例。假设我们有一个Vue组件HelloWorld,我们想要将它作为我们应用程序的首页,那么我们需要将其配置为Vue路由的根路由:

import HelloWorld from '@/components/HelloWorld.vue';

const router = new VueRouter({
  routes: [
    {
      path: '/',
      name: 'HelloWorld',
      component: HelloWorld
    }
  ]
});

现在,我们可以将路由器实例注入Vue实例中,启用Vue路由:

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

在Vue应用程序中定义了其中一个路由后,我们需要将路由关联到指定的HTML元素上,假设我们的HTML元素的id为app,则可以使用以下方式将路由关联到Vue实例中:

<div id="app">
  <router-view></router-view>
</div>

现在,我们的Vue路由已经在应用程序中运行起来了。

Vue路由的路径匹配

Vue路由使用类似于Unix shell的路径匹配规则。下面是一些Vue路由中的示例路径和相应的匹配规则:

const router = new VueRouter({
  routes: [
    {
      path: '/user/:username',
      component: User,
      props: true
    },
    {
      path: '/user-:userId',
      component: User,
      props: true
    },
    {
      path: '/search/:query',
      component: SearchResults
    },
    {
      path: '/about',
      component: About
    },
    {
      path: '/contact',
      component: Contact
    }
  ]
})

/user/:username:匹配/user/后面的任何字符,如果想把匹配到的参数传递给组件,在路由配置中加入 props: true 即可。

/user-:userId:匹配/user-后面的任何字符,如果想把匹配到的参数传递给组件,在路由配置中加入 props: true 即可。

/search/:query:匹配/search/后面的任何字符

/about:匹配/about

/contact:匹配/contact

Vue路由的导航

在Vue路由中,导航分为两种类型:声明式导航和编程式导航。声明式导航通过Vue中的router-link组件实现,而编程式导航可以通过$router API实现。

  1. 声明式导航

在Vue应用程序中,使用router-link组件创建导航链接。router-link组件允许我们在不使用HTTP请求的情况下,通过HTML链接进行页面之间的切换,只需要设置to属性为目标URL即可。

<router-link to="/about">About</router-link>
<router-link :to="{ path: '/usr-' + $route.params.userId }">User</router-link>
  1. 编程式导航

在Vue路由中,我们可以使用$router API实现编程式导航。例如,我们可以定义导航方法:

methods: {
  goToAbout() {
    this.$router.push('/about');
  },
  goToUser(userId) {
    this.$router.push('/user-' + userId);
  }
}

通过调用$router.push()方法可以实现跳转到目标页面。

Vue路由的参数传递

在Vue路由中,我们可以通过props属性将参数传递给组件。在路由配置中加入props: true即可。例如:

const router = new VueRouter({
  routes: [
    {
      path: '/user/:userId',
      component: User,
      props: true
    }
  ]
});

上面的配置指定了 User 组件需要传递参数userId,我们接下来在组件内部可以直接通过 $route.params.userId 获取到传入的参数值。

<template>
  <div>
    User ID: {{ $route.params.userId }}
  </div>
</template>

例如: http://yourdomain.com/user/123,就可以在User组件中使用this.$route.params.userId获取到参数123的值。

示例1:热门列表,点击进入详情页

热门列表使用了一个list组件,该组件通过axios发起网络请求获取到热门列表数据,并通过props方式传递给listItem组件。在listItem组件中,我们在template中使用router-link实现详情页的跳转,将 id 作为参数传递给详情页。

<!-- list.vue -->
<template>
  <ul>
    <li v-for="item of listItems" :key="item.id">
      <list-item :item="item" />
    </li>
  </ul>
</template>

<script>
import axios from 'axios';
import ListItem from './ListItem.vue';

export default {
  components: {
    ListItem
  },
  data() {
    return {
      listItems: []
    };
  },
  created() {
    axios
      .get('http://yourdomain.com/api/hot-list')
      .then(response => {
        this.listItems = response.data;
      })
      .catch(error => {
        console.log(error);
      });
  }
};
</script>
<!-- ListItem.vue -->
<template>
  <router-link :to="{ name: 'Detail', params: { id: item.id } }">
    {{ item.name }}
  </router-link>
</template>

<script>
export default {
  props: {
    item: {
      type: Object,
      required: true
    }
  }
};
</script>

在router/index.js文件中,定义了名为Detail的路由,将参数id传递给Detail组件,在Detail.vue中可以使用$route.params.id获取参数id的值。

import Vue from 'vue';
import VueRouter from 'vue-router';
import Detail from '../views/Detail.vue';

Vue.use(VueRouter);

const routes = [
  {
    path: '/',
    name: 'Home',
  },
  {
    path: '/detail/:id',
    name: 'Detail',
    component: Detail,
    props: true
  }
];

const router = new VueRouter({
  mode: 'history',
  base: process.env.BASE_URL,
  routes
});

export default router;

在Detail.vue文件中使用$route.params.id获取参数值,然后将该值用于向服务器获取数据,最后在页面中展示。

示例2:私有页面路由认证

在这个示例中,我们将展示如何使用Vue路由实现私有页面路由认证。如果用户尝试访问受保护的页面(如个人资料或管理控制面板),并且未登陆,则需重定向到登录页面,等到用户成功登录后才能访问受保护的页面。

此示例中,我们将使用Vue路由器中的 beforeEach 导航守卫来检查是否登陆。每个页面加载之前都会调用一次导航守卫的 beforeEach 方法,如果未登陆,则重定向到登录页面。

在Main.vue文件中,我们定义了两个私有链接:个人资料和管理面板,这些链接只有在用户已经登陆之后才能够访问。

<!-- Main.vue -->
<template>
  <div>
    <div>
      <router-link to="/">Home</router-link>
    </div>
    <div>
      <router-link v-if="$store.state.isLoggedIn" to="/profile"
        >Profile</router-link
      >
    </div>
    <div>
      <router-link v-if="$store.state.isLoggedIn" to="/admin"
        >Admin</router-link
      >
    </div>
    <div>
      <button @click="$store.dispatch('logout')">Logout</button>
    </div>
    <router-view></router-view>
  </div>
</template>

在router/index.js文件中,我们在导航守卫beforeEach方法中检查是否登陆,如果未登陆,则重定向到登录页面。

import Vue from 'vue';
import VueRouter from 'vue-router';
import Login from '../views/Login.vue';
import Main from '../views/Main.vue';
import Profile from '../views/Profile.vue';
import Admin from '../views/Admin.vue';

Vue.use(VueRouter);

const routes = [
  {
    path: '/login',
    name: 'Login',
    component: Login
  },
  {
    path: '/',
    name: 'Main',
    component: Main
  },
  {
    path: '/profile',
    name: 'Profile',
    component: Profile,
    meta: {
      requiresAuth: true
    }
  },
  {
    path: '/admin',
    name: 'Admin',
    component: Admin,
    meta: {
      requiresAuth: true,
      requiresAdmin: true
    }
  }
];

const router = new VueRouter({
  mode: 'history',
  base: process.env.BASE_URL,
  routes
});

router.beforeEach((to, from, next) => {
  const isLoggedIn = store.state.isLoggedIn;

  if (to.matched.some(record => record.meta.requiresAuth)) {
    if (!isLoggedIn) {
      next({ path: '/login', query: { redirect: to.fullPath } });
      return;
    }
  }

  if (to.matched.some(record => record.meta.requiresAdmin)) {
    if (!isLoggedIn || !store.state.currentUser.isAdmin) {
      next({ path: '/', query: { redirect: to.fullPath } });
      return;
    }
  }

  next();
});

export default router;

在前置导航守卫beforeEach方法中检查是否登陆以及用户是否是管理员,如果未登陆或不是管理员,则重定向到登录页面。

以上就是Vue路由的详细讲解,结合示例可以帮助大家更好的理解Vue路由的使用。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解vue路由 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • 在Vue环境下利用worker运行interval计时器的步骤

    在Vue环境下利用worker运行interval计时器的步骤可以分为以下几步: 创建worker文件 在项目根目录下新建一个worker.js文件(文件名可以自定义),用来处理计时器的逻辑。 在Vue组件中引入worker文件 在Vue组件中引入worker.js文件,可以通过import的方式: import MyWorker from "@/…

    Vue 2023年5月29日
    00
  • 详解vue生命周期

    当我们开发 Vue.js 应用时,Vue 实例会经历一系列的过程,这些过程被称为“生命周期”。Vue 提供了一些钩子函数,让我们在生命周期不同时刻执行代码以达到相应的目的。下面将详解 Vue 生命周期的完整攻略。 生命周期概述 Vue 生命周期分为八个阶段,每个阶段对应一个钩子函数,以下是八个阶段的钩子函数: beforeCreate:在实例初始化之后,数据…

    Vue 2023年5月28日
    00
  • 浅谈vue中文件下载的几种方式及方法封装

    下面是针对“浅谈vue中文件下载的几种方式及方法封装”的完整攻略。 1. 传统方式的文件下载 在Vue中,最简单的方式就是使用传统方式的文件下载,这种方式是利用a标签的download属性,直接下载文件。 <template> <div> <a :href="downloadUrl" download=&qu…

    Vue 2023年5月28日
    00
  • 结合康熙选秀讲解vue虚拟列表实现

    针对您提出的问题,我将对“结合康熙选秀讲解vue虚拟列表实现”的攻略进行详细解答。 首先,需要明确的是,vue虚拟列表是通过限定渲染范围,来达到渲染大量数据的优化方式。这里的渲染范围指的是视口,即用户实际看到的部分。 下面是“结合康熙选秀讲解vue虚拟列表实现”的完整攻略: 1. 实现原理 使用虚拟列表的核心思想是只渲染可见区域的数据项,对于未显示的部分只需…

    Vue 2023年5月29日
    00
  • vue 获取及修改store.js里的公共变量实例

    获取和修改vue中的全局变量通常需要使用Vuex。Vuex是一个专业用于管理Vue应用中的状态(state)的库。它支持将状态集中在单个位置中,以便更轻松地进行管理和交互。 下面是如何在vue中获取和修改store.js里的公共变量实例的详细攻略: 安装依赖 为了使用Vuex,您需要先安装它。您可以在项目中使用以下命令安装它: npm install vue…

    Vue 2023年5月27日
    00
  • vue原理Compile之optimize标记静态节点源码示例

    Vue的Compile阶段是将模板解析成AST并分析依赖收集,生成渲染函数的阶段。在这个阶段,Vue会对静态节点进行标记,优化渲染性能。其中,有一个关键的标记项就是 optimize。 optimize的主要作用是标记已知的静态根节点。如果一个静态节点不是根节点,那么其子节点将可能会发生变化,需要被重新渲染。但是,如果该节点被标记为静态节点,则可以避免对其进…

    Vue 2023年5月28日
    00
  • Vue的底层原理你了解多少

    Vue的底层原理 什么是 Vue Vue.js 是一款用于构建用户界面的渐进式框架,其核心库只关注视图层,易于上手且灵活,同时也能与其它库或已有项目整合。Vue.js 功能强大且支持自定义指令和组件。Vue 官方文档使用的是 Markdown 格式编写,这也说明了 Vue 在开发中注重文档规范和易读性。 Vue 的底层原理 Vue 并不是一个黑盒子,其底层原…

    Vue 2023年5月27日
    00
  • vue中$refs的三种用法解读

    下面我将详细讲解一下“vue中$refs的三种用法解读”的完整攻略。 一、$refs的作用 $refs是Vue.js提供的一个特殊的属性,它可以用来在父组件中访问子组件以及HTML元素。它的作用主要有以下三个方面: 访问子组件的实例对象 获取DOM元素的引用 访问子组件中的方法和属性 二、$refs的用法 1. 访问子组件的实例对象 使用$refs可以非常方…

    Vue 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部