• VueRouter


    路由介绍

    1.思考

    单页面应用程序,之所以开发效率高,性能好,用户体验好

    最大的原因就是:页面按需更新

    比如当点击【发现音乐】和【关注】时,只是更新下面部分内容,对于头部是不更新的

    要按需更新,首先就需要明确:访问路径组件的对应关系!

    访问路径 和 组件的对应关系如何确定呢? 路由

    2.路由的介绍

    生活中的路由:设备和ip的映射关系

    Vue中的路由:路径和组件映射关系

    3.总结

    • 什么是路由
    • Vue中的路由是什么

    路由的基本使用

    1.目标

    认识插件 VueRouter,掌握 VueRouter 的基本使用步骤

    2.作用

    修改地址栏路径时,切换显示匹配的组件

    3.说明

    Vue 官方的一个路由插件,是一个第三方包

    4.官网

    Vue Router

    5.VueRouter的使用(5+2)

    固定5个固定的步骤(不用死背,熟能生巧)

    1. 下载 VueRouter 模块到当前工程,版本3.6.5
    yarn add vue-router@3.6.5
    1. main.js中引入VueRouter
    import VueRouter from 'vue-router'
    1. 安装注册
    Vue.use(VueRouter)
    1. 创建路由对象
    const router = new VueRouter()
    1. 注入,将路由对象注入到new Vue实例中,建立关联
    1. new Vue({
    2. render: h => h(App),
    3. router:router
    4. }).$mount('#app')

    当我们配置完以上5步之后 就可以看到浏览器地址栏中的路由 变成了 /#/的形式。表示项目的路由已经被Vue-Router管理了

    6.代码示例

    main.js

    1. // 路由的使用步骤 5 + 2
    2. // 5个基础步骤
    3. // 1. 下载 v3.6.5
    4. // yarn add vue-router@3.6.5
    5. // 2. 引入
    6. // 3. 安装注册 Vue.use(Vue插件)
    7. // 4. 创建路由对象
    8. // 5. 注入到new Vue中,建立关联
    9. import VueRouter from 'vue-router'
    10. Vue.use(VueRouter) // VueRouter插件初始化
    11. const router = new VueRouter()
    12. new Vue({
    13. render: h => h(App),
    14. router
    15. }).$mount('#app')

    7.两个核心步骤

    1. 创建需要的组件 (views目录),配置路由规则
    2. 配置导航,配置路由出口(路径匹配的组件显示的位置)
      App.vue
    1. <div class="footer_wrap">
    2. <a href="#/find">发现音乐</a>
    3. <a href="#/my">我的音乐</a>
    4. <a href="#/friend">朋友</a>
    5. </div>
    6. <div class="top">
    7. <router-view></router-view>
    8. </div>

    8.总结

    1. 如何实现 路径改变,对应组件 切换,应该使用哪个插件?
    2. Vue-Router的使用步骤是什么(5+2)?

    组件的存放目录问题

    注意: .vue文件 本质无区别

    1.组件分类

    .vue文件分为2类,都是 .vue文件(本质无区别)

    • 页面组件 (配置路由规则时使用的组件)
    • 复用组件(多个组件中都使用到的组件)

    2.存放目录

    分类开来的目的就是为了 更易维护

    1. src/views文件夹
      页面组件 - 页面展示 - 配合路由用
    2. src/components文件夹
      复用组件 - 展示数据 - 常用于复用

    3.总结

    • 组件分类有哪两类?分类的目的?
    • 不同分类的组件应该放在什么文件夹?作用分别是什么?

    路由的封装抽离

    问题:所有的路由配置都在main.js中合适吗?

    目标:将路由模块抽离出来。  好处:拆分模块,利于维护

    路径简写:

    脚手架环境下 @指代src目录,可以用于快速引入组件

    声明式导航-导航链接

    1.需求

    实现导航高亮效果

    如果使用a标签进行跳转的话,需要给当前跳转的导航加样式,同时要移除上一个a标签的样式,太麻烦!!!

    2.解决方案

    vue-router 提供了一个全局组件 router-link (取代 a 标签)

    • 能跳转,配置 to 属性指定路径(必须) 。本质还是 a 标签 ,to 无需 #
    • 能高亮,默认就会提供高亮类名,可以直接设置高亮样式

    语法: 发现音乐

    1. <div>
    2. <div class="footer_wrap">
    3. <router-link to="/find">发现音乐</router-link>
    4. <router-link to="/my">我的音乐</router-link>
    5. <router-link to="/friend">朋友</router-link>
    6. </div>
    7. <div class="top">
    8. <!-- 路由出口 → 匹配的组件所展示的位置 -->
    9. <router-view></router-view>
    10. </div>
    11. </div>

    3.通过router-link自带的两个样式进行高亮

    使用router-link跳转后,我们发现。当前点击的链接默认加了两个class的值 router-link-exact-activerouter-link-active

    我们可以给任意一个class属性添加高亮样式即可实现功能

    4.总结

    • router-link是什么?
    • router-link怎么用?
    • router-link的好处是什么?

    声明式导航-两个类名

    当我们使用跳转时,自动给当前导航加了两个类名

    模糊匹配(用的多)

    to="/my"  可以匹配 /my    /my/a    /my/b    ....

    只要是以/my开头的路径 都可以和 to="/my"匹配到

    精确匹配

    to="/my" 仅可以匹配  /my

    3.在地址栏中输入二级路由查看类名的添加

    4.总结

    • router-link 会自动给当前导航添加两个类名,有什么区别呢?

    声明式导航-自定义类名(了解)

    1.问题

    router-link的两个高亮类名 太长了,我们希望能定制怎么办

    2.解决方案

    我们可以在创建路由对象时,额外配置两个配置项即可。 linkActiveClasslinkExactActiveClass

    1. const router = new VueRouter({
    2. routes: [...],
    3. linkActiveClass: "类名1",
    4. linkExactActiveClass: "类名2"
    5. })

    3.代码演示

    1. // 创建了一个路由对象
    2. const router = new VueRouter({
    3. routes: [
    4. ...
    5. ],
    6. linkActiveClass: 'active', // 配置模糊匹配的类名
    7. linkExactActiveClass: 'exact-active' // 配置精确匹配的类名
    8. })

    4.总结

    如何自定义router-link的两个高亮类名

    声明式导航-查询参数传参

    1.目标

    在跳转路由时,进行传参

    比如:现在我们在搜索页点击了热门搜索链接,跳转到详情页,需要把点击的内容带到详情页,改怎么办呢?

    2.跳转传参

    我们可以通过两种方式,在跳转的时候把所需要的参数传到其他页面中

    • 查询参数传参
    • 动态路由传参

    3.查询参数传参

    • 如何传参?
    • 如何接受参数
      固定用法:$router.query.参数名

    4.代码演示

    App.vue

    1. <script>
    2. export default {};
    3. script>
    4. <style scoped>
    5. .link {
    6. height: 50px;
    7. line-height: 50px;
    8. background-color: #495150;
    9. display: flex;
    10. margin: -8px -8px 0 -8px;
    11. margin-bottom: 50px;
    12. }
    13. .link a {
    14. display: block;
    15. text-decoration: none;
    16. background-color: #ad2a26;
    17. width: 100px;
    18. text-align: center;
    19. margin-right: 5px;
    20. color: #fff;
    21. border-radius: 5px;
    22. }
    23. style>

    Home.vue