微信小程序商城项目之商品属性分类(4)


Posted in Javascript onApril 17, 2017

续上一篇的文章:微信小程序之购物数量加减 —— 微信小程序实战商城系列(3)
所提及的购物数量的加减,现在说说商品属性值联动选择。

为了让同学们有个直观的了解,到电商网截了一个图片,就是红圈所示的部分

微信小程序商城项目之商品属性分类(4)

现在就为大家介绍这个小组件,在小程序中,该如何去写
下图为本项目的图:

微信小程序商城项目之商品属性分类(4)

wxml:

<view class="title">商品属性值联动选择</view> 
<!--options--> 
<view class="commodity_attr_list"> 
 <!--每组属性--> 
 <view class="attr_box" wx:for="{{attrValueList}}" wx:for-item="attrValueObj" wx:for-index="attrIndex"> 
 <!--属性名--> 
 <view class="attr_name">{{attrValueObj.attrKey}}</view> 
 <!--属性值--> 
 <view class="attr_value_box"> 
 <!--每个属性值--> 
 <view class="attr_value {{attrIndex==firstIndex || attrValueObj.attrValueStatus[valueIndex]?(value==attrValueObj.selectedValue?'attr_value_active':''):'attr_value_disabled'}}" bindtap="selectAttrValue" data-status="{{attrValueObj.attrValueStatus[valueIndex]}}" 
 data-value="{{value}}" data-key="{{attrValueObj.attrKey}}" data-index="{{attrIndex}}" data-selectedvalue="{{attrValueObj.selectedValue}}" wx:for="{{attrValueObj.attrValues}}" wx:for-item="value" wx:for-index="valueIndex">{{value}}</view> 
 </view> 
 </view> 
</view> 
<!--button--> 
<view class="weui-btn-area"> 
 <button class="weui-btn" type="primary" bindtap="submit">确定</button> 
</view>

wxss:

.title { 
 padding: 10rpx 20rpx; 
 margin: 10rpx 0; 
 border-left: 4rpx solid #ccc; 
} 
 
/*全部属性的主盒子*/ 
.commodity_attr_list { 
 background: #fff; 
 padding: 0 20rpx; 
 font-size: 26rpx; 
 overflow: hidden; 
 width: 100%; 
} 
/*每组属性的主盒子*/ 
.attr_box { 
 width: 100%; 
 overflow: hidden; 
 border-bottom: 1rpx solid #ececec; 
} 
/*属性名*/ 
.attr_name { 
 width: 20%; 
 float: left; 
 padding: 15rpx 0; 
} 
/*属性值*/ 
.attr_value_box { 
 width: 80%; 
 float: left; 
 padding: 15rpx 0; 
 overflow: hidden; 
} 
/*每个属性值*/ 
.attr_value { 
 float: left; 
 padding: 0 10rpx; 
 margin: 0 10rpx; 
 border: 1rpx solid #ececec; 
} 
/*每个属性选中的当前样式*/ 
.attr_value_active { 
 background: #FFCC00; 
 border-radius: 10rpx; 
 color: #fff; 
 padding: 0 10rpx; 
} 
/*禁用属性*/ 
.attr_value_disabled { 
 color: #ccc; 
} 
 
/*button*/ 
.btn-area { 
 margin: 1.17647059em 15px 0.3em; 
} 
 
.btn { 
 margin-top: 15px; 
 background-color:#FFCC00; 
 color: #fff; 
} 
.btn:first-child { 
 margin-top: 0; 
}

js:

数据部分,一般情况都是访问接口获取数据的,这里并没有使用网络访问,为了简化demo,直接把一组数据放在data对象中。 

