安装 vue-router3
npm i vue-router@3
基本配置
1⃣️ 在src目录下新建一个router文件夹,在文件夹里面创建一个index.js
文件
2⃣️ 在main.js
添加以下代码
import Vue from 'vue'
import App from './App.vue'
import VueRouter from 'vue-router'
import router from './router'
Vue.use(VueRouter)
new Vue({
el:'#app',
render: h => h(App),
router
}).$mount('#app')
3⃣️ 在router
文件夹下的index.js
中就可以编写路由规则啦
代码模版:
import VueRouter from "vue-router";
import Home from '../pages/Home.vue'
import News from '../pages/News.vue'
// 创建并暴露一个路由器
export default new VueRouter({
routes:[
{
path:'/自定义路由路径',
component:路由路径对应的组件
},
{
path:'/home',
component:Home,
// 二级路由编写
children:[
{
// name 有点像路径别名,在多级路由下很有优势
// 表现在不用写一长串从父到子的路由地址
// 注意:写了name后依旧得写path
name:'news',
// 二级路由的path不需要带 '/'
path:'news',
component:News
}
]
}
]
})
如何使用路由做跳转?
1⃣️ 在页面中书写以下代码能实现路由跳转:
<router-link to="/home">点击跳转到Home组件router-link>
<router-view />
2⃣️ 如何跳转二级路由❓
<router-link to="/home/news">NEWSrouter-link>
3⃣️ 跳转路由时如何携带参数❓
利用query携带参数字符串写法:
要跳转路由的地方:
<router-link to="/home/news?newsId=001&newsContent=这是一条新闻">NEWSrouter-link>
路由对应的组件里:
<template>
<div>
<h2>NEWS组件h2>
新闻编号:{{ $route.query.newsId }}
新闻编号:{{ $route.query.newsContent }}
div>
template>
对象写法:
要跳转路由的地方:
<router-link :to="{
name:'news',
query:{
newsId:'002',
newsContent:'这是一条新闻'
}
}">跳转到News组件router-link>
路由对应的组件里:
<template>
<div>
<h2>NEWS组件h2>
新闻编号:{{ $route.query.newsId }}
新闻编号:{{ $route.query.newsContent }}
div>
template>
利用params携带参数
在router
文件夹下的index.js
中需要使用占位符声明接收params参数
import ......
export default new VueRouter({
routes:[
......
{
path:'/home',
component:Home,
children:[
{
name:'news',
// 使用占位符声明接收params参数
path:'news/:id/:content',
component:News
}
]
}
]
})
字符串写法:
要跳转路由的地方:
<router-link to="/home/news/003/这是一条新闻">点击跳转到News组件router-link>
路由对应的组件里:
<template>
<div>
<h2>NEWS组件h2>
新闻编号:{{ $route.params.id }}
新闻编号:{{ $route.params.content }}
div>
template>
对象写法:
要跳转路由的地方:
<router-link :to="{
name:'news', // 这里只能用name,不能用path
params:{
id:'002',
content:'这是一条新闻'
}
}">跳转到News组件router-link>
路由对应的组件里:
<template>
<div>
<h2>NEWS组件h2>
新闻编号:{{ $route.params.id }}
新闻编号:{{ $route.params.content }}
div>
template>
进一步学习
vue路由router的props配置
router-link 的replace属性<router-link to="..." replace >...router-link>
加上replace最直观的感受是跳转完组件后,没办法通过浏览器返回按钮直接返回到跳转前的组件了。🔙
编程式路由导航没说的那么高大上,简言之就是把路由标签搬到js代码里而已。
<template>
<div>
<button @click="toNewsPage">跳转到News组件button>
<router-view>router-view>
div>
template>
<script>
export default {
name: "Home",
methods: {
toNewsPage() {
this.$router.push({
name: "news", // 这里只能用name,不能用path
params: {
id: "002",
content: "这是一条新闻",
},
});
},
},
};
script>
缓存路由组件(保活路由组件)
作用:一般来说,不展示的路由组件会被立刻销毁。缓存路由组件就是为了让不展示的路由组件保持挂载,不被销毁,以待重写展示组件的时候,填写在组件中的信息能够恢复。
⚠️ 注意:include=""
里面填写的是要缓存的组件的名称❗️
<keep-alive include="News">
<router-view>router-view>
keep-alive>
路由组件两个新的生命周期
<script>
export default {
name: "News",
mounted() {},
// 路由组件在keep-alive包裹下才有的生命周期
activated(){
console.log('路由组件被激活了');
},
// 路由组件在keep-alive包裹下才有的生命周期
deactivated(){
console.log('路由组件被销毁了');
}
};
script>
⚠️ 注意:activated()和deactivated()只有在
包裹的时候才有效。因为在
中,我们正常的钩子函数就没办法执行了,这个时候activated()
和deactivated()
就会执行。
什么是路由守卫❓
说白了就是像「拦截器」的东西,在这里面可以做一些组件跳转前或组建跳转后的逻辑处理(比如用户身份鉴权)
全局前置路由守卫会在每一个路由组件被展示前调用,这时候可以在路由守卫里面去做一些js逻辑判断,来确保路由组件是不是真的要展示给用户看。
全局后置路由守卫是在路由组件被展示给用户看后才调用的
代码模版:
在router
文件夹📁下的index.js
中配置
import ......
// 创建并暴露一个路由器
const router = new VueRouter({
......
})
// 前置路由守卫
router.beforeEach((to,from,next)=>{
// meta字段下面会讲
if(to.meta.isAuth){
console.log('需要鉴权')
// 这里省略一百万行鉴权代码
next()
}else{
next()
}
})
// 后置路由守卫
router.afterEach((to,from)=>{
......
})
export default router
前置路由守卫里面写的是一个回调函数,回调函数能接收到三个参数,分别是(to,from,next)
,to能够展示路由去向,from能够展示路由来源,next是一个方法,让路由组件在前置路由守卫中处理完逻辑后能够继续走下去,展示to里面指向的路由组件
全局后置路由守卫同上,只是没有next参数
路由配置中的meta字段meta字段能够在路由组件切换的过程中,传递用户的「元数据」,就是用户的「自定义」数据。这个数据可以供路由守卫鉴权用。
export default new VueRouter({
routes:[
{
name:'home',
path:'/home',
component:Home,
// 路由配置中的meta字段
meta:{isAuth:true},
}
]
})
独享路由守卫
代码模版:
在router
文件夹📁下的index.js
中配置
// 创建并暴露一个路由器
const router = new VueRouter({
routes:[
{
name:'home',
path:'/home',
component:Home,
// 独享路由守卫
beforeEnter:(to,from,next)=>{
console.log('/home的独享路由守卫被调用')
next()
}
}
]
})
组件内路由守卫
在路由组件里编写的路由守卫
<script>
export default {
name: "Home",
components: {},
methods: {
},
// 组件内守卫
// 通过路由规则,进入该组件时被调用
beforeRouteEnter: (to, from, next)=>{
next()
},
// 通过路由规则,离开该组件时被调用
beforeRouteLeave: (to, from, next)=> {
next()
}
};
</script>
修改路由模式
将hash
模式改成history
在router
文件夹📁下的index.js
中配置
// 创建并暴露一个路由器
const router = new VueRouter({
// 将`hash`模式改成`history`
mode:'history',
routes:[
......
]
})
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)