使用Taro实现小程序商城的购物车功能模块的实例代码

Taro 是一套遵循 React 语法规范的 多端开发 解决方案。

现如今市面上端的形态多种多样,Web、React-Native、微信小程序等各种端大行其道,当业务要求同时在不同的端都要求有所表现的时候,针对不同的端去编写多套代码的成本显然非常高,这时候只编写一套代码就能够适配到多端的能力就显得极为需要。

使用 Taro,我们可以只书写一套代码,再通过 Taro 的编译工具,将源代码分别编译出可以在不同端(微信/百度/支付宝/字节跳动/QQ/京东小程序、快应用、H5、React-Native 等)运行的代码。

官方文档:https://nervjs.github.io/taro/

项目已上传GitHub:https://github.com/LazyTraveller/Jerry-Taro-Demo/blob/master/README.md

一、使用Taro cli工具初始化项目

1. 安装taro脚手架工具

首先,你需要使用 npm 或者 yarn 全局安装@tarojs/cli,或者直接使用npx:

# 使用 npm 安装 CLI
$ npm install -g @tarojs/cli
# OR 使用 yarn 安装 CLI
$ yarn global add @tarojs/cli
# OR 安装了 cnpm,使用 cnpm 安装 CLI
$ cnpm install -g @tarojs/cli

2. 初始化taro项目

使用命令创建模板项目
 $ taro init myApp
npm 5.2+ 也可在不全局安装的情况下使用 npx 创建模板项目
$ npx @tarojs/cli init myApp

3. 进入myApp目录,安装依赖

# 使用 yarn 安装依赖
$ yarn
# OR 使用 cnpm 安装依赖
$ cnpm install
# OR 使用 npm 安装依赖
$ npm install

4. 编译项目,开启Dev模式,生成小程序 -- dist目录

# yarn
$ yarn dev:weapp
$ yarn build:weapp
# npm script
$ npm run dev:weapp
$ npm run build:weapp
# 仅限全局安装
$ taro build --type weapp --watch
$ taro build --type weapp
# npx 用户也可以使用
$ npx taro build --type weapp --watch
$ npx taro build --type weapp

5. 使用微信开发者工具,打开项目中的dist目录

二、小程序购物车功能的实现过程

效果图:

三、具体实现代码

src/pages/cart/cart.js

import { View, Icon, Navigator, Image, Text, } from '@tarojs/components'
import Taro from '@tarojs/taro'
import './cart.less'

class Cart extends Taro.Component {
 config = {
 navigationBarTitleText: '购物车'
 }

 state = {
 carts: [
  {
  id: 1,
  title: '好喝⾼颜值MEOW莫斯卡托⽓泡葡萄酒甜型⾹槟少⼥粉猫起泡酒(v1)',
  image:
   'https://tva1.sinaimg.cn/large/00831rSTgy1gczok56tkzj30m80m8qe4.jpg',
  num: 3,
  price: '88.00',
  selected: true
  },
  {
  id: 2,
  title: '好喝⾼颜值MEOW莫斯卡托⽓泡葡萄酒甜型⾹槟少⼥粉猫起泡酒(v2)',
  image:
   'https://tva1.sinaimg.cn/large/00831rSTgy1gczok56tkzj30m80m8qe4.jpg',
  num: 1,
  price: '188.00',
  selected: true
  },
  {
  id: 3,
  title: '好喝⾼颜值MEOW莫斯卡托⽓泡葡萄酒甜型⾹槟少⼥粉猫起泡酒(v3)',
  image:
   'https://tva1.sinaimg.cn/large/00831rSTgy1gczok56tkzj30m80m8qe4.jpg',
  num: 2,
  price: '288.00',
  selected: false
  },
  {
  id: 4,
  title: '好喝⾼颜值MEOW莫斯卡托⽓泡葡萄酒甜型⾹槟少⼥粉猫起泡酒(v4)',
  image:
   'https://tva1.sinaimg.cn/large/00831rSTgy1gczok56tkzj30m80m8qe4.jpg',
  num: 2,
  price: '388.00',
  selected: false
  }
 ], // 购物车列表
 hascheckList: [],
 totalPrice: 0, // 总价,初始为0
 selectAllStatus: true // 全选状态,默认全选
 }

