vue-router教程
是Vue.js的官方路由
import {
createWebHashHistory,
createRouter,
createWebHistory,
} from "vue-router";
//引入组件
import Home from "../components/Home.vue";
import About from "../components/About.vue";
//创建vue router对象
const router = createRouter({
//使用的是hash模式
history: createWebHashHistory(),
routes: [
{ path: "/home", component: Home },
{ path: "/About", component: About },
],
});
//将router暴露出去
export default router;
通过以上的步骤,我们会发现浏览器中会报警告
const router = createRouter({
//使用的是hash模式
history: createWebHashHistory(),
routes: [
{ path: "/", redirect: "/home" },
{ path: "/home", component: Home },
{ path: "/About", component: About },
],
});
const router = createRouter({
//使用的是hash模式
history: createWebHistory(),
routes: [
{ path: "/", redirect: "/home" },
{ path: "/home", component: Home },
{ path: "/About", component: About },
],
});
<router-link to="/about">123router-link>
同下
123router-link>
<router-link to="/about">123router-link>//此时设置router-link-active样式
<router-link to="/about" active-class="active">123router-link>//此时设置active的样式
前面的文章中,提到过当项目体量过大,打包的时候,默认会将项目打包到app.js文件中,此时,我们可以用import函数,进行分包处理
而vue-router也可以进行分包操作
webpackChunkName:'about'
,这是将打包的文件名写一个名称import {
createWebHashHistory,
createRouter,
createWebHistory,
} from "vue-router";
//使用import引入组件
const About = () =>
import(/*webpackChunkName:'about'*/ "../components/About.vue");
//创建vue router对象
const router = createRouter({
//使用的是hash模式
history: createWebHashHistory(),
routes: [
{
path: "/",
redirect: "/home",
meta:{
zc:"zhangcheng"
}
},
{
name:"Home",
path: "/home",
component: () =>
import(/*webpackChunkName:'home'*/ "../components/Home.vue"),
},
{
name:"About",
path: "/About",
component: About,
},
],
});
//将router暴露出去
export default router;
import {
createWebHashHistory,
createRouter,
createWebHistory,
} from "vue-router";
//使用import引入组件
const About = () =>
import(/*webpackChunkName:'about'*/ "../components/About.vue");
//创建vue router对象
const router = createRouter({
//使用的是hash模式
history: createWebHashHistory(),
routes: [
{
//此为动态路由
path: "/home/:id",
component: () =>
import(/*webpackChunkName:'home'*/ "../components/Home.vue"),
},
],
});
//将router暴露出去
export default router;
在template模板中直接获取 $route.param.id
获取
<template>Home:{{ $route.params.id }}template>
在 scrpit通过代码获取
//在 created生命周期中,获取
created(){
this.$route.params.id
}
//导入useRoute函数,该方法仅会在组件创建的时候执行一次,组件不销毁的情况下,不会再执行
import { useRoute } from "vue-router";
const route = useRoute();
console.log(route.params.id);
import { onBeforeRouteUpdate, useRoute } from "vue-router";
const route = useRoute();
console.log(route.params.id);
//在同一组件中,切换用户会触发
onBeforeRouteUpdate((to, from) => {
console.log(to.params.id);
console.log(from.params.id);
});
如果匹配到不存在的路径,需要显示的组件 NotFound组件
//创建vue router对象
const router = createRouter({
//使用的是hash模式
history: createWebHashHistory(),
routes: [
{
//当访问的路径,不属于上面的路由
path: "/:pathMatch(.*)",
component: () =>
import(/*webpackChunkName:'NotFound'*/ "../components/NotFound.vue"),
},
],
});
比如在个人中心页面中,我们会有多个页面,资料设置,头像设置等等,这时候就需要用到嵌套路由
const router = createRouter({
//使用的是hash模式
history: createWebHashHistory(),
routes: [
{
path: "/home/:id",
component: () =>
import(/*webpackChunkName:'home'*/ "../components/Home.vue"),
//配置嵌套路由
children: [
{
//直接写子路由名称
path: "person",
component: () => import("../components/Person.vue"),
},
],
},
],
});
<template>
Home:{{ $route.params.id }}
<router-view>router-view>
template>
前面进行路由跳转的方式都是通过标签进行跳转,如果是通过js代码跳转,该怎么操作
//直接传入路径
this.$router.push("/home")
//传入对象,可以携带查询内容
this.$router.push({
path:"/home",
query:{name:"zhangcheng"}
})
//获取传入的参数
$route.query即可获取
//首先引入函数
import {useRouter} from 'vue-router'
const router = useRouter()
//向前一步
router.forward()
//返回上一步
router.back()
//前进两步
router.go(2)
//后退两步
router.go(-2)
//直接传入路径
router.push("/home")
//传入对象,可以携带查询内容
router.push({
path:"/home",
query:{name:"zhangcheng"}
})
//获取传入的参数
$route.query即可获取
在实际开发中,我们会根据不同的角色,去注册一些该角色特有的路由
//创建vue router对象
const router = createRouter({
//使用的是hash模式
history: createWebHashHistory(),
routes: [
{
name:"home",
path: "/home/:id",
component: () =>
import(/*webpackChunkName:'home'*/ "../components/Home.vue"),
},
],
});
router.addRoute({
path: "/person",
component:xxx
})
router.addRoute("home",{
path: "/homevip",
component:xxx
})
//创建vue router对象
const router = createRouter({
//使用的是hash模式
history: createWebHashHistory(),
routes: [
{
name:"home",
path: "/home/:id",
component: () =>
import(/*webpackChunkName:'home'*/ "../components/Home.vue"),
},
],
});
//会覆盖上面的路由
router.addRoute({name:"home",path:"/home/parent",component:xxx})
router.removeRoute("home")
router.getRoutes()//返回的是一个数组
在跳转到特定的路由前,需要有一些特定的条件,才可以成功跳转
比如,现在用户想访问订单页面,但是该用户没有登录,所以不会直接跳转到订单页面,而是跳转到登录页面进行登录
to
: 即将要进入的目标from
: 当前导航正要离开的路由return false
会取消当前的导航return str
跳转到与str对应的路由return {name:'home'}
返回一个对象,对象中可以有name,path属性return
就会跳转自动跳转const router = createRouter({
//使用的是hash模式
history: createWebHashHistory(),
routes: [
{
name:"home",
path: "/home/:id",
component: () =>
import(/*webpackChunkName:'home'*/ "../components/Home.vue"),
},
],
});
router.beforeEach((to,form)=>{
//填写逻辑
//都会跳转到home路由
return "/home"
})
完整的导航解析流程
beforeRouteLeave
守卫。beforeEach
守卫。beforeRouteUpdate
守卫(2.2+)。beforeEnter
。beforeRouteEnter
。beforeResolve
守卫(2.5+)。afterEach
钩子。beforeRouteEnter
守卫中传给 next
的回调函数,创建好的组件实例会作为回调函数的参数传入。