這篇文章給大家介紹怎么在微信小程序中實現(xiàn)商品屬性聯(lián)動選擇,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
創(chuàng)新互聯(lián)專注于靜樂企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站設(shè)計,商城建設(shè)。靜樂網(wǎng)站建設(shè)公司,為靜樂等地區(qū)提供建站服務(wù)。全流程定制制作,專業(yè)設(shè)計,全程項目跟蹤,創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)
1、commodity.xml
{{attrValueObj.attrKey}} {{value}}
上述代碼把頁面盒子分為兩部分commodity_attr_list和weui-btn-area。
commodity_attr_list:循環(huán)獲取商品的屬性名和相對應(yīng)的屬性值,并布局頁面。
weui-btn-area:提交校驗并獲取選中商品屬性結(jié)果。
2、commodity.js
數(shù)據(jù)結(jié)構(gòu)
//數(shù)據(jù)結(jié)構(gòu):以一組一組的數(shù)據(jù)來進行設(shè)定 commodityAttr: [ { priceId: 1, price: 35.0, "stock": 8, "attrValueList": [ { "attrKey": "規(guī)格:", "attrValue": "+免費配料", "attrCode": "1001" }, { "attrKey": "甜度:", "attrValue": "七分甜", "attrCode": "2001" }, { "attrKey": "加料:", "attrValue": "珍珠", "attrCode": "3001" }, { "attrKey": "冰塊:", "attrValue": "少冰", "attrCode": "4001" } ] }, { priceId: 2, price: 35.1, "stock": 9, "attrValueList": [ { "attrKey": "規(guī)格:", "attrValue": "+燕麥", "attrCode": "1002" }, { "attrKey": "甜度:", "attrValue": "五分甜", "attrCode": "2002" }, { "attrKey": "加料:", "attrValue": "椰果", "attrCode": "3002" }, { "attrKey": "冰塊:", "attrValue": "去冰", "attrCode": "4002" } ] }, { priceId: 3, price: 35.2, "stock": 10, "attrValueList": [ { "attrKey": "規(guī)格:", "attrValue": "+布丁", "attrCode": "1003" }, { "attrKey": "甜度:", "attrValue": "無糖", "attrCode": "2003" }, { "attrKey": "加料:", "attrValue": "仙草", "attrCode": "3003" }, { "attrKey": "冰塊:", "attrValue": "常溫", "attrCode": "4003" } ] }, { priceId: 4, price: 35.2, "stock": 10, "attrValueList": [ { "attrKey": "規(guī)格:", "attrValue": "再加一份奶霜", "attrCode": "1004" }, { "attrKey": "甜度:", "attrValue": "無糖", "attrCode": "2003" }, { "attrKey": "加料:", "attrValue": "仙草", "attrCode": "3004" }, { "attrKey": "冰塊:", "attrValue": "熱飲", "attrCode": "4004" } ] }, { priceId: 5, price: 35.2, "stock": 10, "attrValueList": [ { "attrKey": "規(guī)格:", "attrValue": "+免費配料", "attrCode": "1004" }, { "attrKey": "甜度:", "attrValue": "五分甜", "attrCode": "2003" }, { "attrKey": "加料:", "attrValue": "椰果", "attrCode": "3004" }, { "attrKey": "冰塊:", "attrValue": "常溫", "attrCode": "4004" } ] } ], attrValueList: [] }
屬性選中和取消選擇效果處理
onShow: function () { this.setData({ includeGroup: this.data.commodityAttr }); this.distachAttrValue(this.data.commodityAttr); // 只有一個屬性組合的時候默認(rèn)選中 // 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 }); } }, /* 獲取數(shù)據(jù) */ distachAttrValue: function (commodityAttr) { /** 將后臺返回的數(shù)據(jù)組合成類似 { attrKey:'型號', attrValueList:['1','2','3'] } */ // 把數(shù)據(jù)對象的數(shù)據(jù)(視圖使用),寫到局部內(nèi) var attrValueList = this.data.attrValueList; // 遍歷獲取的數(shù)據(jù) 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,此時新增屬性并設(shè)置屬性值數(shù)組的第一個值;索引大于等于0,表示已存在的屬性名的位置 if (attrIndex >= 0) { // 如果屬性值數(shù)組中沒有該值,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) { // 判斷數(shù)組中的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) { /* 點選屬性值,聯(lián)動判斷其他屬性值是否可選 { 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('結(jié)果', 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); } } }
結(jié)果提交
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 { var valueStr = ""; for(var i = 0;i < value.length;i++){ console.log(value[i]); valueStr += value[i]+","; } wx.showModal({ title: '提示', content: valueStr, success: function (res) { if (res.confirm) { console.log('用戶點擊確定') } else if (res.cancel) { console.log('用戶點擊取消') } } }) console.log(valueStr); } }
3、commodity.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; display: flex; flex-direction: column; } /*屬性名*/ .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 30rpx; margin: 10rpx 10rpx; border: 1rpx solid #ececec; border-radius:5px; line-height:30px; } /*每個屬性選中的當(dāng)前樣式*/ .attr_value_active { border-radius: 10rpx; color: #0089dc; padding: 0 30rpx; border: 1rpx solid #0089dc; /* background: #fff; */ } /*禁用屬性*/ .attr_value_disabled { color: #ccc; } /*button*/ .weui-btn-area { margin: 1.17647059em 15px 0.3em; } .weui-btn{ width: 80%; height: 100rpx; border-radius: 3rpx; background-color:#0089dc; color: #fff; }
關(guān)于怎么在微信小程序中實現(xiàn)商品屬性聯(lián)動選擇就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。