 componentDidShow() {
 const cart = [

 ]
 this.setState({
  carts: cart
 })
 this.getTotalPrice();
 }

 /**
 * 计算总价
 */
 getTotalPrice() {
 let carts = this.state.carts // 获取购物车列表
 let total = 0
 for (let i = 0; i < carts.length; i++) {
  // 循环列表得到每个数据
  if (carts[i].selected) {
  // 判断选中才会计算价格
  total += carts[i].num * carts[i].price // 所有价格加起来
  }
 }
 this.setState({
  // 最后赋值到data中渲染到页面
  carts: carts,
  totalPrice: total.toFixed(2)
 })
 }

 /**
 * 绑定加数量事件
 */
 addCount(e) {
 const index = e.currentTarget.dataset.index
 let carts = this.state.carts
 let num = carts[index].num
 num = num + 1
 carts[index].num = num
 this.setState({
  carts: carts
 })
 this.getTotalPrice()
 }

 /**
 * 绑定减数量事件
 */
 minusCount(e) {
 const index = e.currentTarget.dataset.index
 let carts = this.state.carts
 let num = carts[index].num
 if (num <= 1) {
  return false
 }
 num = num - 1
 carts[index].num = num
 this.setState({
  carts: carts
 })
 this.getTotalPrice()
 }

 /**
 * 删除购物车当前商品
 */
 deleteList(e) {
 const index = e.currentTarget.dataset.index
 let carts = this.state.carts
 carts.splice(index, 1)
 this.setState({
  carts: carts
 })
 if (!carts.length) {
  this.setState({
  hasList: false
  })
 } else {
  this.getTotalPrice()
 }
 }

 /**
 * 当前商品选中事件
 */
 selectList(id,e) {
 const index = e.currentTarget.dataset.index
 let carts = this.state.carts
 // const selected = carts[index].selected
 // carts[index].selected = !selected

 carts.forEach(item => {
  if (id == item.id) {
  item.selected = !item.selected
  }
 })
 // const checkall = this.data.selectAllStatus === true ? false : false
 this.setState({
  carts: carts,
  // selectAllStatus: false
 })

 const selectAllStatus = carts.every(item => item.selected)
 this.setState({
  selectAllStatus: selectAllStatus
 })
 this.getTotalPrice()
 }

 /**
 * 购物车全选事件
 */
 selectAll(e) {
 let selectAllStatus = this.state.selectAllStatus
 selectAllStatus = !selectAllStatus
 let carts = this.state.carts

 for (let i = 0; i < carts.length; i++) {
  carts[i].selected = selectAllStatus
 }
 this.setState({
  selectAllStatus: selectAllStatus,
  carts: carts
 })
 this.getTotalPrice()
 }

 // 结算
 closeFun() {
 let list = []
 let listTotal = []
 this.state.carts.map((v, k) => {
  console.log('购物车数据', v)
  if (v.select) {
  list.push(v)
  } else {
  listTotal.push(v)
  }
 })
 }

