想利用暑假时间好好学习一下vue,会记录每一天的学习内容。 今天是学习vue的第18 天!
起起伏伏乃人生常态,继续加油~
1. 点击商品跳转到详情页
点击GoodsItem 要跳转到详情页,我们可以给详情页配置一个对应路由
const Detail = () => import('../views/detail/Detail.vue');
const routes = [
{
path: '/detail',
component: Detail
}
]
而且这里我们应该在跳转路由的时候传递一些参数,把点击的该商品的id传过去,传递参数有两种类型params 和query ,这里我用了params 类型:
{
path: '/detail/:itemId',
component: Detail
}
methods: {
itemClick() {
this.$router.push("/detail/" + this.goodsItem.iid);
}
}
2. 请求详情页数据
我们要在Detail.vue 组件中获取到这个iid并且请求对应的数据
data() {
return {
iid: null
}
},
created() {
this.iid = this.$route.params.itemId;
}
现在我们的iid 中就保存了iid ,接下来要根据这个iid 发送网络请求
import {request} from './request'
export function getDetailMessage(iid) {
return request({
url: '/detail',
params: {
iid
}
})
}
在Detail.vue 组件中中引入并调用getDetailMessage() 方法:
created() {
this.iid = this.$route.params.itemId;
this.getDetailMessage(this.iid);
},
methods: {
getDetailMessage(iid) {
getDetailMessage(iid).then(res => {
console.log(res);
})
}
}
3. 详情页导航栏使用
NavBar 组件实际上前面我们已经封装好了,这里直接往插槽里插我们需要的东西就ok了
<nav-bar>
<template #left>
<img @click="backClick" src="../../assets/img/common/back.svg" alt="">
</template>
<template #center>
<a href="javascript:;"
v-for="(item, index) in title"
:key="item"
:class="{ activeTitle: currentIndex == index }"
@click="titleClick(index)">
{{ item }}
</a>
</template>
</nav-bar>
import NavBar from "../../components/common/navbar/NavBar.vue";
data() {
return {
title: ["商品", "参数", "评论", "推荐"],
currentIndex: 0,
}
},
components: {
NavBar,
},
methods: {
titleClick(index) {
this.currentIndex = index;
},
backClick() {
this.$router.back();
},
}
4. 轮播图展示
封装好的直接拿来用就行
Detail.vue :
<swiper class="detail-swiper">
<swiper-item
v-for="item in topImgs"
:key="item">
<img :src="item" alt="" />
</swiper-item>
</swiper>
import Swiper from "../../components/common/swiper/Swiper.vue";
import SwiperItem from "../../components/common/swiper/SwiperItem.vue";
export default {
data() {
return {
topImgs: [],
}
},
created() {
this.iid = this.$route.params.itemId;
this.getDetailMessage(this.iid);
},
methods: {
getDetailMessage(iid) {
getDetailMessage(iid).then((res) => {
this.topImgs = res.data.result.itemInfo.topImages;
});
},
}
}
5. 商品详细数据的获取
我们的商品信息很复杂,我们应该整合数据到一个对象中,这里我们可以定义一个类
export class GoodsInfo {
constructor(itemInfo, columns, services) {
this.title = itemInfo.title
this.desc = itemInfo.desc
this.newPrice = itemInfo.price
this.oldPrice = itemInfo.oldPrice
this.discount = itemInfo.discountDesc
this.columns = columns
this.services = services
this.realPrice = itemInfo.lowNowPrice
}
}
import { GoodsInfo } from "../../network/detail";
data() {
return {
goods: {}
}
},
methods: {
getDetailMessage(iid) {
getDetailMessage(iid).then((res) => {
this.goods = new GoodsInfo(res.data.result.itemInfo,res.data.result.columns,res.data.result.shopInfo.services)
});
},
}
(展示的话再新建个组件,把我们对应的数据取出来然后写样式什么的)
6. 点击标题滚到对应位置
其实就是点击标题改变对应的scrollTop 值,这个scrollTop 值是各个子组件的offsetTop 值 给详情页的各个子组件设置ref值,用this.$refs.ref值 获取到子组件实例
不能直接用this.$refs.ref值.offsetTop 因为组件不是DOM 元素,是没有offsetTop 的,就需要通过$el 获取组件中的DOM 元素
也就是this.$refs.ref值.$el.offsetTop 注意这个获取应该放在页面中DOM 元素都渲染完,数据都请求完,且图片都加载完之后,不然获取不到正确的offsetTop
|