微信小程序开发一个小型商城(五、商品详情)

上一篇文章:微信小程序开发一个小型商城(四、商品列表)
在从上一个界面跳转过来,会看到商品详情这个界面goods_detail :如下图所示:
在这里插入图片描述
页面分析:从上到下:一个轮播图+一个view标签存储商品名和价格等信息,再下面就是把数据渲染出来的图片,最后面就是几个按钮组成的一个绝对定位的view。

轮播图组件

轮播图组件在先前已经使用过了,在这里也就不做过多的介绍;轮播图,单击前往

<view class="detail_swiper">
    <swiper autoplay circular indicator-dots interval="2000">
        <!--给轮播图的子选项绑定事件。-->
        <swiper-item wx:for="{{goodsObj.pics}}" wx:key="pics_id" data-url="{{item.pics_mid}}" bindtap="handlePrevewImage">
            <image src="{{item.pics_mid}}" mode="widthFix" />
        </swiper-item>
    </swiper>
</view>

添加样式:是的图片宽占据全屏,同样是使用less文件进行编辑

page{
    padding-bottom: 90rpx;
}
.detail_swiper{
    swiper{
        height: 70vw;
        text-align: center;
        image{
            height: 60%;
        }
    }
}

商品名称+价格
先使用 view标签对其进行包裹,里面的收藏是需要引入外部图标,

<!--商品数据-->
<view class="goods_price">{{goodsObj.goods_price}}</view>
<view class="goods_name_row">
    <view class="goods_name">{{goodsObj.goods_name}}</view>
    <view class="goods_collect" bindtap = "handlecollect">
        <text class="iconfont  {{isCollect?'icon-xingzhuanggongnengtubiao-':'icon-shoucang'}}">
            <view class="collect_test">收藏</view>
        </text>
    </view>
</view>

给其加上定位和样式:

.goods_price{
padding: 15rpx;
font-size: 32rpx;
font-weight: 600;
color: var(--themeColor);
}
.goods_name_row{
    border-top: 5px solid #dedede;
    border-bottom: 5px solid #dedede;
    display: flex;
    padding: 10rpx 0;
    .goods_name{
        flex: 5;
        color: black;
        font-size: 30rpx;
        padding: 0 10rpx;
        display: -webkit-box;
        overflow: hidden;
        -webkit-box-orient:vertical;
        -webkit-line-clamp: 2;
    }
    .goods_collect{
        flex: 1;
        display: flex;
        flex-direction: column;
        justify-content: center;
        align-items: center;
        border-left: 1px solid #000;
        .icon-xingzhuanggongnengtubiao-{
            color: red;	}}}

图文详情
对接口获取过来的数据直接进行渲染,使用富文本标签使其不解析,直接在页面上显示效果:

<view class="goods_info">
    <view class="goods_info_title">图文详情</view>
    <view class="goods_info_content">
        <rich-text nodes="{{goodsObj.goods_introduce}}">
        </rich-text>
    </view>
</view>

加上样式:

.goods_info{
    .goods_info_title{
        font-size: 32rpx;
        color: var(--themeColor);
        font-weight: 600;
        padding: 20rpx;
    }
}

按钮
在最下方的客服、分享、立即购买的组件,嫁过来的外部图标根据自己所选择的图标需要有所修改:比如 icon-fenxiang 是在style文件夹下的iconfont.wxss当中可以看到的

<view class="btm_tool">
    <view class="toll_item">
        <view class="iconfont icon-htmal5icon31"></view>
        <view>客服</view>
       <button open-type="contact"></button>
    </view>
    <view class="toll_item">
        <view class="iconfont icon-fenxiang"></view>
        <view>分享</view>
        <button open-type="share"></button>
    </view>
    <!--使用open-type="switchTab"表示允许跳转到tabar页面-->
    <navigator url="/pages/cart/index" class="toll_item" open-type="switchTab">
        <view class="iconfont icon-gouwuche2"></view>
        <view>购物车</view>
    </navigator>
    <view class="tool_item btn_cart" bindtap = "handleCartAdd">加入购物车</view>
    <view class="tool_item btn_buy">立即购买</view>
</view>

给下方的view加上样式:使用绝对定位将其固定在最下方;

.btm_tool{
    border-top: 1px solid #ccc;
    position: fixed;
    left: 0;
    bottom: 0;
    width: 100%;
    height: 90rpx;
    background-color: #fff;
    display: flex;
    .toll_item{
        flex: 1;
        display: flex;
        flex-direction: column;
        justify-content: center;
        align-items: center;
        font-size: 24rpx;
        position: relative;
        button{
            position: absolute;
            top: 0;
            left: 0;
            height: 100%;
            width: 100%;
            opacity: 0; //透明度
        }
    }
    .btn_cart{
        flex: 2;
        display: flex;
        flex-direction: column;
        justify-content: center;
        align-items: center;
        background-color: #ffa500;
        color: #fff;
        font-size: 30rpx;
        font-weight: 600;
    }
    .btn_buy{
        flex: 2;
        display: flex;
        flex-direction: column;
        justify-content: center;
        align-items: center;
        background-color: red;
        color: #fff;
        font-size: 32rpx;
        font-weight: 600;
    }
}

