一、路由基础
1、创建Router实例
在使用Vue Router 之前,我们需要先创建一个Router实例。在main.js文件中引入Vue和Vue Router,并使用use()方法安装插件
import Vue from 'vue'
import VueRouter from 'vue-router'
Vue.use(VueRouter)
const router = new VueRouter({
routes: [...] // 路由配置
})
代码解释:
- 首先我们需要引入Vue和VueRouter
- 然后调用Vue.use()方法安装VueRouter插件
- 创建一个VueRouter实例,并传递routes参数,routes是一个路由配置数组,包含多个路由对象配置
- 在最后导出VueRouter实例,以便在其他地方使用
2、路由配置
在创建Router实例的时候,我们需要配置routes参数。routes是一个路由配置数组,包含多个路由对象配置
const routes = [
{
path: '/home',
name: 'Home',
component: Home
},
{
path: '/about',
name: 'About',
component: About
}
]
代码解释:
- 我们定义了2个路由对象,即 /home 和 /about
- 每个路由对象包含3个属性:path、name和component
- path代表路由路径,name代表路由名称,component代表路由要渲染的组件
3、路由嵌套
在一些大型的应用中,我们需要使用到路由嵌套,这样能够更好的管理我们的路由配置。Router 嵌套还可以实现多人协同作业,路由规则按组或模块分开,不同的人维护不同的文件,避免人为冲突。
const routes = [
{
path: '/',
name: 'Home',
component: Home,
children: [
{
path: 'profile',
name: 'Profile',
component: Profile
},
{
path: 'dashboard',
name: 'Dashboard',
component: Dashboard
}
]
}
]
代码解释:
- 在主路由下,我们添加了children数组,包含两个子路由
- 每个子路由不再以/开头,而是以父路由的路径/作为前缀,同时子路由的component也是自己的组件。
- 比如在这个例子中,子路由的路径就是 /profile 和 /dashboard ,对应的组件是 Profile 和 Dashboard
二、导航
1、跳转到路由
我们可以通过 router-link 标签在 Vue 模板中声明一个链接,使用户跳转到不同的路由。Vue Router 根据 link 的 href 属性自动激活对应的路由,Vue 会自动阻止默认事件的发生,所以不需要使用 v-on:click.prevent
<router-link to="/home">Home</router-link>
代码解释:
- router-link 是Vue Router 提供的组件,to属性是路由路径,对应的是上文配置的 path 属性
2、编程式导航
我们也可以在代码中进行路由导航,比如跳转到另外一个路由,并且路径可以动态设置。这种方式叫做编程式导航
router.push('/home')
代码解释:
- 使用 router.push 进行编程式导航,以 /home 为例
3、参数传递
在 Vue Router 中,可以通过在路由路径中加入参数来传递参数。这些参数可以是必须的,也可以是可选的。在路由配置项中,可以通过:来指定参数名,如 /user/:id 中的 :id
const routes = [
{
path: '/user/:id',
name: 'User',
component: User
}
]
代码解释:
- 在路由配置中,我们使用 /user/:id 定义了一个路由,其中 :id 表示参数
- 在路由链接中,可以使用 $route.params.id 获取传递的参数
- 在编程式导航中,可以使用 params 属性传递参数
// links
<router-link :to="'/user/' + user.id">{{ user.name }}</router-link>
// programmatic navigation
this.$router.push({ name: 'User', params: { id: this.userId } })
三、路由钩子
路由钩子就是在路由导航过程中的一些钩子函数,可以控制路由跳转、路由数据变化等方面的行为
1、全局前置守卫
全局前置守卫是在路由导航之前调用的,可以用于身份验证,日志记录等。多个全局前置守卫会按照注册顺序依次执行
router.beforeEach((to, from, next) => {
// to 和 from 都是路由对象
// to 是导航到的路由对象
// from 是导航来源的路由对象
// next 是一个函数,调用该函数,才会执行导航操作
if (to.matched.some(record => record.meta.requiresAuth)) {
// 判断是否需要身份验证,未登录则跳转到登录页
if (!auth.loggedIn()) {
next({
path: '/login',
query: { redirect: to.fullPath }
})
} else {
next()
}
} else {
next() // 不需要身份验证
}
})
代码解释:
- 在全局前置守卫中,我们可以根据 to 和 from 来判断是否需要身份验证
- 如果需要身份验证,且未登录,则跳转到登录页面,可以使用 next({path: '/login'}) 转到登录页面
- 如果不需要身份验证,直接调用 next()
2、全局后置钩子
全局后置钩子是在路由导航之后调用的,无法取消导航行为,也无法控制路由跳转。只能接收到路由导航的成功或失败。
router.afterEach((to, from) => {
// to 和 from 都是路由对象
// 这里可以添加一些日志记录等操作
})
3、组件内路由钩子
除了全局路由钩子,Vue Router 还提供了多个组件内的路由钩子函数,它们是定义在组件内部的方法,可以在特定组件内使用
export default {
beforeRouteEnter (to, from, next) {
// 在路由进入该组件前调用
// 无法访问组件实例 this
next() // 通过调用next()执行路由操作
},
beforeRouteUpdate (to, from, next) {
// 在当前组件重新渲染时调用
// 可以访问组件实例 this
next()
},
beforeRouteLeave (to, from, next) {
// 在路由离开该组件时调用
// 可以访问组件实例 this
next()
}
}
四、代码拆分
在一个单页应用中,随着应用变得越来越大,JS 文件也会越来越大,这时候我们可以将不同的路由拆分成不同的代码块,仅在需要的时候再加载对应的组件。
const Home = () => import('./views/Home.vue')
const About = () => import('./views/About.vue')
const routes = [
{
path: '/home',
name: 'Home',
component: Home
},
{
path: '/about',
name: 'About',
component: About
}
]
代码解释:
- 在路由组件中使用动态导入语法,即使用 () => import(...) 的方式导入组件,在需要的时候才会加载。
结语
以上是关于VueRouter使用技巧和最佳实践的详细阐述,包括路由基础、导航、路由钩子、代码拆分等方面。通过灵活使用VueRouter,能够让我们更好的构建单页应用。