学习vue第六天

101 阅读6分钟

Day6:

1.路由进阶

1.路由的封装抽离
    1.问题:所有的路由配置都堆在main.js中合适么?
    2.目标:将路由模块抽离出来。好处:拆分模块,利于维护
    3.小结
        1.路由模块的封装抽离的好处是什么?
            拆分模块,利于维护
        2.以后如何快速引入组件?
            基于 @ 指代 src 目录,从 src 目录出发找组件

2.声明式导航

1.导航高亮
    1.导航链接
        1.需求:实现导航高亮效果
        2.vue-router提供了一个全局组件router-link(取代 a标签)
            1.能跳转,配置 to 属性指定路径(必须)。本质还是 a标签,to 无需 #
            2.能高亮,默认就会提供高亮类名,可以直接设置高亮样式
        3.小结
            1.router-link是什么?
                vue-router提供的全局组件,用于替换a标签
            2.router-link怎么用?
                1.<router-link to="/路径值"></router-link>
                2.必须传入to属性,指定路由路径值
            3.router-link好处?
                1.能跳转
                2.能高亮(自带激活时的类名)
    2.两个类名
        1.精确匹配&模糊匹配
            说明:我们发现 router-link 自动给当前导航添加了 两个高亮类名
              <div class="footer wrap">
                <a href="#/find”class>发现音乐</a>
                <a href="#/my" aria-current="page" class='router-link-exact-active,router-link-active'>我的音乐</a>
                <a href="#/friend" class>朋友</a>
              </div>
            1.router-link-active 模糊匹配 (用的多)
                to="/my"可以匹配 /my   /my/a    /my/b …
            2.router-link-exact-active 精确匹配
                to="/my"仅可以匹配 /my
            3.小结
                1.router-link 会自动给当前导航添加两个类名,有什么区别呢?
                    1.router-link-active 模糊匹配(用的多)
                    2.router-link-exact-active 精确匹配
        2.自定义高亮类名
            说明:router-link 的 两个高亮类名 太长了,我们希望能定制怎么办?
              <div class="footer wrap">
                <a href="#/find”class>发现音乐</a>
                <a href="#/my" aria-current="page" class='router-link-exact-active,router-link-active'>我的音乐</a>
                <a href="#/friend" class>朋友</a>
              </div>
            方法:
            const router =new VueRouter({
              routes:[...],
              linkActiveclass:"类名1",
              linkExactActiveclass:"类名2"
            })
            结果:
            <div class="footer wrap">
              <a href="#/find” class>发现音乐</a>
              <a href="#/my" aria-current="page"class="类名2,类名1">我的音乐</a>
              <a href="#/friend" class>朋友</a>
            </div>
        3.小结
            1.如何自定义 router-link 的 两个高亮类名?
                linkActiveClass 模糊匹配 类名自定义
                linkExactActiveClass 精确匹配 类名自定义

3.声明式导航传参(查询参数传参&动态路由传参)

1.目标:在跳转路由时,进行传值
2.方法:
    1.查询参数传参
        1.语法格式如下
          to="/path?参数名=值"
        2.对应页面组件接收传递过来的值
          $route.query.参数名
    2.动态路由传参
        1.配置动态路由
          const router= new VueRouter({
            routes:[
              ...,)
              {
                path:'/search/:words',
                component: Search
              }
            ]
          })
        2.配置导航链接
            to="/path/参数值"
        3.对应页面组件接收传递过来的值
            $route.params.参数名
    3.两种传参方式的区别
        1.查询参数传参(比较适合传多个参数)
            1.跳转:to="/path?参数名=值&参数名2=值"
            2.获取:$route.query.参数名
        2.动态路由传参(优雅简洁,传单个参数比较方便)
            1.配置动态路由:path:"/path/参数名"
            2.跳转:to="/path/参数值"
            3.获取:$route.params.参数名
3.小结
    1.声明式导航跳转时,有几种方式传值给路由页面?
        1.查询参数传参(多个参数)
            跳转:to="/path?参数名=值"
            接收:$route.query.参数名
        2.动态路由传参(简洁优雅)
            1.路由: /path/:参数名
            2.跳转:to="/path/值"
            3.接收:$route.params.参数名
4.动态路由参数可选符
    1.问题:配了路由 path:"/search/:words”为什么按下面步骤操作,会未匹配到组件,显示空白?
    2.原因: /search/:words 表示,必须要传参数。如果不传参数,也希望匹配
    3.方法:可以加个可选符"?"

4.vue路由

1.重定向
    1.问题:网页打开,url默认是 / 路径,未匹配到组件时,会出现空白
    2.说明:重定向 → 匹配path后,强制跳转path路径
    3.语法:{path:匹配路径,redirect:重定向到的路径}
      const router= new VueRouter({
          routes:[
            {path:'/', redirect:'/home'},
            {path:'/home', component: Home },
            {path:'/search/:words', component:Search}
          ]
      })
2.路由404
    1.作用:当路径找不到匹配时,给个提示页面
    2.位置:配在路由最后
    3.语法:path:"*"(任意路径) - 前面不匹配就执行这个
