微信小程序商城项目之商品属性分类(4)
网络编程 2021-07-04 18:32www.168986.cn编程入门
这篇文章主要为大家详细介绍了微信小程序商城项目之商品属性值联动选择,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
续上一篇的文章
所提及的购物数量的加减,现在说说商品属性值联动选择。
为了让同学们有个直观的了解,到电商网截了一个图片,就是红圈所示的部分
现在就为大家介绍这个小组件,在小程序中,该如何去写
下图为本项目的图
wxml
<view class="title">商品属性值联动选择</view> <!--options--> <view class="modity_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 #c; } /全部属性的主盒子/ .modity_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: #c; } /button/ .btn-area { margin: 1.17647059em 15px 0.3em; } .btn { margin-: 15px; background-color:#FFCC00; color: #fff; } .btn:first-child { margin-: 0; }
js
数据部分,一般情况都是访问接口获取数据的,这里并没有使用网络访问,为了简化demo,直接把一组数据放在data对象中。
Page({ data: { firstIndex: -1, //准备数据 //数据结构以一组一组来进行设定 modityAttr: [ { 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.modityAttr }); this.distachAttrValue(this.data.modityAttr); // 只有一个属性组合的时候默认选中 // console.log(this.data.attrValueList); if (this.data.modityAttr.length == 1) { for (var i = 0; i < this.data.modityAttr[0].attrValueList.length; i++) { this.data.attrValueList[i].selectedValue = this.data.modityAttr[0].attrValueList[i].attrValue; } this.setData({ attrValueList: this.data.attrValueList }); } }, / 获取数据 / distachAttrValue: function (modityAttr) { / 将后台返回的数据组合成类似 { attrKey:'型号', attrValueList:['1','2','3'] } / // 把数据对象的数据(视图使用),写到局部内 var attrValueList = this.data.attrValueList; // 遍历获取的数据 for (var i = 0; i < modityAttr.length; i++) { for (var j = 0; j < modityAttr[i].attrValueList.length; j++) { var attrIndex = this.getAttrIndex(modityAttr[i].attrValueList[j].attrKey, attrValueList); // console.log('属性索引', attrIndex); // 如果还没有属性索引为-1,此时新增属性并设置属性值数组的第一个值;索引大于等于0,表示已存在的属性名的位置 if (attrIndex >= 0) { // 如果属性值数组中没有该值,push新值;否则不处理 if (!this.isValueExist(modityAttr[i].attrValueList[j].attrValue, attrValueList[attrIndex].attrValues)) { attrValueList[attrIndex].attrValues.push(modityAttr[i].attrValueList[j].attrValue); } } else { attrValueList.push({ attrKey: modityAttr[i].attrValueList[j].attrKey, attrValues: [modityAttr[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 modityAttr = this.data.modityAttr; // 其他选中的属性值全都置空 // 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 modityAttr = this.data.includeGroup; } // console.log('选中', modityAttr, index, key, value); for (var i = 0; i < modityAttr.length; i++) { for (var j = 0; j < modityAttr[i].attrValueList.length; j++) { if (modityAttr[i].attrValueList[j].attrKey == key && modityAttr[i].attrValueList[j].attrValue == value) { includeGroup.push(modityAttr[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 modityAttr = this.data.modityAttr; 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: modityAttr, 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 }) } } })
运行效果
demo地址
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持狼蚁SEO。
编程语言
- 如何快速学会编程 如何快速学会ug编程
- 免费学编程的app 推荐12个免费学编程的好网站
- 电脑怎么编程:电脑怎么编程网咯游戏菜单图标
- 如何写代码新手教学 如何写代码新手教学手机
- 基础编程入门教程视频 基础编程入门教程视频华
- 编程演示:编程演示浦丰投针过程
- 乐高编程加盟 乐高积木编程加盟
- 跟我学plc编程 plc编程自学入门视频教程
- ug编程成航林总 ug编程实战视频
- 孩子学编程的好处和坏处
- 初学者学编程该从哪里开始 新手学编程从哪里入
- 慢走丝编程 慢走丝编程难学吗
- 国内十强少儿编程机构 中国少儿编程机构十强有
- 成人计算机速成培训班 成人计算机速成培训班办
- 孩子学编程网上课程哪家好 儿童学编程比较好的
- 代码编程教学入门软件 代码编程教程