vue Route参数传递和导航守卫
路由的传递参数
对于params方式的传递参数,我们已经讲过。现在我们来使用第二种参数方式来进行练习:
-
新建Profile.vue组件
<template> <div> <h3>通过query来获取 参数 数据</h3> <h5> {{$route.query}} </h5> </div> </template> <script> export default { name: 'profile', data(){ } } </script> <style scoped> </style>
-
去route的index.js中添加路径
import Vue from 'vue' import VueRouter from 'vue-router' // import Home from '../components/HelloWorld.vue' // import about from '../components/about.vue' // import user from '../components/test.vue' //先使用 vue的uuse来使用vueroute Vue.use(VueRouter) //定义route路由 const routes = [ { path: '/', name:'first', redirect: '/pagehome' }, { path: '/profile', component: () => import('../components/Profile.vue') }, { path: '/pagehome', name: '首页', component: () => import('../components/HelloWorld.vue') }, // { // path: '/about', // name: 'About', // // route level code-splitting // // this generates a separate chunk (about.[hash].js) for this route // // which is lazy-loaded when the route is visited. // 路由懒加载 // component: () => import(/* webpackChunkName: "about" */ '../views/About.vue') // } { path: '/about', name: '关于', component: () => import('../components/about.vue'), children:[ { path: 'aboutSub', component: () => import ('../components/test2.vue') } ] }, { path: '/user/:userId', component: () => import('../components/test.vue') } ] //history模式就是我们学的history的go,reward。pushState。replaceState啊等。 const router = new VueRouter({ mode: 'history', base: process.env.BASE_URL, routes, activeClass: 'changecolor' }) //导出route组件 export default router
-
添加routelink
<template> <div id="app"> <div id="nav"> <!-- <router-link to="/pageHome" tag="button" active-class="changecolor">Home</router-link> | <router-link to="/about" tag="button" active-class="changecolor">About</router-link> --> <!-- <button>显示主页</button> <button>显示about页面</button> --> <!-- <button @click="gohome">首页</button> <button @click="goabout">about</button> --> <!-- <router-link to="/pagehome">首页</router-link> --> <!-- <router-link to="/about">关于</router-link> --> <!-- <router-link :to="'/user/'+userid">用户界面</router-link> --> <!-- <router-link>新组件</router-link> --> <router-link :to="{ path: '/profile', query:{ name: '里巴巴' ,age: 22 ,sex: 1 } }">个人信息</router-link> </div> <router-view/> </div> </template> <script> export default { name: 'App' ,data(){ return { userid: 'zhangsan1' } } } </script> <style> .changecolor{ color:red; } </style>
-
运行效果
R o u t e 和 R o u t e r 的 区 别 Route和Router的区别 Route和Router的区别
R o u t e 是 处 于 活 跃 的 路 由 , R o u t e r 是 v u e 使 用 的 模 块 。 具 体 还 得 网 上 找 文 章 对 源 码 进 行 分 析 Route是处于活跃的路由,Router是vue使用的模块。具体还得网上找文章对源码进行分析 Route是处于活跃的路由,Router是vue使用的模块。具体还得网上找文章对源码进行分析
导航守卫
俗称:对来回跳转过程进行监听。就是监听用户点击什么路径,从A跳到B。
案例 点击组件,浏览器需要更新对应页面标题
重点在于代码末尾的 - -使用全局导航守卫。
路由对象中name和meta可以两个选一个,在这里,我选route的name属性。
import Vue from 'vue'
import VueRouter from 'vue-router'
// import Home from '../components/HelloWorld.vue'
// import about from '../components/about.vue'
// import user from '../components/test.vue'
//先使用 vue的uuse来使用vueroute
Vue.use(VueRouter)
//定义route路由
const routes = [
{
path: '/',
redirect: '/pagehome'
},
{
path: '/profile',
name: '个人简介',
component: () => import('../components/Profile.vue')
,meta: {
title: '个人简介'
}
},
{
path: '/pagehome',
name: '首页',
component: () => import('../components/HelloWorld.vue')
,meta: {
title: '首页'
}
},
// {
// path: '/about',
// name: 'About',
// // route level code-splitting
// // this generates a separate chunk (about.[hash].js) for this route
// // which is lazy-loaded when the route is visited.
// 路由懒加载
// component: () => import(/* webpackChunkName: "about" */ '../views/About.vue')
// }
{
path: '/about',
name: '关于',
component: () => import('../components/about.vue'),
meta: {
title: '关于'
},
children:[
{
path: 'aboutSub',
component: () => import ('../components/test2.vue')
,meta: {
title: '关于的子组件'
}
}
]
},
{
path: '/user/:userId',
name: '个人中心',
component: () => import('../components/test.vue')
,meta: {
title: '个人中心'
}
}
]
//history模式就是我们学的history的go,reward。pushState。replaceState啊等。
const router = new VueRouter({
mode: 'history',
base: process.env.BASE_URL,
routes,
activeClass: 'changecolor'
})
//使用全局导航守卫
router.beforeEach((to,from,next)=>{
document.title = to.name;
next()
})
//导出route组件
export default router
运行结果如下:
方法2:使用match的数组对象来进行改变值:
//使用全局导航守卫
router.beforeEach((to,from,next)=>{
// document.title = to.name;
//使用方法2,从匹配对象中进行获取其标题值
document.title = to.matched[0].meta.title;
next()
})
运行效果同上。
导航守卫可以配置类似拦截器的功能。可以使用前置钩子函数和后置钩子函数进行登入或者权限校验的判断。
使用keep-alive对组件不进行销毁,下面假设先不使用keep-alive进行查看情况,看组件会不会销毁:
可以看到,当点击其他route时,组件会被销毁。
在加入keep-alive后,app.vue代码如下:
<template>
<div id="app">
<div id="nav">
<!-- <router-link to="/pageHome" tag="button" active-class="changecolor">Home</router-link> |
<router-link to="/about" tag="button" active-class="changecolor">About</router-link> -->
<!-- <button>显示主页</button>
<button>显示about页面</button> -->
<!-- <button @click="gohome">首页</button>
<button @click="goabout">about</button> -->
<!-- <router-link to="/pagehome">首页</router-link> -->
<!-- <router-link to="/about">关于</router-link> -->
<!-- <router-link :to="'/user/'+userid">用户界面</router-link> -->
<!-- <router-link>新组件</router-link> -->
<router-link :to="{
path: '/profile',
query:{
name: '里巴巴'
,age: 22
,sex: 1
}
}">个人信息</router-link>
</div>
<keep-alive>
<router-view/>
</keep-alive>
</div>
</template>
<script>
export default {
name: 'App'
,data(){
return {
userid: 'zhangsan1'
}
}
}
</script>
<style>
.changecolor{
color:red;
}
</style>
运行效果如下:
可以看到,首页组件保持了活跃状态。
keep-alive常用属性:
指定一些组件不缓存或者缓存,使用:
修改profile组件代码:
<template>
<div>
<h3>通过query来获取 参数 数据</h3>
<h5>
{{$route.query}}
</h5>
</div>
</template>
<script>
export default {
name: 'profile'
,beforeCreate () {
console.log("proifle被创建")
}
,beforeDestroy () {
console.log("profile组件被销毁")
}
}
</script>
<style scoped>
</style>
修改app.vue
<template>
<div id="app">
<div id="nav">
<!-- <router-link to="/pageHome" tag="button" active-class="changecolor">Home</router-link> |
<router-link to="/about" tag="button" active-class="changecolor">About</router-link> -->
<!-- <button>显示主页</button>
<button>显示about页面</button> -->
<!-- <button @click="gohome">首页</button>
<button @click="goabout">about</button> -->
<!-- <router-link to="/pagehome">首页</router-link> -->
<!-- <router-link to="/about">关于</router-link> -->
<!-- <router-link :to="'/user/'+userid">用户界面</router-link> -->
<!-- <router-link>新组件</router-link> -->
<router-link :to="{
path: '/profile',
query:{
name: '里巴巴'
,age: 22
,sex: 1
}
}">个人信息</router-link>
</div>
<keep-alive exclude="profile">
<router-view/>
</keep-alive>
</div>
</template>
<script>
export default {
name: 'App'
,data(){
return {
userid: 'zhangsan1'
}
}
}
</script>
<style>
.changecolor{
color:red;
}
</style>
运行:
可以看到,虽然我们使用了keep-alive,但是已经将profile组件排除在外了,不对此组件进行缓存。
云风科技CEO_张莽: 请问你的process.waitfor(), 的process是如何定义的呢? 谢谢
kjkbj: 帅,卡了我好几个小时加了@CrossOrigin一下就解决了
my_xuexi: 大佬,我用弹出层显示进度条,进度条有了,但是百分比死活不显示。不用弹出层就可以显示百分比
JS丶Tsukasa: 感觉好棒,可以发一下源码吗?希望学习一下 2677299914@qq.com 谢谢
Aicrazy.: 有没有图片的接口编写呀