3.路由模式
    1.问题:路由的路径看起来不自然,有#,能否切成真正路径形式?
        1.hash路由(默认)例如:http://localhost:8080/#/home
        2.history路由(常用)例如:http://localhost:8080/home(以后上线需要服务器端支持)
        方法:
          const router = new VueRouter({
            routes,
            mode:"history"
          })

5.编程式导航

1.编程式导航-基本跳转
  1.问题:点击按钮跳转如何实现?
  2.编程式导航:用JS代码来进行跳转
  3.两种语法:
      1.path 路径跳转(简易方便)
          this.$router.push('路由路径')

          this.$router.push({
            path:'路由路径'
          })
      2.name 命名路由跳转(适合 path 路径长的场景)
          this.$router.push({
            name:'路由名'
          })

          {name:'路由名',path:'/path/xxx', component:XXX},
  4.小结
  1.编程式导航有几种跳转方式 ?
      1.通过路径跳转(简易方便)
          this.$router.push('路由路径')

          this.$router.push({
            path:'路由路径'
          })
      2.通过路由名字跳转(适合路径名字长的场景)
          this.$router.push({
            name:'路由名'
          })
          {name:'路由名', path:'/path/xxx',...},
2.编程式导航-路由传参(查询参数传参&动态路由传参)
    1.问题:点击搜索按钮,跳转需要传参如何实现?
        两种传参方式:查询参数+动态路由传参
    2.两种跳转方式,对于两种传参方式都支持:
        1.path 路径跳转传参
            1.query传参
                1.this.$router.push('/路径?参数名1=参数值1&参数2=参数值2')
                2.this.$router.push({     //上面的方法适合参数少的时候  下面数组的写法适合参数多的适合
                  path:'/路径',
                  query:{
                    参数名1:'参数值1',
                    参数名2:'参数值2'
                  }
                })
                接收:$route.query.参数名
            2.动态路由传参
                1.this.$router.push('/路径/参数值')
                2.this.$router.push({
                  path:'/路径/参数值'
                })
                接收:$route.params.参数名(动态路由传参需要配路由)
        2.name 命名路由跳转传参
            1.query传参
                this.$router.push({
                  name:'路由名字',
                  query:{
                    参数名1:'参数值1',
                    参数名2:'参数值2'
                  }
                })
                接收:$route.query.参数名
            2.动态路由传参
                this.$router.push({
                  name:'路由名字',
                  params:{
                    参数名:'参数值'
                  }
                })
                接收:$route.params.参数名(动态路由传参需要配路由)
    3.小结
        1.编程式导航,如何跳转传参?
            1.path 路径跳转
                1.query传参
                    1.this.$router.push('/路径?参数名1=参数值1&参数2=参数值2')
                    2.this.$router.push({     //上面的方法适合参数少的时候  下面数组的写法适合参数多的适合
                      path:'/路径',
                      query:{
                        参数名1:'参数值1',
                        参数名2:'参数值2'
                      }
                    })
                2.动态路由传参(需要配动态路由)
                    1.this.$router.push('/路径/参数值')
                    2.this.$router.push({
                      path:'/路径/参数值'
                    })
            2.name 命名路由跳转
                1.query传参
                    this.$router.push({
                      name:'路由名字',
                      query:{
                        参数名1:'参数值1',
                        参数名2:'参数值2'
                      }
                    })
                2.动态路由传参
                    this.$router.push({
                      name:'路由名字',
                      params:{
                        参数名:'参数值'
                      }
                    })

6.综合案例:面经基础版(第82-87集)

  一级路由/二级路由/导航高亮/请求渲染/路由传参
缓存组件:
  1.问题:从面经 点到 详情页,又点返回,数据重新加载了→希望回到原来的位置
  2.原因:路由跳转后,组件被销毁了,返回回来组件又被重建了,所以数据重新被加载了
  3.解决:利用 keep-alive 将组件缓存下来
  4.keep-alive是什么
        keep-alive 是 Vue 的内置组件,当它包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们。keep-alive 是一个抽象组件:它自身不会渲染成一个 DOM 元素,也不会出现在父组件链中。
  5.keep-alive的优点
        在组件切换过程中 把切换出去的组件保留在内存中,防止重复渲染DOM减少加载时间及性能消耗,提高用户体验性。
  6.问题:缓存了所有被切换的组件
  7.keep-alive的三个属性
      1.include :组件名数组,只有匹配的组件会被缓存       //1和2通常分开用
      2.exclude:组件名数组,任何匹配的组件都不会被缓存    //2和3通常一起用
      3.max:最多可以缓存多少组件实例
  8.小结
      1.keep-alive是什么
          Vue 的内置组件,包裹动态组件时,可以缓存
      2.keep-alive的优点
          组件切换过程中 把切换出去的组件保留在内存中(提升性能)
      3.keep-alive的三个属性(了解)
          1.include : 组件名数组,只有匹配的组件会被缓存
          2.exclude :组件名数组,任何匹配的组件都不会被缓存
          3.max:最多可以缓存多少组件实例
      4.keep-alive的使用会触发两个生命周期函数(了解)
          1.activated当组件被激活(使用)的时候触发  →  进入页面触发
          2.deactivated 当组件不被使用的时候触发  →  离开页面触发