每个有
http
链接的页面可以理解为一个路由, 配置路由的目的是为了统一进行页面的管理,方便页面的跳转.点击查看官方使用说明
点击查看官方Api文档
前置条件:
在开始学习之前,先准备两个界面,界面内存放最简单用于识别的代码即可,例如:
一、安装
路由作为Vue
的插件,需要安装才可以进行使用
npm install --save vue-router
二、基础使用
1、新建一个router
目录用于存放路由相关文件
2、router
目录下新建一个index.js
文件用于存放路由配置。配置文件内容如下:
import {createRouter, createWebHistory} from "vue-router";
// 导入创建的页面
import home from "../views/home.vue"
import project from "../views/project.vue"
// 配置路由
const routes = [
{
path: "/",
component: home
},
{
path: "/project",
component: project
}
]
// 使用配置
const router = createRouter({
history: createWebHistory(),
routes // 使用配置的路由
})
// 导出路由
export default router
上述的路由配置中将初始建的两个页面都配置了进去
3、main.js
中使用路由模块
import {createApp, ref} from 'vue'
import App from './App.vue'
// 导入新建的路由
import router from "./router/index";
const app = createApp(App)
// 使用路由
app.use(router)
app.mount('#app')
4、app.vue
中调用路由
<script setup>
</script>
<template>
<!--通过link来进行组件导航-->
<!--通过to导航到对应页面-->
<router-link to="/">首页</router-link>
|
<router-link to="/project">项目页</router-link>
<!--显示路由-->
<router-view></router-view>
</template>
完整代码如下:
效果预览:
上述的示例中是在模板内进行页面切换的,那如果我们期望可以在 script
内进行页面切换要怎么做呢? 修改app.vue
如下:
<script setup>
import router from "@/router";
// 切换页签
function tabViewHandle(view){
router.push(view)
}
</script>
<template>
<button @click="tabViewHandle('/')">首页</button>
<button @click="tabViewHandle('/project')">项目</button>
<!--显示路由-->
<router-view></router-view>
</template>
效果如下:
三、路由参数传递
很多时候, 我们可能希望一个页面被尽可能的复用。 以此来减少相似度比较高的页面的重复开发。此时我们可以使用传递参数的方式来完成
修改index.js
里配置的路由如下:
// 配置路由
const routes = [
{
path: "/",
component: home
},
{
// 通过使用冒号的方式来添加参数
path: "/project/:id",
component: project
}
]
修改app.vue
内容如下:
<script setup>
import router from "@/router";
// 切换页签
function tabViewHandle(view){
// 也可以通过这种方式去带参数
// roiter.push({path:viwe})
// roiter.push({name:viweName, params: {id: 1}}) // 这里的viewName会在命名路由中进行说明
router.push(view)
}
</script>
<template>
<button @click="tabViewHandle('/')">首页</button>
<button @click="tabViewHandle('/project/1')">项目1</button>
<button @click="tabViewHandle('/project/2')">项目3</button>
<!--显示路由-->
<router-view></router-view>
</template>
修改project.vue
内容如下:
<script>
</script>
<template>
<!--使用$route.params.xx可以获取对应路由属性-->
<!--该示例中使用$route.params.id来获取跳转到页面的id的值-->
<p>项目{{$route.params.id}}页面</p>
</template>
完整代码:
效果预览:
如上,就可以通过传参的方式, 拿对应值到数据库中取出对应数据对界面进行渲染,来完成通用界面的调用。
五、路由嵌套
有时我们希望一个页面中嵌套多个公共组件,可以使用下述方式进行
1、新建一个ChildProject.vue
文件,放最简单代码
<script>
</script>
<template>
<p>项目子页面</p>
</template>
2、index.vue
中将ChildProject.vue
配置为project.vue
的子页面
// 配置路由
const routes = [
{
path: "/",
component: home,
},
{
path: "/project/:id",
component: project,
// 通过添加在children中添加子路由,可以添加多个,子路由下面也可以在加子路由
children: [
{
// 调用的时候路径需要拼接父级路由的path
path: "childProject",
component: childProject
}
]
},
]
3、修改project.vue
, 添加显示路由
<script>
</script>
<template>
<p>项目{{$route.params.id}}页面</p>
<!--显示路由-->
<router-view></router-view>
</template>
4、修改app.vue
, 添加一个切换到子路由的按钮
<script setup>
import router from "@/router";
function tabViewHandle(view){
router.push(view)
}
</script>
<template>
<button @click="tabViewHandle('/')">首页</button>
<button @click="tabViewHandle('/project/1')">项目1</button>
<button @click="tabViewHandle('/project/2')">项目2</button>
<!--添加一个显示子路由的按钮-->
<button @click="tabViewHandle('/project/2/childProject')">项目子页面</button>
<router-view></router-view>
</template>
修改后完整代码如下:
运行查看效果
六、命名路由
除了使用
path
外,我们还可以用name
去命名路由,使用路由的时候用name
去代替path
1、修改index.vue
,添加路由命名
// 配置路由
const routes = [
{
path: "/",
name: "home",
component: home,
},
{
path: "/project/:id",
name: "project",
component: project,
children: [
{
path: "childProject",
name: "childProject",
component: childProject
}
]
},
]
2、修改app.vue
,使用name
进行导航
<script setup>
import router from "@/router";
function tabViewHandle(view){
router.push(view)
}
</script>
<template>
<!--html中使用命名路由html跳转-->
<router-link :to="{name:'home'}">命名路由html首页</router-link>
<button @click="tabViewHandle('/')">首页</button>
<button @click="tabViewHandle('/project/1')">项目1</button>
<button @click="tabViewHandle('/project/2')">项目2</button>
<!--html中使用命名路由带参数的html跳转-->
<router-link :to="{name:'project', params:{id: '3'}}">命名路由html项目3</router-link>
<button @click="tabViewHandle('/project/2/childProject')">项目子页面</button>
<router-view></router-view>
</template>
**注意:**上述修改vue
只是修改了router-link
的跳转, 没有修改push
的导航,push
的方法使用路由传递跟router-link
一样
修改后的完整代码如下:
效果如下:
七、命名视图
上述的例子中都是一个页面中显示一个子页面,但是有时候我们希望一个界面可以显示多个页面,这个时候可以使用命名视图的方式完成
1、修改app.vue
添加两个命名视图
<!--添加两个命名视图-->
<router-view name="view1"></router-view>
<router-view name="view2"></router-view>
修改index.js
,绑定命名视图
// 配置路由
const routes = [
{
path: "/",
name: "home",
// component: home,
components: {
default: home, // 没有视图命名则为default
view1: home, // 有视图命名则用 name:component 的格式
view2: project
}
},
{
path: "/project/:id",
name: "project",
component: project,
children: [
{
path: "childProject",
name: "childProject",
component: childProject
}
]
},
]
完整代码如下图
效果预览:
上述的例子中可以看到,首页上总共绑定了两个个home
组件和一个project
组件
八、重定向
重定向的意思让所有本该访问A页面的请求全部去访问B页面
比较简单,不看效果了
九、导航守卫
导航守卫可以理解为页面跳转的钩子,当页面跳转中的意思。可以在导航守卫内添加逻辑去让跳转的时候去进行一些校验,比如说验证登录状态。
准备三个界面,分别为 登录页、首页、项目页,页面代码如下(自己配置一下对应的路由):
上述代码一下的效果如下:
现在来添加一个手动的简单的导航守卫:复制以下代码到index.js
import {createRouter, createWebHistory} from "vue-router";
// 导入创建的页面
import login from "../views/login.vue"
import home from "../views/home.vue"
import project from "../views/project.vue"
// 配置路由
const routes = [
{path: "/", name: "login", component: login},
{path: "/home", name: "home", component: home},
{path: "/project", name: "project", component: project}
]
// 使用配置
const router = createRouter({
history: createWebHistory(),
routes // 使用配置的路由
})
// 配置导航守卫
const loginState = true // 假装它是登录状态把
router.beforeEach((to, from)=>{
// 如果当前是没有登录权限的状态,并且大行不处于 login页
if (!loginState && to.name !=='login'){
return {name: 'login'}
}
})
// 导出路由
export default router
通过上述例子可以看出,当登录状态发生变化时,页面跳转到了登录页。并且无法再登录上去
注意:除了上述的例子外:
- 导航守卫类型还分:解析守卫-
beforeResolve
(貌似是导航时钩子)、后置钩子-afterEach
(导航后守卫) - 上述的配置方式为全局配置,还可以:路由内配置、组件内配置
这些都不在此演示了。感兴趣的话可以在官网查看
十、路由懒加载
上述的例子中,
index.js
中都是一开始就import
了对应的组件。这样会增加程序的启动成本。懒加载的意思是,只有用到的时候才让他进行加载。懒加载写法:
// 配置路由
const routes = [
{path: "/", name: "login", component: ()=>import("../views/login.vue")},
{path: "/home", name: "home", component: ()=>import("../views/home.vue")},
{path: "/project", name: "project", component: ()=>import("../views/project.vue")}
]
根据懒加载的配置方式,改造一下之前的额代码,然后看下效果
非懒加载演示:
懒加载演示:
通过上述的对比应该很容易发现区别
十一、动态路由
上述的所有示例, 路由都是通过
routes
在index.js
中添加好的。也许会有在使用过程中添加路由的需求。此时可以使用动态路由。
通过下述方法添加和移除:
router.addRoute()
router.removeRoute()
考虑到使用场景较少,这里就不进行展示了。