参考文献:Vue中的路由
<template>
<div id="app" class="container" align="center">
<router-link to="/staff" class="col-md-6">员工信息列表router-link>
<router-link to="/student" class="col-md-6">学生信息列表router-link>
<router-view>router-view>
div>
template>
<script>
export default {
}
script>
<style>
style>
<template>
<div class="container">
<h2>这是员工列表组件h2>
div>
template>
<script>
//指定模块的默认输出对象,使用import '../views/StaffList' 时会获得该对象
export default {
name:"StaffList"
}
script>
<style>
style>
<template>
<div class="container">
<h2>这是学生列表组件h2>
div>
template>
<script>
//指定模块的默认输出对象,使用import '../views/StudentList' 时会获得该对象
export default {
name:"StudentList"
}
script>
<style>
style>
import Vue from 'vue';
//导入路由管理器插件
import VueRouter from 'vue-router';
//导入StaffList.vue
import StaffList from '../views/StaffList';
//导入StudentList.vue
import StudentList from '../views/StudentList';
//使用路由管理器插件
Vue.use(VueRouter)
const routes = [//路由数组
{ //单条路由
path:'/student', //指定访问哪个URL会显示该组件
name: 'StudentList',//路由名字
component: StudentList
},//路由一,绑定key-value,实现访问/student会显示组件StudentList
{
path:'/staff',
name: 'StaffList',//路由名字
component: StaffList
}//路由二,绑定key-value,实现访问/staff会显示组件StaffList
/*
每条路由记录为一个对象。
name:指定路由名字,用于命名路由
path:指定url路径,即访问哪个url时会显示component属性指定的组件
component:访问这条路由时要显示的组件
*/
]
const router = new VueRouter({//路由管理器,用来管理路由
mode: 'history',//history模式下URL没有#,更加符合业务需要
routes:routes,//设置该路由管理器负责管理的路由数组
base: process.env.BASE_URL//base代表应用的基路径,process.env.BASE_URL是指从从环境进程中根据运行环境获取的api的base_url
})
export default router;//将路由管理对象作为index.js的默认导出对象,作用:如果import './router/index' 的话会获得该router对象
//导入vue
import Vue from 'vue'
import App from './App.vue'
//导入我们创建的router,这个router来自index.js
import router from './router/index'
//使用router
Vue.use(router)
//创建Vue实例,并传入路由管理器对象
const app = new Vue({
router: router,
render: h => h(App)
}).$mount('#app')
routes:[
{
path:'/about',
component:About,
},
{
path:'/home',
component:Home,
children:[ //通过children配置子级路由
{
name:'news'
path:'news', //此处一定不要写:/news
component:News
},
{
name:'message'
path:'message',//此处一定不要写:/message
component:Message,
children: [
{
name:'msg'
path: 'msgdata',
component: Msgdata,
}
]
}
]
URL格式:
/a/b?id=666&title=你好
路由路径传递数据:
<router-link :to="'/home/message/detail?id=666&title=你好' ">跳转1router-link>
<router-link
:to="{
path:'/home/message/detail',
query:{
id:666,
title:'你好'
}
}"
>跳转2router-link>
<router-view>router-view>
路由接收数据并包装,传给组件:
routes:[
{
path:'/about',
component:About,
},
{
path:'/home',
component:Home,
children:[ //通过children配置子级路由
{
name:'news'
path:'news', //此处一定不要写:/news
component:News
},
{
name:'message'
path:'message',//此处一定不要写:/message
component:Message,
children: [
{
path: 'msgdata',
component: Msgdata,
//在这里使用$route.query接收一下传来的参数,然后包装一下再传给Msgdata组件
props($route){
return {id:$route.query.id,title:$route.query.title}
}
}
]
}
]
组件接收包装后的数据:
<template>
<div>
<h3>信息编号:{{ id }}h3>
<h3>信息标题:{{ title }}h3>
div>
template>
<script>
export default {
name: "Msgdata",
props: ["id", "title"]//一定要记得使用props接收路由传来的数据
};
script>
<style>
style>
URL格式:
/a/b/666/你好 (其中’666’和’你好’是参数)
路由路径传递数据:
<router-link :to=" `/home/news/shownews/${n.id}/${n.name}` ">
跳转1
router-link>
<router-link
:to="{
//注意:用params传递参数时用到他的对象写法中不可使用 path:'路径',只能用name='路由name'
name: 'shownews',
params: {
id: n.id,
name: n.name,
},
}"
>
跳转2
router-link>
路由接收数据并包装,传给组件:
name: 'shownews',
// params 写法先在路径中占位
path: 'shownews/:id/:name',
component: ShowNews,
// props:true表示包装数据 props会接收所有params参数 以props的形式传递给ShowNews组件
props: true
组件接收包装后的数据:
<template>
<ul>
<li>编号{{ id }}li>
<li>姓名{{ name }}li>
ul>
template>
<script>
export default {
name: "ShowNews",
props: ["id", "title"]//一定要记得使用props接收路由传来的数据
};
script>
$router
访问路由实例。因此想要导航到不同的 URL可以,调用 this.$router.push
方法。声名式 | 编程式 |
---|---|
| router.push(a/b) |
const userId = '123'
//不带参
this.$router.push({ path: '/home' })// -> /home
//1.params传参:
//方法一:字符串传参
this.$router.push({ path: `/user/${userId}` }) // -> /user/123
//方法二:对象传参
//注意,如果提供了path,params会被忽略,所以使用params对象传参时要用name属性而不是path
this.$router.push({ name: 'user', params: { userId }}) // -> /user/123
//2.query传参:
//方法一:字符串传参:
this.$router.push({ path: '/register?plan=private')// -> /register?plan=private
//方法二:对象传参:
this.$router.push({ path: '/register', query: { plan: 'private' }})// -> /register?plan=private
watch: {
$route(to, from) {
// 对路由变化作出响应...
}
}
路由守卫的作用 : 对路由进行权限管理,必须符合条件才能访问。
路由守卫有三种: 全局守卫、独享守卫、组件内守卫。
在所有的路由发生改变前都执行 使用路由守卫就不能直接暴露路由实例,需要接收一下
然后调用里面的beforeEach((to,from,next)=>{})
有三个参数to:去哪个路径,from:从哪个路径里来,next:是个函数调用的时候next()放行
// 配置在实例对象外 初始化时调用,每次发生路由变化前调用
router.beforeEach((to,from,next)=>{
console.log('beforeEach',to,from)
if(to.meta.isAuth){ //判断当前路由是否需要进行权限控制
if(localStorage.getItem('school') === 'atguigu'){ //权限控制的具体规则
next() //放行
}else{
alert('暂无权限查看')
// next({name:'guanyu'})
}
}else{
next() //放行
}
})
//全局后置守卫:初始化时执行、每次路由切换后执行
router.afterEach((to,from)=>{
console.log('afterEach',to,from)
if(to.meta.title){
document.title = to.meta.title //修改网页的title
}else{
document.title = 'vue_test'
}
})
放在需要进行权限设置的路由里面,参数语法和全局一样 当访问这个路径前才执行beforeEnter()
beforeEnter(to,from,next){
console.log('beforeEnter',to,from)
if(to.meta.isAuth){ //判断当前路由是否需要进行权限控制
if(localStorage.getItem('school') === 'atguigu'){
next()
}else{
alert('暂无权限查看')
// next({name:'guanyu'})
}
}else{
next()
}
}
放在组件里和methods,components同级别 。
必须是通过路由规则进入该组件才可以调用。
beforeRouteEnter(),beforeRouteLeave()。
//进入守卫:通过路由规则,进入该组件时被调用
beforeRouteEnter (to, from, next) {
},
//离开守卫:通过路由规则,离开该组件时被调用
beforeRouteLeave (to, from, next) {
}