 render() {
 const { carts, selectAllStatus, totalPrice, hasList } = this.state;
 let count = 0;
 carts.map(it => {
  if(it.selected === true) {
  count++;
  }
 })
 return (
  <View className="main">
  {carts.length > 0 ? (
   <View>
   <View className="cart-box">
    {carts.map((item, index) => {
    return (
     <View className="cart-list" key={index}>
     {item.selected ? (
      <Icon
      type="success"
      color="#b30000"
      data-index={index}
      className="cart-pro-select"
      onClick={this.selectList.bind(this,item.id)}
      ></Icon>
     ) : (
      <Icon
      type="circle"
      className="cart-pro-select"
      data-index={index}
      onClick={this.selectList.bind(this,item.id)}
      ></Icon>
     )}
     <Navigator url={'../details/details?id=' + item.id}>
      <Image className="cart-thumb" src={item.image}></Image>
     </Navigator>
     <Text className="cart-pro-name">{item.title}</Text>
     <Text className="cart-pro-price">{'¥' + item.price}</Text>
     <View className="cart-count-box">
      <Text
      className="cart-count-down"
      onClick={this.minusCount}
      data-index={index}
      >
      -
      </Text>
      <Text className="cart-count-num">{item.num}</Text>
      <Text
      className="cart-count-add"
      onClick={this.addCount}
      data-index={index}
      >
      +
      </Text>
     </View>
     <Text
      className="cart-del"
      onClick={this.deleteList}
      data-index={index}
     >
      删除
     </Text>
     </View>
    )
    })}
   </View>
   <View className="cart-footer">
    {selectAllStatus ? (
    <Icon
     type="success_circle"
     color="#b30000"
     className="total-select"
     onClick={this.selectAll}
    ></Icon>
    ) : (
    <Icon
     type="circle"
     color="#b30000"
     className="total-select"
     onClick={this.selectAll}
    ></Icon>
    )}
    <Navigator url="../orders/orders">
    <View className="order-icon"></View>
    </Navigator>
    <Text >{count> 0? `已选(${count})`: '全选'}</Text>
    <Text className="cart-toatl-price">{'合计¥' + totalPrice}</Text>
    <Text className="pay" onClick={this.closeFun} data-index={index}>
    立即下单
    </Text>
   </View>
   </View>
  ) : (
   <View>
   <View className="cart-no-data">购物车是空的哦~</View>
   </View>
  )}
  </View>
 )
 }
} 

export default Cart

src/pages/cart/cart.less

/* pages/cart/cart.wxss */

.cart-box{
 padding-bottom: 100px;
 margin-bottom: 10px
}
.cart-list{
 position: relative;
 padding: 20px 20px 20px 285px;
 height: 185px;
 border-bottom: 1px solid #e9e9e9;
}
.cart-list .cart-pro-select{
 position: absolute;
 left: 20px;
 top: 90px;
 width: 45px;
 height: 45px;
}

.cart-list .cart-thumb{
 position: absolute;
 top: 20px;
 left: 85px;
 width: 185px;
 height: 185px;
 border-radius:5px;
 box-shadow:5px 2px 6px #000
}
.cart-list .cart-pro-name{
 display: inline-block;
 // width: 500px;
 height: 105px;
 line-height: 50px;
 overflow: hidden;
 font-family: Microsoft Yahei, Cochin, Georgia, Times, 'Times New Roman', serif;
 font-size:28px;
 margin-right: 15px
}

