我们打开router文件夹下的index.js文件,关于路由的配置都在该文件进行配置。
a.为了完全弄懂该文件代码,我们先清空文件内容,再手写一个配置文件:
b.由于我们需要使用路由那么先在文件导入路由插件:
import VueRouter from "vue-router";
c.导入之后,插件是需要使用的,而vue提供了使用插件的方法,因此也需要导入Vue:
import Vue from "vue";
Vue.use(VueRouter);
d.使用插件创建router实例:
const router = new VueRouter({
routes: routes
});
在创建实例中传入一些配置的options,其中routes是配置了路由映射的数组。
e.由于router实例需要用来配置在Vue实例中,因此需要导出router实例:
export default router;
f.为了实现路由跳转,我们须在components文件夹中创建两个组件:
组件内容:
//About.vue
<template>
<h1>我是关于组件</h1>
</template>
<script>
export default {};
</script>
<style>
h1 {
color: yellow;
}
</style>
//Home.vue
<template>
<h1>我是Home组件</h1>
</template>
<script>
export default {};
</script>
<style>
h1 {
color: red;
}
</style>
g.在路由配置文件中配置映射关系:
import Home from "../components/Home";
import About from "../components/About";
const routes = [
{
path: "/home",
component: Home
},
{
path: "/about",
component: About
}
];
h.路由已经配置好了,下面使用组件:
在App.vue中使用路由:
<template>
<div id="app">
<router-link to="/home" tag="button">主页router-link>
<router-link to="/about" tag="button">关于router-link>
<router-view />
div>
template>
<script>
export default {
name: "App",
};
script>
解释:
i.运行项目测试路由跳转:
到这里,最简单的路由已经实现了。
简单小结:
a.设置重定向
我们看看上面的图片,在我们没有点击按钮前,页面没有显示任何一个组件的内容,这显然是不合理的。我们设置路由重定向让它自动显示主页内容。
修改路由配置文件:
const routes = [
{
path: "",
redirect: "/home"
},
{
path: "/home",
component: Home
},
{
path: "/about",
component: About
}
];
这样,当我们打开http://localhost:8080/时会自动显示页面界面:
b.修改为history模式
在上面的实现中,跳转路由时,你看看请求的URL:
http://localhost:8080/#/home
默认采用了哈希值模式。而我们更想看到的是这样的:
http://localhost:8080/home
想要实现这样的效果,需要在创建路由实例中配置options对象:
const router = new VueRouter({
// VueRouter的options
routes: routes,
mode: "history"
});
设置模式为HTML5的history模式。
下面看看router-link-active:
看上面动图右边的elements,可以看到,当选中哪个路由,哪个路由标签就会被添加上router-link-active类。
我们可以利用这个类来设置一些css。比如,选中哪个标签,哪个标签就显示出不一样的样式:
在用到router-link标签的App.vue的css样式添加router-link-active样式:
<template>
<div id="app">
<router-link to="/home" tag="button">主页</router-link>
<router-link to="/about" tag="button">关于</router-link>
<router-view />
</div>
</template>
<script>
export default {
name: "App",
};
</script>
<style>
.router-link-active {
background-color: blueviolet;
outline: none;
}
</style>
<template>
<div id="app">
<button @click="homeClick">首页</button>
<button @click="aboutClick">关于</button>
<router-view />
</div>
</template>
<script>
export default {
name: "App",
methods: {
homeClick() {
this.$router.push("/home");
},
aboutClick() {
this.$router.push("/about");
},
},
};
</script>
<style>
</style>
在函数中使用$router来实现路由跳转。
在某些情况下,一个页面的path路径可能是不确定的,比如我们进入用户界面时,希望是如下的路径:
const routes = [
{
path: "",
redirect: "/home"
},
{
path: "/home",
component: Home
},
{
path: "/about/:id",
component: About
}
];
不确定的路径使用“:”。“:”号后面的名称是随意的,但是这个名称也可有用的,下面会讲到。
<template>
<div id="app">
<router-link to="/home" tag="button">主页router-link>
<router-link to="/about/me" tag="button">关于router-link>
<router-view />
div>
template>
<script>
export default {
name: "App",
};
script>
<style>
style>
在about的router-link中,后面的id设置成me。则每次跳转都是me,那这样也就不是动态的了。
3. 动态获取id:
<template>
<div id="app">
<router-link to="/home" tag="button">主页router-link>
<router-link v-bind:to="'/about/'+userid" tag="button">关于router-link>
<router-view />
div>
template>
<script>
export default {
name: "App",
data: function () {
return {
userid: "pig",
};
},
};
script>
<style>
style>
我们使用v-bind来动态绑定to属性,使用字符串拼接出跳转路由,userid是在js中定义的数据,我在这里的userid还是写死了,实际上我们这里的id通常是从浏览器cookie中读取的数据,cookie中的id是什么,则userid就被赋什么值,这样在router-link就可以动态的跳转到不同的路径了。
params类型:
这里使用 < router-link v-bind:to="’/about/’+userid" tag=“button”> 实现路由跳转,实际就已经通过params向About.vue传递了userid,我们只需在About.vue中获取即可。
使用$route来获取参数:
<template>
<div>
<h1>我是关于组件h1>
<h3>{{userid}}h3>
div>
template>
<script>
export default {
data: function () {
return {
userid: this.$route.params.id,
};
},
};
script>
<style>
h1 {
color: yellow;
}
style>
我们通过$route获得了App.vue中router-link跳转路由中的参数。
注意:$router与$route是两个不同的东西
为什么这里使用的是id呢?这里是根据你在配置路由文件的变量名决定的:
{
path: "/about/:id",
component: About
}
我们这里配置为id,所以获取时,也需用这个变量名获取。
query类型:
为了方便起见,我这里就直接修改about组件的路由:
<template>
<div id="app">
<router-link to="/home" tag="button">主页</router-link>
<router-link v-bind:to="{path:'/about',query:{name:'baby',age:18}}" tag="button">关于</router-link>
<router-view />
</div>
</template>
<script>
export default {
name: "App",
};
</script>
<style>
</style>
仔细看看跳转about的路由。
同时在路由映射文件中将about映射改为最原始格式:
{
path: "/about",
component: About
}
修改后,运行项目:
那我们如何在About.vue获取路由中的参数呢?
同样是利用$route来获取:
<template>
<div>
<h1>我是关于组件</h1>
<h3>姓名:{{name}}</h3>
<h3>年龄:{{age}}</h3>
</div>
</template>
<script>
export default {
data: function () {
return {
name: this.$route.query.name,
age: this.$route.query.age,
};
},
};
</script>
<style>
</style>
为什么需要路由懒加载:
当打包构建应用时,JS包会变得非常大,如果我们一次就请求那么大的JS包可能会造成短暂的页面空白,这对用户体验非常不好。
如果我们能把不同路由下对应的组件分割成不同的代码块,然后当路由被访问时才加载对应的组件,这样就更加高效。
我们利用上面的实例进行打包:
我们实例中有两个组件都被打包进一个app.js中了,假设一个项目有非常多的组件,那么这个js文件将会非常大。
下面我们就使用路由懒加载:
修改路由配置文件
import VueRouter from "vue-router";
import Vue from "vue";
const Home = () => import("../components/Home");
const About = () => import("../components/About");
// 1.使用Vue.use()来是使用vue-router插件
Vue.use(VueRouter);
// 将router映射关系写在routes数组里面
const routes = [
{
path: "",
redirect: "/home"
},
{
path: "/home",
component: Home
},
{
path: "/about/:id",
component: About
}
];
// 2.创建VueRouter对象
const router = new VueRouter({
// VueRouter的options
routes: routes,
mode: "history"
});
// 3.应VueRouter需要传入Vue实例中使用,所以这里需要导出VueRouter实例
export default router;
其实就是将import Home form"…“改用const Home = () => import(”…/components/Home");加载组件,这样就实现了路由懒加载。
嵌套路由是一个常见的功能:
实现嵌套路由有两个步骤:
步骤一:现在在已有的主页组件下,创建homeNews和homeMessage组件,用来实现嵌套路由:
homeNew组件:
<template>
<h1>我是主页组件下的News组件</h1>
</template>
<script>
export default {};
</script>
<style>
</style>
homeMessage组件:
<template>
<h1>我是主页组件下的Message组件</h1>
</template>
<script>
export default {};
</script>
<style>
</style>
步骤二:配置路由映射关系
const HomeNews = () => import("../components/homeNews");
const HomeMessages = () => import("../components/homeMessage");
{
path: "/home",
component: Home,
children: [
{
path: "",
redirect: "news"
},
{
path: "news", //子组件路径前面不能加“/”
component: HomeNews
},
{
path: "messages", //子组件路径前面不能加“/”
component: HomeMessages
}
]
},
由于是在主页组件实现嵌套路由,那么就在home的映射中,利用children属性来实现路由嵌套。设置默认重定向到news组件。
步骤三:在主页组件的模板上利用子组件
<template>
<div>
<h1>我是Home组件h1>
<router-link to="/home/news">新闻router-link>
<router-link to="/home/messages">消息router-link>
<router-view>router-view>
div>
template>
<script>
export default {};
script>
<style>
h1 {
color: red;
}
style>