Vue Router部分:
- Vue Router基本使用(上篇)
- Vue Router动态传参及导航守卫(本篇)
动态路由
在正常的项目中,除了上一章中讲到的标准路由输出,更多情况下我们会通过动态路由加JavaScript代码的形式来控制页面的跳转。
老规矩,翠花上代码:
- 将router/index.js中引入动态路由的组件,在path后如下所示
:id
{
path: "/about/:id",
name: "About",
// 路由的懒加载写法,该组件会被延迟加载,推荐这样写
component: () =>
import(/* webpackChunkName: "about" */ "../views/About.vue")
}
- 将App.vue中代码修改如下
<template>
<div id="app">
<div id="nav">
<router-link to="/">Home</router-link> |
<router-link to="'/about' + id">About</router-link>
</div>
<router-view/>
</div>
</template>
<script>
export default {
data:function(){
return {
id: 123
}
},
</script>
这样之后我们可以看到路由中的id会自动匹配到我们在组建data中传入的id值,这就是动态路由的基本使用,如果想动态获取路由中id值可以通过两种方式:
- 通过
$route.params.id
直接获取 - 用一个计算属性获取!
<script>
export default {
data:function(){
return {
id: 123
},
computed:{
Id(){
// $route谁处于活跃状态就获取谁
return this.$route.params.id
}
}
},
</script>
动态路由通过js方式传参
先说一个这种方式传参的使用场景,一般我们在网站中进行搜索,筛选,排序等操作的时候一般会使用get请求,那么get请求的url要实现这种功能一般会向url中传递参数,形式如下所示:
https://www.baidu.com/s?wd=vue
问号后边的wd=vue就是url种传的参数!
- 普及个知识点,url的构成:
具体大家可自行了解!
- 在vue中构造这种get请求一般是通过,
path
搭配query
(类似get),可以通过$route.query
获取传递的参数!
老规矩,翠花上代码:
<!--App.vue-->
<h1>代码跳转</h1>
<button @click="ProfileClick">Profile</button>
<script>
export default {
methods: {
ProfileClick(){
this.$router.push({
path: '/profile',
query: {
name: 'vue',
age: 18,
height: 10
}
})
}
},
}
</script>
点击ProfileClick
事件会跳转至如http://www.xxx.com/profile?name=vue&age=18&height=10
形式的地址!
- 在vue中构造这种post请求一般是通过,
name
搭配params
(类似post)
老规矩,翠花上代码:
<!--App.vue-->
<h1>代码跳转</h1>
<button @click="UserClick">Profile</button>
<script>
export default {
methods: {
ProfileClick(){
this.$router.push({
name: 'user',
query: {
id: 12,
name: 'vue',
desc: '学习vue'
}
})
}
},
}
</script>
通过这种方式可以向post请求接口推送数据,其传递的参数可以通过$route.params
获取!
嵌套路由
如果一个大的路由下边有小的分支路由,与创建路由的原则相一致,一个路由对应一个组件,子路由也得一一对应相关组件,之后再把注册的路由通过<router-link>
引入到父路由的组件中。
老规矩,翠花上代码!
// router/index.js
// 引入子组件,自己提前在views文件夹下创建页面组件!
const Home = () => import('../views/Home.vue')
const HomeNews = () => import('../views/HomeNews')
const HomeMessage = () => import('../views/HomeMessage')
const routes = [
{
path: '/',
name: 'home',
component: Home,
// 子组件
children: [
// 跳转链接
{
path: '/',
redirect: '/home/news'
},
{
// path路径要与引用到组件的一致
path: '/home/news',
component: HomeNews
},
{
path: '/home/message',
component: HomeMessage
}
]
},
]
将子路由引入到父路由的组件中。
<router-link to="/home/news">news</router-link> |
<router-link to="/home/message">message</router-link>
</router-view>
导航守卫
导航守卫的意思是,监听每一个路由的跳转过程,,然后提供了一些钩子让你有机会在路由跳转的过程中植入相关信息,导航守卫分为三个部分即全局导航守卫、路由导航守卫和组件守卫。
全局导航守卫
全局导航守卫分为以下三类,建议大家先去看下vue官网关于这块,有个基础的了解!
1. 全局前置守卫:
router.beforeEach
,在路由跳转时回调!
router.beforeEach((to, from, next) => {
// 如果用户未能验证身份,则 `next` 会被调用到登录页
if (to.name !== 'Login' && !isAuthenticated) next({ name: 'Login' })
else next()
})
2. 全局解析守卫
3. 全局后置钩子
router.afterEach
跳转完回调!
路由独享守卫
你可以在路由配置上直接定义 beforeEnter 守卫:
const router = new VueRouter({
routes: [
{
path: '/foo',
component: Foo,
beforeEnter: (to, from, next) => {
// ...
}
}
]
})
这些守卫与全局前置守卫的方法参数是一样的。
组件内守卫
最后,你可以在路由组件内直接定义以下路由导航守卫:
- beforeRouteEnter
beforeRouteEnter (to, from, next) {},
beforeRouteEnter (to, from, next) {
next(vm => {
// 通过 `vm` 访问组件实例
})
}
- beforeRouteUpdate (2.2 新增)
在当前路由改变,但是该组件被复用时调用,举例来说,对于一个带有动态参数的路径,/foo/:id
,在 /foo/1
和 /foo/2
之间跳转的时候,由于会渲染同样的 Foo
组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用。可以访问组件实例 this
!
beforeRouteUpdate (to, from, next) {
// just use `this`
this.name = to.params.name
next()
}
- beforeRouteLeave
导航离开该组件的对应路由时调用,可以访问组件实例 this
,这个离开守卫通常用来禁止用户在还未保存修改前突然离开。该导航可以通过 next(false) 来取消。
beforeRouteLeave (to, from, next) {
const answer = window.confirm('Do you really want to leave? you have unsaved changes!')
if (answer) {
next()
} else {
next(false)
}
}
在router/index.js中修改并添加相关信息如下:
// router/index.js
// 01. 在导航路由中添加 meta对象 元数据
{
path: '/home/message',
name: 'message',
component: HomeMessage,
meta: {
title: '消息'
}
}
// 02. 添加如下方法
// 全局导航守卫,router是我们最开始new 出来的一个对象
// 全局导航守卫【前置钩子,跳转时回调】
router.beforeEach((to, from, next) => {
// 从from跳转到to
document.title = to.matched[0].meta.title
console.log('+++++++++')
next()
})
// 后置钩子,跳转完回调
router.afterEach((to, from) => {
// to and from are both route objects.
console.log('----------')
})
完整的导航解析流程
- 导航被触发。
- 在失活的组件里调用 beforeRouteLeave 守卫。
- 调用全局的 beforeEach 守卫。
- 在重用的组件里调用 beforeRouteUpdate 守卫 (2.2+)。
- 在路由配置里调用 beforeEnter。
- 解析异步路由组件。
- 在被激活的组件里调用 beforeRouteEnter。
- 调用全局的 beforeResolve 守卫 (2.5+)。
- 导航被确认。
- 调用全局的 afterEach 钩子。
- 触发 DOM 更新。
- 调用 beforeRouteEnter 守卫中传给 next 的回调函数,创建好的组件实例会作为回调函数的参数传入。
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
- 提示下载完但解压或打开不了?
- 找不到素材资源介绍文章里的示例图片?
- 模板不会安装或需要功能定制以及二次开发?
发表评论
还没有评论,快来抢沙发吧!