.cart-list .cart-pro-price{
 display: inline-block;
 font-size:30px;
 color: #b30000;
 height: 105px;
 line-height: 50px;
}
.cart-list .cart-count-box{
 position: absolute;
 left: 420px;
 bottom: 20px;
 width: 250px;
 height: 80px;
}
.cart-list .cart-count-box text{
 display: inline-block;
 line-height: 80px;
 text-align: center;
}
.cart-count-down,.cart-count-add{
 font-size: 32px;
 width: 60px;
 height: 80px;
 font-family: Microsoft Yahei, Cochin, Georgia, Times, 'Times New Roman', serif;
 border: silver solid 1px;
 border-radius: 10px;
}
.cart-count-num{
 width: 80px;
 font-size: 32px;
 height: 80px;
 border-radius: 10px;
 border: silver solid 1px;
 margin-left: 1px;
 margin-right: 1px;
}
.cart-del{
 position: absolute;
 right: 15px;
 bottom: 20px;
 width: 80px;
 height: 80px;
 line-height: 80px;
 text-align: center;
 font-family: Arial,Helvetica,sans-serif;
 font-size:30px;
 color: #b30000;
 text-shadow: black;
}
.cart-footer{
 position: fixed;
 bottom: 0;
 left: 0;
 width: 100%;
 height: 90px;
 line-height: 90px;
 padding:0 100px 0 80px;
 box-sizing: border-box;
 background: #bfbfbf;
 color: #4d4d4d;
 font-family: Microsoft Yahei, Cochin, Georgia, Times, 'Times New Roman', serif;
 font-size: 30px;
}
.total-select{
 position: absolute;
 left: 20px;
 top: 25px;
 width: 45px;
 height: 45px;
}
.order-icon{
 position: absolute;
 right: 40px;
 top: 25px;
 width: 45px;
 height: 45px;
 background-size: 100%;
}
.cart-toatl-price{
 /* float: right; */
 margin-left:80px;
 text-align: center;
 width: 100px;
 font-family: Microsoft Yahei, Cochin, Georgia, Times, 'Times New Roman', serif;
 color: #b30000;
 font-size: 30px;
}
.pay {
 position: absolute;
 right: 0;
 background-color: #b30000;
 height: 100%;
 width: 200px;
 text-align: center;
 font-family: Microsoft Yahei, Cochin, Georgia, Times, 'Times New Roman', serif;
 font-size: 26px;
 color: #f2f2f2;
 text-align: center
}

.cart-no-data{
 padding:40px 0;
 color: #999;
 text-align: center;
}

注意:检查本地电脑taro的版本,电脑需要和项目的taro版本号相同,否则发送编译错误,该项目的taro CLI版本为v2.1.1

官方提供的两个解决方案:
1、    对电脑的taro进行升级
      # taro
$ taro update self [version]
# npm
npm i -g @tarojs/cli@[version]
# yarn
yarn global add @tarojs/cli@[version]
2、    对项目的taro进行升级
 $ taro update project [version]
version 为选填,如:1.x.x/latest 等,将会直接更新到指定版本

总结 

