13-vue-router2

一、动态路由

在某些情况下,一个页面的 path 路径可能是不确定的,比如我们进入用户界面时,希望是如下的路径:

/user/aaaa/user/bbbb,除了有前面的 /user 之外,后面还跟上了用户的 ID


这种 path 和 Component 的匹配关系,称之为动态路由(也是路由传递数据的一种方式)


1、在 vue-router 的路由路径中使用“动态路径参数”(dynamic segment) :

新添加了一个user组件,在index.js中配置user组件的路由映射,

image


2、在APP组件中手动绑定一个用户 ID,这样路由的路径中就能显示出用户id:

image


3、还可以在user组件中,显示出用户id:

image


4、效果:

image


二、路由的懒加载

1、认识路由的懒加载

当打包构建应用时,Javascript 包会变得非常大,影响页面加载,如果我们能把不同路由对应的组件分割成不同的代码块,

然后当路由被访问的时候才加载对应组件,这样就更加高效了;


为了实现这种效果,我们可以使用路由的懒加载;


路由懒加载的主要作用就是将路由对应的组件打包成一个个的 js 代码块,只有在这个路由被访问到的时候,才加载对应的组件;


2、懒加载的三种方式

(1)结合 Vue 的异步组件和 Webpack 的代码分析

const Home = resolve => { require.ensure(['../components/Home.vue'], () => { resolve(require('../components/Home.vue')) })};


(2)AMD写法

const About = resolve => require(['../components/About.vue'], resolve);


(3)在ES6中,可以用更加简单的写法来组织 Vue 异步组件和 Webpack 的代码分割

const Home = () => import('../components/Home.vue')


效果:

不使用路由懒加载时:

image


使用路由懒加载:

image


三、路由嵌套

嵌套路由是一个很常见的功能 ,比如在 home 页面中,我们希望通过 /home/news/home/message 访问一些内容,

一个路径映射一个组件,访问这两个路径也会分别渲染两个组件;


路径和组件的关系如下:

image


实现嵌套路由有两个步骤:

创建对应的子组件,并且在路由映射中配置对应的子路由


定义两个子组件:

image


配置子组件的路由:

image


在父组件(Home)内部显示子组件:

image


效果:

image


四、路由的参数传递

1、准备工作

添加Profile组件:

image

配置路由映射:

image


添加router-link:

image


2、参数传递的方式

传递参数主要有两种类型: params 和 query

  • params
    • 配置路由格式:/router/:id
    • 传递的方式:在 path 后面跟上对应的值
    • 传递后形成的路径:/router/123/router/abc
  • query
    • 配置路由格式:/router
    • 传递的方式:对象中使用 query 的 key 作为传递方式
    • 传递后形成的路径:/router?id=123/router?id=abc


(1)query的传递方式

image

image


获取参数:

image

image


五、route和router的区别

router 为 VueRouter 实例,想要导航到不同 URL,则使用 router.push 方法 ;


$route 为当前 router 跳转对象,里面可以获取 name、path、query、params 等;


六、Vue-router导航守卫

在一个 SPA 应用中,如何改变网页的标题呢?

普通的修改方式:在每一个路由对应的组件 .vue 文件中,通过 mounted 声明周期函数,执行对应的代码进行修改,

但是当页面比较多时,需要在多个页面执行类似的代码,所以这种方式不容易维护;


更好的办法是使用导航守卫;


1、什么是导航守卫

导航守卫主要用来监听路由的进入和离开,vue-router 提供了 beforeEach 和 afterEach 的钩子函数,它们会在路由即将改变前和改变后触发;


2、导航守卫使用

我们可以利用 beforeEach 来完成标题的修改:


(1)利用 meta 来定义标题

index.js

image


(2)利用导航守卫(前置钩子),修改标题

index.js

image


效果:

image


导航钩子的三个参数解析:
    to:即将要进入的目标的路由对象
    from:当前导航即将要离开的路由对象
    next:调用该方法后,才能进入下一个钩子


3、导航守卫补充

https://router.vuejs.org/zh/guide/advanced/navigation-guards.html


如果是后置钩子,也就是afterEach,不需要主动调用 next() 函数 ;

上面使用的导航守卫(前置钩子、后置钩子),被称之为全局守卫,除此之外,还有路由独享的守卫、组件内的守卫;


七、keep-alive

keep-alive 是 Vue 内置的一个组件,可以使被包含的组件保留状态,或避免重新渲染.


router-view 也是一个组件,如果直接被包在 keep-alive 里面,所有路径匹配到的视图组件都会被缓存:

<keep-alive>
  <router-view>
    <!-- 所有路径匹配到的试图组件都会被缓存! -->
  </router-view>
</keep-alive>


现在有这样一个需求:首页正正在显示的是被嵌套的消息路由,当我们点击其他页面,又重新点击首页时,让首页仍然显示被嵌套的消息路由:

image


1、

(1)先取消嵌套路由的默认路径

image


(2)在 App.vue 中使用 <keep-alive></keep-alive> 包裹 <router-view/>

image


(3)在 Home.vue 中记录离开之前的路径

image


2、keep-alive其他属性

keep-alive 还有两个非常重要的属性:

  • include - 字符串或正则表达,只有匹配的组件会被缓存
  • exclude - 字符串或正则表达式,任何匹配的组件都不会被缓存


让部分组件不缓存:

让Profile和User不进行缓存

<keep-alive exclude="Profile,User">  <!--逗号后面不要有空格-->
  <router-view/>
</keep-alive>
原文地址:https://www.cnblogs.com/weiyiming007/p/13718093.html