获取接口数据进行动态渲染
在先前的基础上发送请求获取数据,现在data下面定义存储数据的变量:

goodsObj: [], //存储数据的数组
isCollect: false,//表示是否被收藏过。

以及一个全局变量:

  GoodsInfo: {},   //商品对象

发送请求获取接口返回的数据,并且将数据给goodsObj赋值:在这里使用了es7语法和外部的resquest文件,需要在最前面进行引入:使用代码段:import { request } from "../../request/index.js"; import regeneratorRuntime from "../../lib/runtime/runtime"; 获取接口的时候需要传递参数,商品id

  async getGoodsDetail(goods_id) {
    const goodsObj = await request({
      url: "/goods/detail",
      data: { goods_id },
    });
    console.log(goodsObj);
    this.GoodsInfo = goodsObj;
    //获取缓存中收藏的数组
    let collect = wx.getStorageSync("collect") || [];
    let isCollect = collect.some((v) => v.goods_id === this.GoodsInfo.goods_id);
    this.setData({
      goodsObj: {
        goods_name: goodsObj.goods_name,
        goods_price: goodsObj.goods_price,
        //在获取返回的数据当中存在webp图片格式,将其转化为jpg格式
        goods_introduce: goodsObj.goods_introduce.replace(/\.webp/g, ".jpg"),
        pics: goodsObj.pics,
      },
    });
  },

怎么获取id呢?在onShow方法当中的形参options当中即带有goods_id的值,因此,我们在onShow方法当中给一个变量goods_id进行赋值获取options的值,再调用getGoodsDetail的方法,给其一个goods_id的值即可;

  onShow: function (options) {
    //获取去页面栈的options值传给变量current
    let pages = getCurrentPages();
    const current = pages[pages.length - 1].options;
    const { goods_id } = current;
    console.log(goods_id);
    this.getGoodsDetail(goods_id);
  },

在完成上述步骤之后,在APPdata当中就可以看到goodsObj的值:图下图所示:
在这里插入图片描述
单击轮播图预览大图
单击前往:预览大图
本质上就是获取单击轮播图图片之后获取图片的url,再传递js,根据jd当中的方法预览图片;

收藏商品事件
在appdata当中可以看到isCollect的值还是false,这时候是没有收藏,给收藏按钮绑定一个单击事件,被单击后修改isCollect的值(每一此单击后进行取反),并且修改图标的背景颜色(在less文件中已定义)。以及使用一个交互的api showToast进行给出提示:

  handlecollect(e) {
    //获取isCollect的值,设置为flase,在后面修改值
    let isCollect = false;
    //获取缓存当中的商品收藏数组
    let collect = wx.getStorageSync("collect") || [];
    //判断是否被选中收藏过
    let index = collect.findIndex(
      (v) => v.goods_id === this.GoodsInfo.goods_id
    );
    //index!=-1的时候表示收藏过了
    if (index !== -1) {
      //表示可以找到这个商品,即被收藏过了
      collect.splice(index, 1);
      isCollect = false;
      wx.showToast({
        title: "取消收藏",
        mask: true,
      });
    } else {
      //没有收藏过,
      collect.push(this.GoodsInfo);
      isCollect = true;
      wx.showToast({
        title: "收藏成功",
        mask: true,
      });
    }
    //将数组存入缓存
    wx.setStorageSync("collect", collect);
    //修改isCollect的值,并且填充到data中
    this.setData({
      isCollect,
    });
  },

加入购物车
在单击购物车图标的时候给其绑定一个单击事件,使用缓存对其进行存放,

  handleCartAdd(e) {
    console.log("添加到购物车");
    //获取缓存数据
    let cart = wx.getStorageSync("cart") || []; //数据类型转换
    //判断 商品对象是否存在于购物车数组内
    let index = cart.findIndex((v) => v.goods_id === this.GoodsInfo.goods_id);
    if (index === -1) {
      //不存在,第一次添加
      this.GoodsInfo.num = 1;
      //第一次添加的时候,给定一个复选框的默认值为true
      this.GoodsInfo.checked = true;
      cart.push(this.GoodsInfo);
    } else {
      //已经存在
      cart[index].num++;
    }
    //把数据重新缓存到数据当中
    wx.setStorageSync("cart", cart);
    wx.showToast({
      title: "加入成功",
      icon: "sucess",
      mask: true,
      //给定时间间隔
    });
  },

到后面可以在network当中看到缓存值:如下图:cart
在这里插入图片描述
文章持续更新中…

