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

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

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

一、使用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 (

{carts.length > 0 ? (

{carts.map((item, index) => {

return (

{item.selected ? (

type="success"

color="#b30000"

data-index={index}

className="cart-pro-select"

onClick={this.selectList.bind(this,item.id)}

>

) : (

type="circle"

className="cart-pro-select"

data-index={index}

onClick={this.selectList.bind(this,item.id)}

>

)}

{item.title}

{'¥' + item.price}

className="cart-count-down"

onClick={this.minusCount}

data-index={index}

>

-

{item.num}

className="cart-count-add"

onClick={this.addCount}

data-index={index}

>

+

className="cart-del"

onClick={this.deleteList}

data-index={index}

>

删除

)

})}

{selectAllStatus ? (

type="success_circle"

color="#b30000"

className="total-select"

onClick={this.selectAll}

>

) : (

type="circle"

color="#b30000"

className="total-select"

onClick={this.selectAll}

>

)}

{count> 0? `已选(${count})`: '全选'}

{'合计¥' + totalPrice}

立即下单

) : (

购物车是空的哦~

)}

)

}

}

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实现小程序商城的购物车内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

java代码实现购物车小程序_使用Taro实现小程序商城的购物车功能模块的实例代码...相关推荐

  1. 原生态(PHP和JAVA)研发的文锋网约车APP文锋代驾APP700个功能模块免费开源源码

    原生态(PHP和JAVA)研发的文锋网约车APP文锋代驾APP700个功能模块免费开源源码 原生态(PHP和JAVA)研发的文锋网约车APP文锋代驾APP700个功能模块免费开源源码 文锋科技历时两年 ...

  2. cmake release和debug代码运行效果不一样_这35个小细节,让你的Java 代码运行效率翻倍!...

    传智播客博学谷 加小谷vx:boxueguu 免费领IT各学科资料.课程 Get更多干货直播课 前言 代码 优化 ,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码 ...

  3. 多个 小程序_最简单的小程序制作方法,不会代码也能撸一个

    前言 / 小程序从17年上线到现在已经构造了新的开发环境和开发者生态,现在已经有超过150万的开发者加入到开发,小程序应用数量超过100万,覆盖200多个行业.虽然开发难度较app减少了很多,但是对于 ...

  4. 【Java基础】第6章_面向对象(下)-1:static关键字、main方法、代码块、final关键字

    文章目录 1.关键字:static 1.1.static的使用 1.2.类变量 vs 实例变量内存解析 1.3.自定义 ArrayUtil工具类的优化 1.4.static 的应用举例 1.5.练习 ...

  5. 一个公众号可以绑定几个小程序_如何实现微信小程序和公众号的绑定

    再此之前,为什么要有小程序和公众号绑定这一个操作. 第一:小程序绑定公众号之后,公众号可以推文. 如下所示,公众号推文,文章内容由后台发布,因为公众号分为服务号和订阅号,订阅号每天可以发送一次,一次最 ...

  6. 万能门店小程序_超市门店微信小程序注册流程

    现在超市门店商家利用小程序卖货已经非常普遍,小程序可以便捷地连接线上线下通道,让商家不再局限于门店周围的流量,能够从微信获取更多客户,从而提升销量和店铺知名度.超市要想有自己的线上电商小程序,就得先注 ...

  7. 不同主体公众号跳转小程序_公众号和小程序的区别

    其实公众号和小程序都是微信的衍生功能,同时微信的产品.但是它们的功能不同.公众号更倾向于引流,主要是通过持续的输出有价值的文案视频图片来吸引大量的粉丝(顾客),并且培育粉丝最终获得收益.(在这里特别提 ...

  8. 专属海报小程序_剑3泡泡 | 小程序给你一份专属的账号海报!

    01按照惯例,这里是简介 paopaods.com 本期推送的是: 如何正确的使用小程序 每个账号均可小程序[剑3泡泡]搜到,生成专属账号海报! 点击底部[点我卖号]即可拥有! 02教程开始之前,安利 ...

  9. 友盟分享小程序_来啦!小程序支持分享朋友圈!

    朋友圈是微信最大的流量池,小程序支持分享到朋友圈是开发者们期待已久的功能.上线4年的小程序,为什么现在才能分享朋友圈?后续还需要注意哪些问题?小程序未来还会继续开放相关功能吗?文章从小程序的当前发展现 ...

最新文章

  1. mysql导入导出sql文件
  2. 5G NR — 动态频谱共享
  3. 【Network Security!】Banner信息收集
  4. Dockerfile: no such file or directory
  5. [2020-11-23 contest]图(dfs剪枝),劫富济贫(字典树),小A的树(树形DP),游戏(贪心/斜率优化)
  6. live555抓包实例
  7. weka分类器怎么设置类别_AI 迁移学习怎么玩?手把手教你实战迁移学习
  8. ROS工作空间和程序包创建
  9. 致Android开发者:APP 瘦身经验总结
  10. Jmeter --- Http Cookie Manager
  11. Zabbix2.4.X_监控SNMP
  12. javascript 判断数据类型的几种方法
  13. 软件测试常用方法实例与分析
  14. 大厂面试中HR可能会问到的问题
  15. 云服务器测速脚本_Superspeed.sh:包含很多个测速节点的 VPS 一键测速脚本
  16. android-帧动画(原地不动人再走路)
  17. 3.ARMv7-M exception model(1)
  18. HTML5.笔记.案例
  19. 计算机视觉基础知识(第一章)
  20. 树莓派4B 2g运行内存,gpu值改为1g后无法启动

热门文章

  1. 单页面应用SPA的优缺点
  2. java代码删除文件夹_删除文件夹的java类
  3. linux命令行蜂鸣声太大,Linux关闭蜂鸣声
  4. C++11:forward及完美转发
  5. Qt pro工程文件中判断宏定义是否存在
  6. python(numpy,pandas10)——pandas 合并数据 concat,append
  7. Vue项目报错记录解决Property or method “item“ is not defined on the instance
  8. 轻量级3d模型查看器_耐能取得两项软件著作权,自研轻量级3D人脸识别算法领先业界...
  9. js 加入debug后可以进入controller_新手入门Nest.js(四) 控制器路由
  10. python tkinter_Python+tkinter开发一个电子宠物(2 按钮)