Vue知识点系列笔记:
Vue(一)基础 | 前端 | 课程笔记
Vuex | 前端 | 课程笔记
本章vue-router:b站课程链接 p117-p133
Vue-router思维导图
(由于图片文件太大无法上传,只能截图)
vue的一个插件库,专门用来实现SPA应用
操作步骤:
//引入VueRouter
import VueRouter from 'vue-router'
//引入Luyou 组件
import About from '../components/About'
import Home from '../components/Home'
//创建router实例对象,去管理一组一组的路由规则
const router = new VueRouter({
routes:[
{
path:'/about',
component:About
},
{
path:'/home',
component:Home
}
]
})
//暴露router
export default router
<router-link active-class="active" to="/about">About</router-link>
<router-view></router-view>
注意:
路由组件通常存放在pages文件夹,一般组件通常存放在components文件夹。
通过切换,“隐藏”了的路由组件,默认是被销毁掉的,需要的时候再去挂载。
每个组件都有自己的 r o u t e 属 性 , 里 面 存 储 着 自 己 的 路 由 信 息 。 整 个 应 用 只 有 一 个 r o u t e r , 可 以 通 过 组 件 的 route属性,里面存储着自己的路由信息。 整个应用只有一个router,可以通过组件的 route属性,里面存储着自己的路由信息。整个应用只有一个router,可以通过组件的router属性获取到。
routes:[
{
path:'/about',
component:About,
},
{
path:'/home',
component:Home,
children:[ //通过children配置子级路由
{
path:'news', //此处一定不要写:/news
component:News
},
{
path:'message',//此处一定不要写:/message
component:Message
}
]
}
]
<router-link to="/home/news">News</router-link>
<router-view></router-view>
嵌套路由更多内容详见《Vue-router嵌套路由》
为了方便的表示路由的路径, 可以给路由规则起一个别名, 即为"命名路由"
var router = new VueRouter({
routes: [
{
path: '/user/:id',
component: user_com,
// 命名路由
name: 'user',
props: true,
},
],
});
<router-link :to="{name: 'user', params: {id: 123}}">User3</router-link>
router.push({
name: 'user',
params: {
id: 123
},
});
路由重定向详见《路由重定向和别名》
//Message.vue
<ul>
<li v-for="m in messageList" :key="m.id">
<!-- 跳转路由并携带query参数,to的字符串写法 -->
<router-link :to="`/home/message/detail?id=${m.id}&title=${m.title}`">{{m.titel}}<router-link>
</li>
</ul>
(2)to的对象写法
<ul>
<li v-for="m in messageList" :key="m.id">
<!-- 跳转路由并携带query参数,to的对象写法 -->
<router-link :to="{
path:'/home/message/detail',
query:{
id: m.id,
title: m.title
}">
{{m.title}}
<router-link>
</li>
</ul>
$route.query.id
$route.query.title
routes:[
{
path:'/home',
component:Home,
children:[
{
path:'news',
component:News,
},
{
path:'message',
component:Message,
children:[
{
path:'detail',
component:Detail,
}
]
}
]
}
]
})
作用: 可以简化路由的跳转
操作步骤:
{
path:'/demo',
component:Demo,
children:[
{
path:'test',
component:Test,
children:[
{
name:'hello',//给路由命名
path:'welcome',
component:Hello,
}
}
}
]
}
<!-- 简化前,需要完整的路径-->
<router-link to="/demo/test/welcome">跳转</router-link>
<!-- 简化后,直接通过名字跳转-->
<router-link :to="{name:'hello'}">跳转</router-link>
<!-- 简化写法配合传递参数 -->
<ul>
<li v-for="m in messageList" :key="m.id">
<router-link
:to="{
name:'hello',
query:{
id:m.id,
title:m.title
}
}">
{{m.title}}
</router-link>
</li>
</ul>
{
path:'/home',
component:Home,
children:[
{
path:'news',
componnet:News
},
{
component:Message,
children:[
{
name:'xiangqing',
path:'detail/:id/:title',//使用占位符声明接受params参数
component:Detail
}
]
}
]
}
params的两种写法
字符串写法:
<!-- 跳转并携带params参数,to的字符串写法-->
<ul>
<li>
<router-link :to="/home/message/detail/">跳转</router-link>
对象写法:
<!-- 跳转并携带params参数,to的对象写法-->
<ul>
<li>
<router-link
:to="{
name:'xiangqing',
params:{
id: ,
title: ,
}
}">
跳转
</router-link>
</li>
</ul>
特别注意:
路由携带params参数时,若使用to的对象写法,则不能使用path配置项,必须使用name配置。
$route.params.id
$route.params.title
作用:让路由组件更方便的收参数
//router/index.js
{
name:'xiangqing',
path:'detail/:id',
component:Detail,
//第一种写法,props值为对象,该对象中所有的key-value的组合最终都会通过props传给Detail组件
//props:{a:900}
//第二种写法:props值为布尔值,布尔值为true,则把路由受到的所有prams参数通过props穿给Detail组件
//props:true
//第三种写法:props值为函数,该函数返回的对象中每一组key-value都会通过props传给Detail组件
props(route){
return {
id:route.query.id,
title:route.query.title
}
}
}
//props({query}){
//return {
//id:query.id,
//title:query.title
//}
//}
//}
//Detail.vue
<template>
<ul>
<li>消息编号:{{id}}</li>
<li>消息标题:{{title}}</li>
</ul>
</template>
<script>
export default {
name:'Detail',
props:['id','title']
}
</script>
<router-link replace ...>News</router-link>
作用:不借助router-link实现路由跳转,让路由跳转更灵活
<template>
<div class="col-xs-offset-2 col-xs-8">
<div class="page-header">
<h2>Vue Router Demo</h2>
<button @click="back">后退</button>
<button @click="forward"></button>
</div>
</div>
</template>
<script>
export default {
name:'Banner',
methods:{
back(){
this.$router.back()
},
forward(){
this.$router.forward()
},
},
}
</script>
作用:让不展示的路由组件保持挂载,不被销毁
<keep-alive include="News">
<router-view></router-view>
</keep-alive>
<script>
export default {
name:'News',
data(){
return {
opacity:1
}
},
activated(){
console.log('News组件被激活了')
this.timer = setInterval(() => {
console.log('@')
this.opacity -=0.01
if(this.opacity <= 0) this.opacity = 1
},16)
},
deactivated(){
console.log('News组件失活了')
clearInterval(this.timer)
},
}
</script>
全局前置路由守卫什么时候被调用?
(1)初始化时被调用;
(2)每次路由切换之前调用
//router/index.js
router.beforeEach((to,from,next)=>{
console.log(to,from)
if(to.name === 'xinwen' || to.name == 'xiaoxi'){
if(localStorage.getItem('school') === 'atguigu')}
next()
}else{
alert('学校名不对,无权限查看')
}
}else{
next()
}
})
全局后置路由守卫什么时候被调用?
(1)初始化时
(2)每次路由切换之后
//router/index.js
router.afterEach((to,from)=>{
console.log('后置路由守卫',to,from)
document.title = to.meta.title || '硅谷系统'
})
//router/index.js
routes= {
name:'xinwen',
path:'news',
component:News,
meta:{isAuth:true,title:'新闻'},
beforeEnter: (to,from.next) => {
console.log('前置路由守卫',to,from)
if(to.meta.isAuth){ //判断是否需要鉴权
if(localStorage.getItem('school') === 'atguigu'){
next()
}else{
alert('学校名不对,无权限查看')
}
}else{
next()
}
},
//afterEnter(){
//}
<script>
export default {
name:'About',
mounted(){
//console.log('%%%',this.$route)
},
//通过路由规则鹅,进入该组件时被调用
beforeRouteEnter(to,from,next){
console.log('About--beforeRouteEnter',to,from)
if(to.meta.isAuth){ //判断是否需要鉴权
if(localStorage.getItem('school')==='atguigu'){
next()
}else{
alert('学校名不对,无权限查看')
}
}else{
next()
}
},
//通过路由规则,离开该组件时被调用
beforeRouteLeave(to,from,next){
console.log('About--beforeRouteLeave',to,from)
}
}
//全局前置守卫,初始化时执行、每次路由切换前执行
router.beforeEach((to,from,next) => {
console.log('before',to,from)
if(to.meta.isAuth){ //判断当前路由是否需要进行权限控制
if(localStorage.getItem('school') === 'atguigu'){ //权限控制的具体规则
next() //放行
}else{
alert('暂无权限查看')
}
}else{
next()//放行
}
})
//全局后置守卫,初始化时执行、每次路由切换后执行
router.afterEach((to,from)=> {
console.log('afterEach',to,from)
if(to.meta.title){
document.title = to.mata.title //修改网页的title
}else{
document.title = 'vue_test'
}
})
beforeEnter: (to,from.next) => {
console.log('前置路由守卫',to,from)
if(to.meta.isAuth){ //判断是否需要鉴权
if(localStorage.getItem('school') === 'atguigu'){
next()
}else{
alert('学校名不对,无权限查看')
}
}else{
next()
}
}
//进入守卫,通过路由规则,进入该组件时被调用
beforeRouterEnter(to,from,next){
},
//离开守卫,通过路由规则,离开该组件时被调用
beforeRouteLeave(to,from,next){
}
Vue-router知识点补充:前端路由vue-router