开篇寄语
继续学习Vue.js相关内容,前面的一些基础知识,可以参看下方的前情提要,本篇文章则是来聊一下Vue Router也就是所说的Vue路由,直接点就是Vue导航之意,让我们开始吧。
前情提要
- 《科学入门Vuejs,几个小示例让你爱上它》
- 《Vuejs中各种"v-xxx"都是什么,一篇带示例的文章让你搞清楚》
- 《Vuejs中的methods, computed和watch有何妙用?》
- 《Vuejs中组件开发从初级到高级(一)》
- 《Vuejs中组件开发从初级到高级(二)》
内容详情
本篇文章以Vue 3为例,虽然与Vue 2的差别并不是很大。
现代单页 Web 应用程序 (SPA) 最强大的功能之一是路由。现代单页应用程序(例如 Vue 应用程序)可以在客户端(无需请求服务器)从一个页面转换到另一个页面。 Vue Router 是 Vue 应用程序中用于页面导航的官方库。 Vue Router 使用简单,但功能强大。在本文中,我们将深入探讨 Vue Router 4(与 Vue 3 一起使用)。我们将介绍舒适地使用 Vue Router 所需的一切。
包含内容:
- Vue 路由器基础
- 动态路由
- 如何传递路由器参数
- 延迟加载
Vue 路由器基础
- 新建一个Cli项目并运行:
# Create a new Vue project vue create demo cd demo # start your app by running the following command npm run serve
接下来我们可以通过运行以下命令将 Vue Router 添加到我们的项目中。
vue add router
cli 会询问我们是否需要历史模式。在本教程中,我们将使用历史模式,因此我们将选择是,如下图所示:
让我们来看一下项目文件,是不是多了一些什么?
为我们创建了一个名为 views 的文件夹以及两个文件 About.vue 和 Home.vue。这些文件代表我们的页面。还会生成一个名为 router/index.js 的文件。该文件包含所有路由器配置。让我们打开 router/index.js 文件。内容如下:
import { createRouter, createWebHistory } from 'vue-router' import Home from '../views/Home.vue' const routes = [ { path: '/', name: 'Home', component: Home }, { path: '/about', name: 'About', // route level code-splitting // this generates a separate chunk (about.[hash].js) for this route // which is lazy-loaded when the route is visited. component: () => import(/* webpackChunkName: "about" */ '../views/About.vue') } ] const router = createRouter({ history: createWebHistory(process.env.BASE_URL), routes }) export default router
我们从 vue-router 库中导入 createRouter 和 createWebHistory。接下来,我们从 views/Home.vue 导入 Home 组件。在第 3 行,我们声明了一个名为 routes 的对象数组。这个数组代表我们在应用程序中的路由。这些数组项称为路由对象。第一个路由对象有一个路径 / 这意味着这将是我们的基本 URL。 component 属性表示当用户访问此路径时将呈现的组件。
我们将在此路径上呈现主页。
最后,name 属性表示路由的名称。
接着来看一下App.vue:
<template> <div id="nav"> <router-link to="/">Home</router-link> | <router-link to="/about">About</router-link> </div> <router-view/> </template>
观察路由器链接标签。
Vue 是一个单页应用程序。应用程序的数据已从服务器下载。当我们路由到另一个视图时,应用程序只是隐藏了一些信息并显示了请求的信息。
router-link 标签有一个 to 属性,它指的是要访问的页面。
运行程序,看一下实际效果,如下图所示:
如果多添加一个导航,该如何添加呢?
请继续编辑App.vue文件,如下所示,新建了一个Profile的导航:
<template> <div id="nav"> <router-link to="/">Home</router-link>| <router-link to="/about">About</router-link>| <router-link to="/profile">Profile</router-link> </div> <router-view/> </template>
然后再在views文件夹里面新建一个名为Profile.vue的文件,并书写以下代码:
<template> <div class="home"> Profile Info </div> </template>
然后,再前往index.js编辑该路由内容,代码如下所示:
import { createRouter, createWebHistory } from 'vue-router' import Home from '../views/Home.vue' import Profile from '../views/Profile.vue' const routes = [{ path: '/', name: 'Home', component: Home }, { path: '/profile', name: 'profile', component: Profile, }, { path: '/about', name: 'About', // route level code-splitting // this generates a separate chunk (about.[hash].js) for this route // which is lazy-loaded when the route is visited. component: () => import ( /* webpackChunkName: "about" */ '../views/About.vue') } ] const router = createRouter({ history: createWebHistory(process.env.BASE_URL), routes }) export default router
生成效果如下图所示:
如何传递路由器参数
首先,让我们来看看路由器参数(简称路由器参数)是什么以及它们为什么重要。假设我们的应用程序中有一个页面,我们向用户显示所有可用博客文章的列表。
假设在我们的应用程序中,此路径是 /posts。当用户点击这些文章中的任何一篇时,用户将被带到该文章页面。对于每篇文章,路径都不同(/posts/article-1、/posts/article-2 等)。我们如何实现这一目标?我们可以为我们拥有的每个帖子添加一个新路由,但是每次发布新帖子时我们都必须更改我们的代码。
因此,我们将使用动态路由。
这个时候路由器参数就能派上用场了。
在我们的应用程序中,我们可以指定一个像 /posts 这样的通用路由,然后我们可以像这样 /posts/:id 一样为相同的路由指定可选的路由参数。 :id 选择任何动态字符串作为参数。这意味着我们现在可以路由到 /posts/article-1、/posts/article-2 等路径,并且应用程序中的 Vue 路由器将知道我们尝试去哪条路径。
修改App.vue如下:
<template> <div id="nav"> <router-link to="/">Home</router-link> | <router-link to="/about">About</router-link> | <router-link :to="{ name: 'profile', params: { username: 'mark2021' } }" > Profile </router-link> </div> <router-view/> </template>
在我们的 router-link 标签中,我们可以使用 :to 属性传入一个带有名称和参数数据的对象。 params 对象可以是任何类型的数据(即字符串、数字、对象)。在上面的代码片段中,我们传入了一个用户名和字符串值 (mark2021) 的对象。
如何从View文件夹内的文件访问路由参数?
当我们将 Vue 路由器添加到我们的 Vue 应用程序时,我们可以访问我们应用程序全局范围内的特殊 $route 对象。这个对象保存了我们应用程序的所有路由器信息。我们可以通过简单地调用 this.$route 来访问 $route 对象。 params 信息也可在此 $route 对象中使用。我们可以通过 $route 对象访问 Profile 组件内部的 params 对象。
修改View文件夹内的Profile.vue文件,请看下面的代码为例:
<template> <div class="profile"> Profile Info </div> <span> {{ this.$route.params.username }} </span> </template>
生成效果如下所示:
动态路由
下面是一个快速参考表,可帮助您直观地了解动态路由的工作原理。
route pattern | URL path | $this.route.params |
---|---|---|
/product/:name | /product/apple-watch | { name: "apple-watch"} |
/product/:name/comment/:comment_id | /product/apple-watch/comment/123 | { name: 'apple-watch', comment_id: '123' } |
在上一节中,我们看到了如何使用 传递附加信息。动态路由是一个类似的概念。在这种情况下,参数是 URL 本身的一部分。
让我们来看看如何在我们的应用程序中定义动态路由。
让我们在View文件夹下创建一个新文件并将其命名为 Product.vue,书写代码如下:
<template> <div> Product Page </div> <span> Looking for Product: {{ this.$route.params.id }} </span> </template>
现在我们可以将此组件添加到我们的路由中。
const routes = [ // rest of the code ... { path: '/product/:id', component: Product }, ]
请注意,我们向 URL 的 :id 附加了一个动态参数。
现在,如果您在浏览器中访问 http://localhost:8080/product/12343,您可以看到该组件可以访问通过 URL 传递的动态参数。
然后,我们可以使用此 ID 从生命周期挂钩中的 API 中获取实际产品。
我们的 URL 中也可以有多个动态参数。动态段将映射到 $route.params 的相应字段。
让我们来看看它是如何工作的。我们将首先对我们的Product.vue进行一些快速的改变,修改代码如下:
const routes = [ // rest of the code ... { path: '/product/:id/:category', component: () => import('../views/Product.vue') } ]
现在我们指定了两个参数,而不是一个参数 :id。现在让我们进入路径 http://localhost:8080/product/12343/electronics 并打开 Vue devtools。正如您从下面的屏幕截图中看到的,我们现在可以访问 params 并且这些 params 映射到指定的变量名称 id 和 category。
延迟加载
我们来谈谈延迟加载。这是 Vue Router 开箱即用的高级功能之一。让我们打开我们的开发工具并观察 js 选项卡。
您可以看到,当我们第一次加载应用程序时,它加载了一个 app.js 脚本。当您导航到 /profile route 或 /product route 时,您可以看到没有正在加载新的 javascript。这是因为这些组件的所有 JavaScript 代码都已经加载了 app.js。在较小的应用程序中,这不是问题。
但是,如果我们有一个大型应用程序怎么办。在这种情况下,一次性加载所有 JS 代码会使页面加载时间显着延长。延迟加载用于避免这种情况。
当我们延迟加载时,我们只加载我们需要的部分,当我们需要它们的时候,代码如下:
// router/index.js const routes = [ { path: '/', name: 'Home', component: Home }, { path: '/profile', name: 'profile', component: Profile, }, { path: '/product/:id', component: Product }, { path: '/about', name: 'About', component: () => import('../views/About.vue') } ]
看看 router/index.js 的第 17 行。
你还记得之前的例子吗?这里的 About 组件是通过箭头函数导入的。这是延迟加载的示例。与 Home、Profile 和 Product 组件不同,About 组件不会随 app.js 一起加载。 About 组件只会在用户访问 /about 路由时加载。这就是我们实现延迟加载所需要做的全部工作。这种延迟加载是通过 Webpack 的代码拆分功能完成的。在引擎盖下 Vue 使用 Webpack 作为打包器。
更新一下index.js的代码内容,如下所示:
import { createRouter, createWebHistory } from 'vue-router' import Home from '../views/Home.vue' const routes = [ { path: '/', name: 'Home', component: Home }, { path: '/profile', name: 'profile', component: () => import('../views/Profile.vue') }, { path: '/product/:id', component: () => import('../views/Product.vue') }, { path: '/about', name: 'About', component: () => import('../views/About.vue') } ] const router = createRouter({ history: createWebHistory(process.env.BASE_URL), routes }) export default router
程序化导航
在我们的应用程序中,会出现我们希望以编程方式导航到另一个页面的场景。
在我们的应用程序中,我们可以通过 $router 访问路由器实例。
我们可以通过调用 this.$router 来访问它。
路由器实例有一个名为 push 的函数。此功能可用于导航到不同的路线。以下是它如何工作的一些示例:
// route by route path this.$router.push('home') // object this.$router.push({ path: 'home' }) // named route navigation with parameters this.$router.push({ name: 'user', params: { userId: '123' } }) // with query params, resulting in /profile?info=some-info this.$router.push({ path: 'profile', query: { info: 'some-info' } })
以上就是Vue.js的路由内容了,想必大家通过以上的内容已经了解其中的精妙所在了,为将来的高深用法打下基础。
- 我的微信
- 微信扫一扫加好友
- 我的微信公众号
- 扫描关注公众号