下一篇 :微信小程序开发一个小型商城(六、购物车页面)单击前往

  • 7
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Spring Boot 是一个用于构建独立的、可扩展的、基于Java的应用程序的框架。微信小程序是一种基于微信平台的轻量级应用程序。通过结合Spring Boot 和微信小程序开发实战,可以创建出功能丰富、灵活可扩展的小程序。 首先,可以使用Spring Boot 提供的便利性和高效性来创建一个后端服务。通过Spring Boot 的自动配置和快速开发特性,可以快速搭建一个高度可扩展的后端服务,支持实现用户登录验证、数据存储和访问等功能。 其次,可以利用微信小程序提供的各种API和功能来实现与用户的交互。可以使用微信小程序的界面组件和模板来构建用户界面,支持用户与小程序进行交互。同时,通过调用微信提供的API,可以实现用户登录、用户位置获取、支付等功能。 此外,通过Spring Boot 和微信小程序的结合,可以实现数据的实时同步和共享。可以通过后端服务将数据存储到数据库中,并通过微信小程序将数据展示给用户。同时,通过微信小程序提供的数据上报和反馈功能,可以将用户的操作数据实时传输到后端服务,并进行相应的处理。 最后,利用Spring Boot 和微信小程序开发实战,可以进行持续的迭代和优化。通过使用Spring Boot 提供的测试框架和集成开发环境,可以快速进行开发和测试。同时,通过微信小程序提供的发布和更新功能,可以实现小程序的持续改进和功能优化。 综上所述,通过Spring Boot 和微信小程序开发实战,可以创建出高效、灵活、功能强大的小程序,为用户提供良好的使用体验。同时,可以借助Spring Boot 和微信小程序提供的开发工具和功能,实现快速开发、持续迭代和优化的开发流程。 ### 回答2: Spring Boot是一种用于构建Java应用程序的开源框架。微信小程序是一种可以在微信中运行的小型应用程序。结合Spring Boot和微信小程序可以进行微信小程序开发实战。 在使用Spring Boot开发微信小程序时,我们可以使用Spring Boot的各种特性和功能来加快开发速度和简化开发过程。首先,我们可以使用Spring Boot的自动配置功能来快速配置和集成微信小程序的相关组件和功能。例如,我们可以使用Spring Boot的自动配置来集成微信小程序的授权登录和用户信息获取功能,这样我们就可以快速实现用户登录和权限控制。 其次,Spring Boot有良好的开发文档和社区支持,我们可以通过查阅文档和参与社区讨论来解决开发过程中的问题和困惑。同时,Spring Boot也有丰富的第三方库和插件,我们可以借助这些工具来实现更复杂的功能和性能优化。 此外,Spring Boot还提供了方便的测试工具和环境,我们可以通过单元测试和集成测试来确保微信小程序的稳定性和质量。通过使用Spring Boot的测试工具,我们可以快速编写和运行各种类型的测试,例如接口测试、性能测试和压力测试等。 最后,Spring Boot具有良好的扩展性和可维护性,我们可以使用Spring Boot的模块化和组件化特性来管理和维护微信小程序的代码和资源。同时,Spring Boot也支持容器化部署,我们可以使用Docker等工具将微信小程序打包为容器镜像,并通过云平台实现自动化的部署和运维。 综上所述,使用Spring Boot进行微信小程序开发实战可以提高开发效率、简化开发过程、保证应用质量,并且具备良好的扩展性和可维护性。这些优点使得Spring Boot成为一种非常适合用于微信小程序开发的框架。 ### 回答3: Spring Boot 是一个开源的Java开发框架,它简化了Java应用程序的配置和部署过程。微信小程序是一种用于开发在微信平台上运行的小程序的框架。在开发微信小程序时,使用Spring Boot可以提供更高效、更简洁的开发方式。 首先,Spring Boot提供了丰富的功能和插件,可以帮助开发者快速搭建微信小程序的后端服务。通过使用Spring Boot的自动配置功能,可以省去繁琐的配置过程,并且可以轻松地集成其他常用的框架和组件,如数据库访问、缓存、消息队列等。 其次,Spring Boot提供了灵活的开发方式,可以根据具体需求选择使用Java、Kotlin或者Groovy等不同的开发语言。开发者可以根据自己的技术栈和喜好进行选择,提高开发效率。 另外,Spring Boot还提供了丰富的文档和社区支持,开发者可以轻松地学习和解决问题。通过参与Spring Boot社区,可以与其他开发者进行交流和分享经验,使开发过程更加顺利。 总结来说,Spring Boot在微信小程序开发中可以提供快速搭建后端服务、灵活的开发方式和丰富的文档和社区支持等优势。使用Spring Boot开发微信小程序,可以提高开发效率,减少不必要的工作量,让开发者能够更专注于业务逻辑的实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Modify_QmQ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值