我们在前面将每件商品的信息传给了GoodsListItem组件,保存在goodsItem变量中。并且每件商品有一个唯一的标识符iid。当点击该商品后,会跳转到该商品的详情页。所有的详情页使用同一个组件Detail,今天我们来回顾一下Detail组件的开发过程。

  首先需要配置路由,由于Detail组件并不唯一对应某一个页面,所以它要配置为动态路由。动态路由的配置方法有两种:params方法和query方法。(设Id的值为123)

    params方法:在路由表中配置时path: '/detail/:id',使用时'/detail/' + Id。传递后形成的路径为/detail/123。传递过来的路由参数(如id)保存在当前路由对象$route的params属性中。

    query方法:在路由表中配置时path: '/detail',使用时{path: '/detail', query: {iid: Id}}。传递后形成的路径为/detail/?iid=123。

  采用第一种方法,代码如下:

    //    路由懒加载
    const Detail = () => import('views/detail/Detail')
    //    在路由表routes中
    {
      path: '/detail/:id',
      component: Detail
    }
    //    在goodsListItem组件中
    itemClick(){
      this.$router.push('/detail/' + this.goodsItem.iid)
    }
    //    在detail组件的created钩子函数中
    this.iid = this.$route.params.id;

  还需要注意的是,在之前我们在router-view标签外面加上了keep-alive标签,目的是每次离开Home页面时不销毁这个组件并保留相关状态,这样再次回来时能直接激活。但是这显然不适用于Detail组件,因为若Detail组件也被keep-alive,那当用户点击其它商品查看时,始终会跳转到第一次点击的商品的详情页。所以我们给keep-alive标签添加一个exclude属性,值为“Detail”。

  接下来便要获取当前商品的详情数据了,代码和之前类似:

// 在Deail组件的created钩子函数中调用getDetail函数
getDetail(this.iid).then((res) => { const data = res.result; // 1、获取顶部的图片轮播数据 this.topImages = data.itemInfo.topImages; // 2、获取商品信息 this.goods = new Goods( data.itemInfo, data.columns, data.shopInfo.services ); // 3、获取店铺信息 this.shop = new Shop(data.shopInfo); // 4、保存商品详情数据 this.detailInfo = data.detailInfo; // 5、获取参数信息 this.paramsInfo = new GoodsParam( data.itemParams.info, data.itemParams.rule ); // 6、获取评论信息 if (data.rate.cRate !== 0) { this.commentInfo = data.rate.list[0]; } });
//    定义getDetail函数
export function getDetail(iid){
  return request({
    url: '/detail',
    params: {
      iid
    }
  })
}

可以看到,上面拿到数据后将它们进行了分类保存,事实上,每一类就对应一个组件,从上到下分别为:顶部导航条DetailNavBar、底部的导航条DetailBottomBar、轮播图DetailSwiper、商品信息DetailBaseInfo、店铺信息DetailShopInfo、商品大图DetailGoodsInfo、买家评论DetailCommentInfo和相似推荐GoodsList。后面我们就按照这个顺序看看这些组件如何实现的。

posted on 2021-06-29 16:45  springxxxx  阅读(196)  评论(0编辑  收藏  举报