vue知识点:动态路由
在某些情况下,一个页面的path路径可能是不确定的,比如我们进入用户界面时,希望是如下路径/user/aaa或/user/bbb除了有前面的/user之外,后面还跟上了用户ID这种path和Component匹配关系,我们称之为动态路由(也是路由传递数据的一种方式)router下index.js配置路由{path:'/user/:id',component: User}进入user页面点击路径&l
一、动态路由
在某些情况下,一个页面的path路径可能是不确定的,比如我们进入用户界面时,希望是如下路径
/user/aaa或/user/bbb
除了有前面的/user之外,后面还跟上了用户ID
这种path和Component匹配关系,我们称之为动态路由(也是路由传递数据的一种方式)
router下index.js配置路由
{
path:'/user/:id',
component: User
}
进入user页面点击路径
<template>
<div id="detail">
<router-link :to="'/user/'+userId"></router-link>
</div>
</template>
<script>
export default {
name: 'detail',
data() {
return {
userId: 'zgangdsna'
}
}
}
user模板·页面获取id方式
<h2>{{$route.params.id}}</h2>
二、认识路由懒加载
1.官方解释
当打包构建应用时,javascript包会变得非常大,影响页面加载
如果我们能把不同路由对应的组件分割成不同的代码块,然后当路由被访问的时候才加载对应组件,这样就更加高效了。
2.官方在说什么?
首先,我们知道路由中通常会定义很多不同的页面
这个页面最后被打包在哪里呢?一般情况下,是放在一个js文件中
但是,页面这么多放在一个js文件中,必然会造成这个页面非常大
如果我们一次性从服务器请求下来这个页面,可能需要花费一定的时间,甚至用户的电脑还会出现短暂的空白的情况。
如何避免这总情况呢?使用路由懒加载就可以了
3.路由懒加载做了什么?
路由懒加载主要作用就是将路由对应的组件打包成一个个的js代码块
只有在这个路由被访问到的时候,才加载对应的组件
4.懒加载的方式
const Home = () => import('../components/Home.vue')
三、路由嵌套
1.嵌套路由是一个很常见的功能
比如在home页面中,我们希望通过/home/news和/home/message访问一些内容。
一个路径映射一个组件,访问这两个路径也会分别渲染两个组件
2.实现嵌套路由有两个步骤
创建对应的子组件,并且在路由映射中配置对应的子路由
在组建内部使用<router-view>标签
<router-link to="/home/news">新闻</router-link>
<router-link to="/home/message">消息</router-link>
四、vue-router参数传递
传递参数主要有两种类型:params和query,当有大量参数需要传递时用query,传递的是对象,params传递简单的
1. params类型:
配置路由格式:/router/:id
传递的方式:在path后面跟上对应的值
传递后形成的路径:/router/123,/router/abc
<router-link :to="'/user/'+userId">用户</router-link>
取id:{{$route.params.id}}
2.query的类型:
配置路由格式:/router,也就是普通配置
传递的方式:对象中使用query的key作为传递方式
传递后形成的路径:/router?id=123, /router?id=abc
<router-link :to="{path:'/profile', query: {name:'why', age: 18, height: 1.88}}">档案<router-link>
拼接后地址:/profile?name=why&age=18&height=1.88
取出拼接值:$route.query.name
3.点击button跳转传递参数
五、$route和$router区别
$router为VueRouter实例,想要导航到不同的URL,则使用$router.push方法
$route为当前router跳转对象里面可以获取name、path、query、params等
六、导航守卫
1.什么是导航守卫
vue-router提供的导航守卫主要用来监听路由的进入和离开
vue-router提供了beforeEach和afterEach的钩子函数,它们会在路由即将改变前和改变后触发
补充:
1.如果是后置钩子,也就是afterEach,不需要主动调用next()函数
// 前置钩子
router.beforeEach((to, from, next) => {
// 从from跳转到to
document.title = to.matched[0].meta.title
next()
})
// 后置钩子
router.afterEach((to, from) => {
console.log('');
})
2.上面使用的导航守卫,称为全局守卫
还有 路由独享的守卫
组件内的守卫
详见:https://router.vuejs.org/zh/guide/advanced/navigation-guards.html
七、keep-alive遇见vue-router
1.keep-alive是Vue内置的一个组件,可以使被包含的组件保留状态,或避免重新渲染
它有两个非常重要的属性
include - 字符串或正则表达式,只有匹配的组件会被缓存
exclude - 字符串或正则表达式,任何匹配的组件都不会被缓存
<keep-alive exclude="Profile,User">
<router-view>
//所有路径匹配到的视图组件都会被缓存
<router-view/>
</keep-alive>
//Profile,User是剔除的页面name
2.router-view也是一个组件,如果直接被包在keep-alive里面,所有路径匹配到的视图组件都会被缓存
3.拓展:
组件在keep-alive中时,生命周期中有activated/deactivated。
页面中使用path属性记录离开时的路径,在beforeRouteLeave中记录。
更多推荐
所有评论(0)