Page({ 
 data: { 
 firstIndex: -1, 
 //准备数据 
 //数据结构:以一组一组来进行设定 
 commodityAttr: [ 
 { 
 priceId: 1, 
 price: 35.0, 
 "stock": 8, 
 "attrValueList": [ 
 { 
 "attrKey": "型号", 
 "attrValue": "2" 
 }, 
 { 
 "attrKey": "颜色", 
 "attrValue": "白色" 
 }, 
 { 
 "attrKey": "大小", 
 "attrValue": "小" 
 }, 
 { 
 "attrKey": "尺寸", 
 "attrValue": "S" 
 } 
 ] 
 }, 
 { 
 priceId: 2, 
 price: 35.1, 
 "stock": 9, 
 "attrValueList": [ 
 { 
 "attrKey": "型号", 
 "attrValue": "1" 
 }, 
 { 
 "attrKey": "颜色", 
 "attrValue": "黑色" 
 }, 
 { 
 "attrKey": "大小", 
 "attrValue": "小" 
 }, 
 { 
 "attrKey": "尺寸", 
 "attrValue": "M" 
 } 
 ] 
 }, 
 { 
 priceId: 3, 
 price: 35.2, 
 "stock": 10, 
 "attrValueList": [ 
 { 
 "attrKey": "型号", 
 "attrValue": "1" 
 }, 
 { 
 "attrKey": "颜色", 
 "attrValue": "绿色" 
 }, 
 { 
 "attrKey": "大小", 
 "attrValue": "大" 
 }, 
 { 
 "attrKey": "尺寸", 
 "attrValue": "L" 
 } 
 ] 
 }, 
 { 
 priceId: 4, 
 price: 35.2, 
 "stock": 10, 
 "attrValueList": [ 
 { 
 "attrKey": "型号", 
 "attrValue": "1" 
 }, 
 { 
 "attrKey": "颜色", 
 "attrValue": "绿色" 
 }, 
 { 
 "attrKey": "大小", 
 "attrValue": "大" 
 }, 
 { 
 "attrKey": "尺寸", 
 "attrValue": "L" 
 } 
 ] 
 } 
 ], 
 attrValueList: [] 
 }, 
 onShow: function () { 
 this.setData({ 
 includeGroup: this.data.commodityAttr 
 }); 
 this.distachAttrValue(this.data.commodityAttr); 
 // 只有一个属性组合的时候默认选中 
 // console.log(this.data.attrValueList); 
 if (this.data.commodityAttr.length == 1) { 
 for (var i = 0; i < this.data.commodityAttr[0].attrValueList.length; i++) { 
 this.data.attrValueList[i].selectedValue = this.data.commodityAttr[0].attrValueList[i].attrValue; 
 } 
 this.setData({ 
 attrValueList: this.data.attrValueList 
 }); 
 } 
 }, 
 /* 获取数据 */ 
 distachAttrValue: function (commodityAttr) { 
 /** 
 将后台返回的数据组合成类似 
 { 
 attrKey:'型号', 
 attrValueList:['1','2','3'] 
 } 
 */ 
 // 把数据对象的数据(视图使用),写到局部内 
 var attrValueList = this.data.attrValueList; 
 // 遍历获取的数据 
 for (var i = 0; i < commodityAttr.length; i++) { 
 for (var j = 0; j < commodityAttr[i].attrValueList.length; j++) { 
 var attrIndex = this.getAttrIndex(commodityAttr[i].attrValueList[j].attrKey, attrValueList); 
 // console.log('属性索引', attrIndex); 
 // 如果还没有属性索引为-1,此时新增属性并设置属性值数组的第一个值;索引大于等于0,表示已存在的属性名的位置 
 if (attrIndex >= 0) { 
 // 如果属性值数组中没有该值,push新值;否则不处理 
 if (!this.isValueExist(commodityAttr[i].attrValueList[j].attrValue, attrValueList[attrIndex].attrValues)) { 
 attrValueList[attrIndex].attrValues.push(commodityAttr[i].attrValueList[j].attrValue); 
 } 
 } else { 
 attrValueList.push({ 
 attrKey: commodityAttr[i].attrValueList[j].attrKey, 
 attrValues: [commodityAttr[i].attrValueList[j].attrValue] 
 }); 
 } 
 } 
 } 
 // console.log('result', attrValueList) 
 for (var i = 0; i < attrValueList.length; i++) { 
 for (var j = 0; j < attrValueList[i].attrValues.length; j++) { 
 if (attrValueList[i].attrValueStatus) { 
 attrValueList[i].attrValueStatus[j] = true; 
 } else { 
 attrValueList[i].attrValueStatus = []; 
 attrValueList[i].attrValueStatus[j] = true; 
 } 
 } 
 } 
 this.setData({ 
 attrValueList: attrValueList 
 }); 
 }, 
 getAttrIndex: function (attrName, attrValueList) { 
 // 判断数组中的attrKey是否有该属性值 
 for (var i = 0; i < attrValueList.length; i++) { 
 if (attrName == attrValueList[i].attrKey) { 
 break; 
 } 
 } 
 return i < attrValueList.length ? i : -1; 
 }, 
 isValueExist: function (value, valueArr) { 
 // 判断是否已有属性值 
 for (var i = 0; i < valueArr.length; i++) { 
 if (valueArr[i] == value) { 
 break; 
 } 
 } 
 return i < valueArr.length; 
 }, 
 /* 选择属性值事件 */ 
 selectAttrValue: function (e) { 
 /* 
 点选属性值,联动判断其他属性值是否可选 
 { 
 attrKey:'型号', 
 attrValueList:['1','2','3'], 
 selectedValue:'1', 
 attrValueStatus:[true,true,true] 
 } 
 console.log(e.currentTarget.dataset); 
 */ 
 var attrValueList = this.data.attrValueList; 
 var index = e.currentTarget.dataset.index;//属性索引 
 var key = e.currentTarget.dataset.key; 
 var value = e.currentTarget.dataset.value; 
 if (e.currentTarget.dataset.status || index == this.data.firstIndex) { 
 if (e.currentTarget.dataset.selectedvalue == e.currentTarget.dataset.value) { 
 // 取消选中 
 this.disSelectValue(attrValueList, index, key, value); 
 } else { 
 // 选中 
 this.selectValue(attrValueList, index, key, value); 
 } 
 
 } 
 }, 
 /* 选中 */ 
 selectValue: function (attrValueList, index, key, value, unselectStatus) { 
 // console.log('firstIndex', this.data.firstIndex); 
 var includeGroup = []; 
 if (index == this.data.firstIndex && !unselectStatus) { // 如果是第一个选中的属性值,则该属性所有值可选 
 var commodityAttr = this.data.commodityAttr; 
 // 其他选中的属性值全都置空 
 // console.log('其他选中的属性值全都置空', index, this.data.firstIndex, !unselectStatus); 
 for (var i = 0; i < attrValueList.length; i++) { 
 for (var j = 0; j < attrValueList[i].attrValues.length; j++) { 
 attrValueList[i].selectedValue = ''; 
 } 
 } 
 } else { 
 var commodityAttr = this.data.includeGroup; 
 } 
 
 // console.log('选中', commodityAttr, index, key, value); 
 for (var i = 0; i < commodityAttr.length; i++) { 
 for (var j = 0; j < commodityAttr[i].attrValueList.length; j++) { 
 if (commodityAttr[i].attrValueList[j].attrKey == key && commodityAttr[i].attrValueList[j].attrValue == value) { 
 includeGroup.push(commodityAttr[i]); 
 } 
 } 
 } 
 attrValueList[index].selectedValue = value; 
 
 // 判断属性是否可选 
 for (var i = 0; i < attrValueList.length; i++) { 
 for (var j = 0; j < attrValueList[i].attrValues.length; j++) { 
 attrValueList[i].attrValueStatus[j] = false; 
 } 
 } 
 for (var k = 0; k < attrValueList.length; k++) { 
 for (var i = 0; i < includeGroup.length; i++) { 
 for (var j = 0; j < includeGroup[i].attrValueList.length; j++) { 
 if (attrValueList[k].attrKey == includeGroup[i].attrValueList[j].attrKey) { 
 for (var m = 0; m < attrValueList[k].attrValues.length; m++) { 
 if (attrValueList[k].attrValues[m] == includeGroup[i].attrValueList[j].attrValue) { 
 attrValueList[k].attrValueStatus[m] = true; 
 } 
 } 
 } 
 } 
 } 
 } 
 // console.log('结果', attrValueList); 
 this.setData({ 
 attrValueList: attrValueList, 
 includeGroup: includeGroup 
 }); 
 
 var count = 0; 
 for (var i = 0; i < attrValueList.length; i++) { 
 for (var j = 0; j < attrValueList[i].attrValues.length; j++) { 
 if (attrValueList[i].selectedValue) { 
 count++; 
 break; 
 } 
 } 
 } 
 if (count < 2) {// 第一次选中,同属性的值都可选 
 this.setData({ 
 firstIndex: index 
 }); 
 } else { 
 this.setData({ 
 firstIndex: -1 
 }); 
 } 
 }, 
 /* 取消选中 */ 
 disSelectValue: function (attrValueList, index, key, value) { 
 var commodityAttr = this.data.commodityAttr; 
 attrValueList[index].selectedValue = ''; 
 
 // 判断属性是否可选 
 for (var i = 0; i < attrValueList.length; i++) { 
 for (var j = 0; j < attrValueList[i].attrValues.length; j++) { 
 attrValueList[i].attrValueStatus[j] = true; 
 } 
 } 
 this.setData({ 
 includeGroup: commodityAttr, 
 attrValueList: attrValueList 
 }); 
 
 for (var i = 0; i < attrValueList.length; i++) { 
 if (attrValueList[i].selectedValue) { 
 this.selectValue(attrValueList, i, attrValueList[i].attrKey, attrValueList[i].selectedValue, true); 
 } 
 } 
 }, 
 /* 点击确定 */ 
 submit: function () { 
 var value = []; 
 for (var i = 0; i < this.data.attrValueList.length; i++) { 
 if (!this.data.attrValueList[i].selectedValue) { 
 break; 
 } 
 value.push(this.data.attrValueList[i].selectedValue); 
 } 
 if (i < this.data.attrValueList.length) { 
 wx.showToast({ 
 title: '请完善属性', 
 icon: 'loading', 
 duration: 1000 
 }) 
 } else { 
 wx.showToast({ 
 title: '选择的属性:' + value.join('-'), 
 icon: 'sucess', 
 duration: 1000 
 }) 
 } 
 } 
})

