一、详情页面路由跳转
应用 Vue Router 编程式导航通过 this.$router.push() 来实现路由跳转。
1、绑定查看详情事件
修改 src/components/Course/Course.vue 文件,给课程 div 绑定查看详情事件。
<div class="courseList"> <div class="detail" v-for="(course, index) in courseDetail" :key="course.id" @click="detailHandler(course.id)"> <div class="head"> <img :src="course.course_img" alt="" class="backImg"> <!-- 背景色:行内样式优先显示 --> <b class="mask" :style="{background: course.bgColor}"></b> <p>{ { course.name }}</p> </div>
v-on,缩写 @ ,绑定事件监听器。事件类型由参数指定。表达式可以是一个方法的名字或一个内联语句,如果没有修饰符也可以省略。
2、定义详情事件
methods: { // 课程详情时间操作 detailHandler(id) { this.$router.push({ name: "course.detail", params: { detailId: id, } }) },
注意:path只能和query搭配使用,name可以和params/query搭配使用,使用params传参只能使用name进行引入。
3、定义新的路由规则
在 src/router/index.js 添加如下内容:
import CourseDetail from '@/components/Course/CourseDetail' // 配置路由规则 export default new Router({ linkActiveClass: 'is-active', mode: 'history', // 改为history模式 routes: [ // 略 // 课程详情,路由:course/detail/web/3 { path: '/course/detail/web/:detailId', // 动态匹配 name: 'course.detail', // 路由名称 component: CourseDetail // 对应组件 } ] })
要把某种模式匹配到的所有路由,全部映射到同个组件。比如这里是课程详情组件,但是各个不同的课程有不同的 id,且都要用这个组件来渲染。那么可以在vue-router的路由路径中使用”动态路径参数“(dynamic segment)来实现这个效果。
一个“路径参数”使用冒号 :
标记。当匹配到一个路由时,参数值会被设置到 this.$route.params
,可以在每个组件内使用。于是,我们可以更新 CourseDetail
的模板,输出当前课程的 ID:
<template> <div> CourseID:{ { $route.params.detailId}} </div> </template> <script> export default { name: "CourseDetail", data() { return { }; }, }; </script>
页面显示效果如下所示:
二、课程详情页面实现
1、课程详情顶部布局和样式
<template> <div class="wrap"> <div class="web-course-banner"> <div class="container"> <div class="title"> <img src="../../../static/images/play.png" height="67" width="67" alt=""> <h1 class="course-title">Django框架学习</h1> </div> <span class="course-text">Python语言下最强大优秀的WEB框架从入门到进阶</span> <div class="course-list"> <ul> <li class="detail-item"> 难度:初级 </li> <li class="sep"></li> <li class = detail-item>时长:32小时</li> <li class="sep"></li> <li class = detail-item>学习人数:632人</li> <li class="sep"></li> <li class = detail-item>评分 10.0</li> </ul> </div> </div> </div> <!-- 代码略 --> </div> </template> <style lang="css" scoped> .wrap{ width: 100%; } .web-course-banner{ width: 100%; height: 512px; background: url(../../../static/images/web-banner.1402933.png) no-repeat; background-size<