• 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>
  • 相关阅读:
    Bootstrap
    格式化字符串
    闭包函数与装饰器
    正则表达式
    jQuery
    分布式-锁-1.1 多线程锁无法满足的场景
    effective python 读书笔记-第22条: 尽量用辅助类来维护程序的状态,而不要用字典
    effective python 读书笔记:第21条-用只能以关键字形式指定的参数来确保代码明晰
    effective python 读书笔记:第20条-用None和文档字符串来描述具有动态默认值的参数
    git如何将上游(upstream)新建分支(origin没有)导入到origin中?
  • 原文地址:https://www.cnblogs.com/weiyiming007/p/13718093.html
Copyright © 2020-2023  润新知