运行效果:

微信小程序商城项目之商品属性分类(4)

demo地址:微信小程序商城项目之商品属性值联动选择

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript 基础篇之运算符、语句(二)
Apr 07 Javascript
javascript setTimeout和setInterval计时的区别详解
Jun 21 Javascript
javascript break指定标签打破多层循环示例
Jan 20 Javascript
利用jQuery和CSS将背景图片拉伸
Oct 16 Javascript
JavaScript实现多种排序算法
Feb 24 Javascript
jQuery链式调用与show知识浅析
May 11 Javascript
老生常谈JavaScript中的this关键字
Oct 01 Javascript
JavaScript给每一个li节点绑定点击事件的实现方法
Dec 01 Javascript
jQuery实现表格元素动态创建功能
Jan 09 Javascript
jQuery实现扑克正反面翻牌效果
Mar 10 Javascript
js实现手机发送验证码功能
Mar 13 Javascript
原生JavaScript实现五子棋游戏
Nov 09 Javascript
微信小程序商城项目之侧栏分类效果(1)
Apr 17 #Javascript
Map.vue基于百度地图组件重构笔记分享
Apr 17 #Javascript
JS简单验证上传文件类型的方法
Apr 17 #Javascript
JavaScript实现的商品抢购倒计时功能示例
Apr 17 #Javascript
巧用weui.topTips验证数据的实例
Apr 17 #Javascript
JS与jQuery实现子窗口获取父窗口元素值的方法
Apr 17 #jQuery
bootstrap select插件封装成Vue2.0组件
Apr 17 #Javascript
You might like
php入门小知识
2008/03/24 PHP
php格式化时间戳
2016/12/17 PHP
PHP自动载入类文件函数__autoload的使用方法
2019/03/25 PHP
PHP快速导出百万级数据到CSV或者EXCEL文件
2020/11/27 PHP
MSN消息提示类
2006/09/05 Javascript
jquery弹出框的用法示例(一)
2013/08/26 Javascript
简单时间提示DEMO从0开始一直进行计时
2013/11/19 Javascript
页面加载完成后再执行JS的jquery写法以及区别说明
2014/02/22 Javascript
js统计页面的来访次数实现代码
2014/05/09 Javascript
jqGrid读取选择的多行的某个属性代码
2014/05/18 Javascript
JavaScript中连接操作Oracle数据库实例
2015/04/02 Javascript
15个常用的jquery代码片段
2015/12/19 Javascript
扩展jquery easyui tree的搜索树节点方法(推荐)
2016/10/28 Javascript
jquery拼接ajax 的json和字符串拼接的方法
2017/03/11 Javascript
JavaScript闭包_动力节点Java学院整理
2017/06/27 Javascript
jQuery完成表单验证的实例代码(纯代码)
2017/09/30 jQuery
薪资那么高的Web前端必看书单
2017/10/13 Javascript
Angular5.0 子组件通过service传递值给父组件的方法
2018/07/13 Javascript
微信上传视频文件提示(推荐)
2018/11/22 Javascript
javascript数组元素删除方法delete和splice解析
2019/12/09 Javascript
小程序跳转H5页面的方法步骤
2020/03/06 Javascript
解决Vue-cli无法编译es6的问题
2020/10/30 Javascript
Python使用selenium实现网页用户名 密码 验证码自动登录功能
2018/05/16 Python
Python 将Matrix、Dict保存到文件的方法
2018/10/30 Python
Python实现字符串匹配的KMP算法
2019/04/04 Python
python 使用elasticsearch 实现翻页的三种方式
2020/07/31 Python
CSS3基础(RGBa、text-shadow、box-shadow、border-radius)
2012/11/13 HTML / CSS
PHP两种查询函数array/row的区别
2013/06/03 面试题
供货协议书
2014/04/22 职场文书
新教师培训心得体会
2014/09/02 职场文书
大学生学习新党章思想汇报
2014/10/25 职场文书
2015年个人剖析材料范文
2014/12/29 职场文书
公司股份转让协议书范本
2015/01/28 职场文书
安全教育的主题班会
2015/08/13 职场文书
React实现动效弹窗组件
2021/06/21 Javascript
Pytest中skip skipif跳过用例详解
2021/06/30 Python