到此这篇关于使用Taro实现的小程序商城的购物车功能模块的文章就介绍到这了,更多相关Taro实现小程序商城的购物车内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 将DataRow转成指定类型的类,并返回这个类的对象(带值)

    /// <summary>         /// 将DataRow转换成指定类型         /// </summary>         /// <param name="pDataRow"></param>         /// <param name="pType">实体类</param>         /// <returns></returns>   

  • 微信小程序 购物车简单实例

    微信小程序,这里实现购物车功能的小demo,有需要此功能的朋友可以参考下. 摘要: 加减商品数量,汇总价格,全选与全不选 设计思路: 一.从网络上传入以下Json数据格式的数组 1.购物车id:cid 2.标题title 3.数量num 4.图片地址 5.价格price 6.小计 7.是否选中selected 二.点击复选框toggle操作 如已经选中的,经点击变成未选中,反之而反之 点击依据index作为标识,而不用cid,方便遍历 三.全选操作 首次点击即为全部选中,再次点击为全不选,全选按

  • Taro集成Redux快速上手的方法示例

    前言的前言 最近被一款来自京东凹凸实验室的多终端开发框架Taro吸粉了,官方对 Taro 的简介是使用React语法,一键生成多终端应用(包括小程序 / H5 / 快应用 / RN 等),而目前 Github 的 Star 也达到了非常可观的数量:4k+.对此,笔者也尝了把鲜,体验了下如何使用Taro写微信小程序.感觉还是十分灵活易用(一气呵成,都没遇到bug!),并且 Taro 还集成了 Redux,解决了小程序没有数据流框架的痛点. 这里贴一个 Taro 的官方文档,有兴趣的同行们可以了解下

  • 微信小程序之购物车功能

    前言 以往的购物车,基本都是通过大量的 DOM 操作来实现.微信小程序其实跟 vue.js 的用法非常像,接下来就看看小程序可以怎样实现购物车功能. 需求 先来弄清楚购物车的需求. 单选.全选和取消,而且会随着选中的商品计算出总价 单个商品购买数量的增加和减少 删除商品.当购物车为空时,页面会变为空购物车的布局 根据设计图,我们可以先实现静态页面.接下来,再看看一个购物车需要什么样的数据. 首先是一个商品列表(carts),列表里的单品需要:商品图(image),商品名(title),单价(pr

  • 微信小程序实现购物车代码实例详解

    其实购物车都是类似的实现方法,只不过小程序是有他的数据层和业务层,在这里把之前的做法记录一下,分享出来也希望能给需要的小伙伴带来参考价值在最开始的时候先从本地存储中获取购物车数据,因为我们会切换页面 在页面切换的过程中需要实时重新加载购物车的数据,所以我们把获取的方法写在onShow中,而不是onLoad中: onShow: function () { const cart = wx.getStorageSync("cart"); let address = wx.getStorage

  • 微信小程序实战篇之购物车的实现代码示例

    哈喽,大家好,快半个月没写了,现在提笔都有点生硬了,一直没更新的原因,一个是代码君也要上班,加上最近工作比较忙,还有就是写文章一直未被认可,所以没什么动力再创作了,那时真的坚持不下去,打算放弃了,感谢读者曹明,一个韩国的研究生读者,支持我,并给我鼓励,期待我更新下一篇,我非常感动,瞬间战斗力恢复,其实你们简单的点赞,评论,都是给我最大的支持,好了,煽情完毕,该讲今天的重点了,购物车,购物车的界面实现到不是很难,难点是处理里面的逻辑,无论是小程序,还是APP,购物车的逻辑都是最难的,下面开始教大家

  • 获取DataRow[]的值示例

    首先,DataRow[] dr = dt.Select("t1='a'"); 得出的结果是一个数组,你只要循环这个数组就好了. 复制代码 代码如下: string x=""; if (dr.Length > 0) { foreach (DataRow drN in dr) { x+=drN["t2"]; //循环获得过滤条件后 t2列的值 } } 注意要是明确第几行的值也可以这样获得:如想获得过滤后 第一条值,可以通过下面一句获得 stri

  • DataSet、DataTable、DataRow区别详解

    DataSet 表示数据在内存中的缓存. 属性 Tables  获取包含在 DataSet 中的表的集合. ds.Tables["sjxx"] DataTable 表示内存中数据的一个表. 公共属性 Columns 获取属于该表的列的集合. DataSet 获取此表所属的 DataSet. DefaultView 获取可能包括筛选视图或游标位置的表的自定义视图. PrimaryKey 获取或设置充当数据表主键的列的数组. Rows 获取属于该表的行的集合. TableName 获取或设

  • 使用Taro实现小程序商城的购物车功能模块的实例代码

    Taro 是一套遵循 React 语法规范的 多端开发 解决方案. 现如今市面上端的形态多种多样,Web.React-Native.微信小程序等各种端大行其道,当业务要求同时在不同的端都要求有所表现的时候,针对不同的端去编写多套代码的成本显然非常高,这时候只编写一套代码就能够适配到多端的能力就显得极为需要. 使用 Taro,我们可以只书写一套代码,再通过 Taro 的编译工具,将源代码分别编译出可以在不同端(微信/百度/支付宝/字节跳动/QQ/京东小程序.快应用.H5.React-Native

  • C#微信小程序服务端获取用户解密信息实例代码

     C#微信小程序服务端获取用户解密信息实例代码 实现代码: using AIOWeb.Models; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using System.Linq; using System.Web; namespace AIOWe

  • 微信小程序中button去除默认的边框实例代码

    微信小程序中button去除默认的边框的实现方法如下所示: button { position:relative; display:block; margin-left:auto; margin-right:auto; padding-left:14px; padding-right:14px; box-sizing:border-box; font-size:18px; text-align:center; text-decoration:none; line-height:2.5555555

  • 微信小程序实现音频文件播放进度的实例代码

    问题描述 在微信小程序中经常会用到控制文件播放的滑块,通过滑块可控制音频播放进度,下面即用代码实现. 解决方案 首先用.wxml与 .wmss 代码实现进度条的效果,再通过 .js 文件控制进度条的进度和进度条的时间显示. .wxml中(播放进度结构的代码): <view class="content-play-progress"> <text>{{play.currentTime}}</text> <view> <slider a

  • 微信小程序实现抖音播放效果的实例代码

    最近项目要做一个类似于抖音的一个视频播放 需要小程序完成 在再次确定了需要这个需求的情况下就开始了(其实因为不是说这个功能不好做主要是但心做出来肯定不流畅 卡顿什么的 优化不好优化) 然后就开始啦 思路使用微信的 swiper 完成竖向滑动 然后分页加载首先先加载一次加载10个当滑动到第7个的时候加载下一页 (要处理自动播放的问题和加载多个有多个同时播放的问题) 效果图 代码 <swiper class="swiper" vertical='true' easing-functi

  • 微信小程序自定义扫码功能界面的实现代码

    小程序的一个扫码页面,扫码界面一直开着,同时可以处理其他功能,如下: 由于直接调用微信的scanCode,无法自定义界面,所以只能使用原生组件camera,完成这个功能,关于扫描框的四个角的图片,就自己画一下吧,中间的移动横线,使用了小程序的动画功能,在原生camera组件上,覆盖需要用到cover-view和cover-image,同时加入了提示音 /**scan.wxss**/ .scan-view {   width: 100%;   height: 100%;   display: fl

  • 微信小程序 使用picker封装省市区三级联动实例代码

    微信小程序 使用picker封装省市区三级联动实例 目前学习小程序更多的是看看能否二次封装其它组件,利于以后能快速开发各种小程序应用.目前发现picker的selector模式只有一级下拉,那么我们是否可以通过3个picker来实现三级联动模板的形式来引入其它页面中呢?答案是肯定可以的.那么我的思路是这样的: 1.使用template模板语法进行封装,数据从页面传入 2.根据picker组件的语法,range只能是一组中文地区数组,但是我们需要每个地区的唯一码来触发下一级联动数据.这样,我的做法

  • 微信小程序 商城开发(ecshop )简单实例

    最近小程序特别火,所以我们公司也针对ecshop平台对接了小程序 包括完整的用户系统和购物体统 用户系统:收货地址,订单管理,消息管理,优惠券管理等等 购物系统支付购物车管理,微信支付等等 相信有很多小伙伴都用的是ecshop作为自己的商城,最近小程序又火了,于是就有人问ecshop对接小程序怎么做. 正好最近在开发一个对接ecshop的小程序项目,就将我的一些开发经验分享一下. 一:扫描小程序二维码后的用户信息的获取和缓存 获取用户信息需要用到两个api wx.login(OBJECT) 调用

  • 微信小程序实现简单购物车功能

    这个微信小程序的购物车功能,通过参照各大电商平台的功能和界面,然后总结出来的. 效果图 功能描述 1.可单选,全选/取消全选 2.增加.减少.手动编辑商品的数量 3.根据商品的数量统计价格 代码实现 此处省略一万字,废话不多说,直接上代码吧! WXML静态布局.绑定"死"数据(主要功能代码) <view class="list"> <block wx:for="{{dataArr}}" wx:key="index&qu

  • 微信小程序 http请求封装详解及实例代码

    微信小程序  http请求封装 示例代码 wx.request({ url: 'test.php', //仅为示例,并非真实的接口地址 data: { x: '' , y: '' }, method:'POST', header: { 'content-type': 'application/json' }, success: function(res) { console.log(res.data) }, fail: function( res ) { fail( res ); } }) 以上

随机推荐