概念
在Vue2中,路由是指通过URL路径访问不同页面或视图的机制。Vue Router是Vue.js官方提供的路由管理器,它可以将多个组件映射到不同的URL上,并提供导航解决方案。
在Vue Router中,有以下几个基本概念:
- 路由:定义了URL与组件之间的映射关系,包括路径、参数、查询等信息。
- 组件:路由匹配到的组件,用于展示对应的页面视图。
- 路由器实例:通过Vue Router创建的对象,用于管理整个应用的路由逻辑。
- 路由视图:一个容器组件,用于展示匹配到的组件。
- 路由链接:一个组件,用于生成链接,点击后可以跳转到对应的路由页面。
还有一些高级概念,比如嵌套路由、动态路由、路由参数、路由钩子函数等,这些概念可以帮助我们更好地理解和使用Vue Router。
步骤
安装Vue Router
在项目的根目录下打开终端,输入以下命令安装vue-router:
> npm install vue-router --save
创建Router实例
在main.js文件中创建router实例并引入到Vue实例中:
import Vue from 'vue'
import VueRouter from 'vue-router'
Vue.use(VueRouter)
const router = new VueRouter({
routes: [
// 在这里配置路由
]
})
new Vue({
router,
render: h => h(App)
}).$mount('#app')
配置路由映射关系
在创建router实例时,需要配置routes属性用于定义路由。每个路由都是一个对象,包含以下属性:
- path:字符串类型,表示URL路径,必须以斜杠(/)开头。
- component:组件类型或异步函数类型,表示与该路由对应的组件。
例如,在routes数组中添加一个路由对象:
const router = new VueRouter({
routes: [
{
path: '/home',
component: Home
}
]
})
使用标签展示对应组件
当URL路径发生变化时,会自动渲染对应的组件。
例如,在App.vue模板中添加标签:
<template>
<div id="app">
<router-view></router-view>
</div>
</template>
这样,当访问不同的URL时,会根据路由配置渲染对应的组件。
同时,如果需要在外面包裹一些布局或样式,可以使用命名视图(named views)的方式。例如,可以在路由配置中为每个视图指定一个名字:
const routes = [
{
path: '/',
components: {
default: Home,
header: Header,
footer: Footer
}
},
// 其他路由配置...
]
然后,在模板中使用标签并指定名字即可:
<template>
<div id="app">
<header>
<router-view name="header"></router-view>
</header>
<main>
<router-view></router-view>
</main>
<footer>
<router-view name="footer"></router-view>
</footer>
</div>
</template>
这样,不同名字的标签就会分别渲染不同的组件。
使用标签生成路由链接
标签会自动渲染成一个标签,并设置合适的href属性和class样式,使得用户可以通过点击链接进行页面跳转。
例如,在导航栏中添加两个链接:
<template>
<div class="nav">
<router-link to="/">Home</router-link>
<router-link to="/about">About</router-link>
</div>
</template>
这里的to属性表示要跳转到哪个URL路径。当用户点击链接时,标签会自动将其转换为标签,并添加相应的href属性和class样式。
另外,如果想在标签上添加额外的属性或样式,可以使用v-bind指令(简写为":"):
<router-link :to="{ path: '/user/' + userId }" class="link">User Profile</router-link>
这样就可以生成带有自定义class样式和动态参数的路由链接了。
也可以使用编程式导航:
// 字符串路径
router.push('/home')
// 对象形式
router.push({ path: '/home' })
// 命名路由
router.push({ name: 'home' })
高级概念
嵌套路由
Vue Router允许将多个组件组合成一个复杂的视图。例如,在一个页面中有多个视图区域需要动态加载不同的组件,可以使用嵌套路由来实现。
const router = new VueRouter({
routes: [
{
path: '/',
component: Home,
children: [
{
path: 'child',
component: Child
}
]
}
]
})
这里的children选项表示嵌套路由配置。当用户访问"/"路径时,会渲染Home组件,并在其中的标签中动态渲染Child组件。
动态路由
动态路由是指路由路径包含动态参数的情况,例如:
const router = new VueRouter({
routes: [
{
path: '/user/:id',
component: User
}
]
})
这里的:id就是动态参数,可以通过$route.params.id在组件中获取。例如,在User组件中可以这样使用:
export default {
created () {
console.log(this.$route.params.id)
}
}
路由参数
除了动态路由参数,Vue Router还支持通过query和params属性传递路由参数。query参数是通过URL查询字符串传递的,而params参数是通过路由路径传递的。
const router = new VueRouter({
routes: [
{
path: '/user',
component: User,
props: true // 开启props传参
}
]
})
这里的props:true表示开启props传参。在导航时,可以将参数作为对象传递给to属性:
<router-link :to="{ name: 'user', params: { id: 123 }}">User</router-link>
在User组件中可以直接使用props来接收参数:
export default {
props: ['id']
}
路由钩子函数
Vue Router提供了多个路由钩子函数,可以在不同阶段对路由进行拦截或处理。常用的路由钩子函数有:
- beforeRouteEnter
- beforeRouteUpdate
- beforeRouteLeave
例如,在beforeRouteLeave钩子函数中可以弹出确认框,提示用户是否要离开当前页面:
const router = new VueRouter({
routes: [
{
path: '/',
component: Home,
beforeRouteLeave (to, from, next) {
if (confirm('确定要离开吗?')) {
next()
} else {
next(false)
}
}
}
]
})
这里的beforeRouteLeave钩子函数会在用户离开当前路由之前触发。如果用户点击了"确定"按钮,则继续跳转;否则,取消跳转。
路由守卫
在Vue2中,可以通过路由守卫来控制页面的访问权限和导航行为。路由守卫分为全局守卫、路由独享守卫和组件内守卫三种。下面分别介绍一下这三种守卫的使用方法:
全局守卫
全局守卫会在每个路由切换前都被调用,包括beforeEach、beforeResolve和afterEach三种钩子函数。其中,beforeEach是最常用的钩子函数,可以用来检查用户是否有访问该页面的权限,跳转到登录页等:
router.beforeEach((to, from, next) => {
// 检查用户是否已经登录
const token = localStorage.getItem('token')
if (!token && to.path !== '/login') {
next('/login')
} else {
next()
}
})
路由独享守卫
路由独享守卫只在某个路由被匹配时才会被调用,通过在路由配置中使用beforeEnter属性来定义:
const router = new VueRouter({
routes: [
{
path: '/user/:id',
component: User,
beforeEnter: (to, from, next) => {
// 检查用户是否有权限访问该页面
const user = getUser(to.params.id)
if (!user) {
next('/404')
} else {
next()
}
}
}
]
})
组件内守卫
组件内守卫包括beforeRouteEnter、beforeRouteUpdate和beforeRouteLeave三种钩子函数,分别在路由进入前、路由更新时和路由离开前被调用。这些钩子函数只能在需要使用的组件中定义:
export default {
data() {
return {
user: null
}
},
beforeRouteEnter(to, from, next) {
// 获取用户信息
const user = getUser(to.params.id)
if (user) {
next(vm => {
vm.user = user
})
} else {
next('/404')
}
},
beforeRouteUpdate(to, from, next) {
// 更新用户信息
const user = getUser(to.params.id)
if (user) {
this.user = user
next()
} else {
next('/404')
}
},
beforeRouteLeave(to, from, next) {
// 提示保存信息
if (this.isDirty()) {
if (confirm('您还有未保存的内容,确定要离开吗?')) {
next()
} else {
next(false)
}
} else {
next()
}
}
}
以上是Vue2中使用路由守卫的基本方法,可以根据实际需求选择不同的守卫来控制页面的访问权限和导航行为。
总结
Vue2的路由系统是Vue Router提供的,它可以帮助我们实现页面之间的跳转和管理。Vue2的路由系统具有以下特点:
- 声明式路由匹配:使用路由配置对象来描述URL路径和组件之间的映射关系。
- 嵌套路由:允许将多个组件组合成一个复杂的视图,并在其中动态地渲染子组件。
- 动态路由:支持路由路径包含动态参数,可以通过$route.params在组件中获取。
- 路由参数:支持通过query和params属性传递路由参数,可以通过props来接收参数。
- 命名路由:可以给路由配置对象命名,使得在导航时更加方便。
- 路由钩子函数:提供了多个路由钩子函数,可以在不同阶段对路由进行拦截或处理。
在使用Vue2的路由系统时,需要先创建Vue Router实例,并将其添加到Vue实例的选项中。然后,在每个需要进行路由跳转的组件中,可以使用标签生成路由链接,也可以使用编程式导航方法跳转路由。同时,还可以在路由配置对象中定义全局的路由钩子函数,对整个应用程序的路由进行拦截或处理。