一、动态路由

在某些情况下,一个页面的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中记录。

                  

 

Logo

前往低代码交流专区

更多推荐