商品屬性的選擇功能的實現

汪小蓉發表於2018-04-24

1.實現效果:

點選將屬性轉為紅色,無庫存的商品置灰,可點選的背景為白色;且點中的屬性點選之後會恢復白色;

商品屬性的選擇功能的實現

  1. 重要思路:

    假如: 顏色:黑色,大紅色,米白色,軍綠色

    尺寸:XL,L,M

    純度: 90% 60% 70%

第一種情況:如果是直接所有的屬性都點選選完了,那麼我們可以直接組合成 黑色-M-70% 的欄位直接去匹配具體的商品。

第二種情況:在屬性不完全的時候,該怎麼判斷屬性是否可被選中???

(1)宣告一個匹配陣列PK用來儲存選中的屬性[],例如pk=[顏色:黑色,尺寸:無,純度:無],---顏色為屬性,黑色為屬性值。
現在開始遍歷所有的屬性,來顯示其對應的狀態:
-----只選中一個屬性--黑色-----------
黑色(屬性:顏色):取出含黑色的商品組,商品組有值---->和pk中屬性不同的值匹配(沒有匹配的,黑色可選);

xl(屬性:尺寸):取出含有xl的商品組k1---->和pk中屬性不同的值匹配(匹配黑色,檢測k1中含黑色的商品組成新的商品組k2,如果k2無值不可選,k2有值可選);

---選中了兩個屬性----黑色 M----

大紅色:取出含有大紅色商品組k1---->和pk中屬性不同的值匹配(匹配M--在k1中找出含有M的商品組成新陣列k2,如果k2有值,可選,k2無值不可選);

90%:取出含有90%的商品組k1---->和pk中屬性不同的值匹配(匹配黑色在k1中找出含有黑色的商品形成新陣列k2,如果k2無值不可選,k2有值,繼續在k2中找出含有M的商品形成新陣列k3,如果k3中有值可選,沒值不可選);
複製程式碼

3.簡要程式碼 主要技術框架:Vue

(1)應用於顯示在頁面上的陣列:

value:將存放頁面中對應選擇的值;show=0:初始狀態,可選;show=1:選中狀態;show=2:不可選狀態;

`    this.allattr=[
    {
        "name": "顏色",
        "value": null,
        "son": [
            {
                "paramvalue": "黑色",
                "show": 0
            },
            {
                "paramvalue": "大紅色",
                "show": 0
            },
            {
                "paramvalue": "米白色",
                "show": 0
            },
            {
                "paramvalue": "軍綠色",
                "show": 0
            }
        ]
    },
    {
        "name": "尺寸",
        "value": null,
        "son": [
            {
                "paramvalue": "XL",
                "show": 0
            },
            {
                "paramvalue": "L",
                "show": 0
            },
            {
                "paramvalue": "M",
                "show": 0
            }
        ]
    },
    {
        "name": "毛料純度",
        "value": null,
        "son": [
            {
                "paramvalue": "90%純度",
                "show": 0
            },
            {
                "paramvalue": "60%純度",
                "show": 0
            },
            {
                "paramvalue": "70%純度",
                "show": 0
            }
        ]
    }
]`
複製程式碼

商品集合:

this.shopattr= [
    {
        "pdid": 1625,
        "productAttrList": [
            {
                "attribute": "顏色",
                "value": "米白色",
            },
            {
                "attribute": "尺寸",
                "value": "L",
            },
            {
                "attribute": "毛料純度",
                "value": "90%純度",
            }
        ],
        "attrStr": "顏色: 米白色;尺寸: L;毛料純度: 90%純度;"
    },
    {
        "pdid": 1625,
        "productAttrList": [
            {
                "attribute": "顏色",
                "value": "黑色",
            },
            {
                "attribute": "尺寸",
                "value": "M",
            },
            {
                "attribute": "毛料純度",
                "value": "70%純度",
            }
        ],
        "attrStr": "顏色: 黑色;尺寸: M;毛料純度: 70%純度;"
    },
    {
        "pdid": 1625,
        "productAttrList": [
            {
                "attribute": "顏色",
                "value": "大紅色",
            },
            {
                "attribute": "尺寸",
                "value": "XL",
            },
            {
                "attribute": "毛料純度",
                "value": "70%純度",
            }
        ],
        "attrStr": "顏色: 大紅色;尺寸: XL;毛料純度: 70%純度;"
    }
],
複製程式碼

3.html程式碼:

   <li v-for="(items,index) in allattr" :key="index">
                <span>{{items.name}}</span>
                <div>
                  <ul class="attrUI">
                    <li v-for="(item,sonIndex) in items.son"  :key="sonIndex" @click="clickattr(item.paramvalue,index,sonIndex)"
                        v-bind:class='item.show === 1 ? "checkedLi": item.show === 2 ? "disableLi":"normalLi"'>{{item.paramvalue}}</li>
                  </ul>
                </div>
 </li>
複製程式碼

4.點選事件程式碼:

//      點選某一個屬性
      clickattr: function (attrvalue,index,i) {
        //0 初始狀態   1選中狀態  2 不可點選狀態
        let item = "";
        item = this.allattr;
//     //樣式的改變+加放入值
        if ((item[index].son)[i].show !== 2) {
          if ((item[index].son)[i].show === 1) {
            item[index].value = null;
            (item[index].son)[i].show = 0;
          } else {
            item[index].value = attrvalue;
            for (let gg = 0; gg < item[index].son.length; gg++) {
              if ((item[index].son)[gg].paramvalue === attrvalue) {
                (item[index].son)[gg].show = 1;
              } else {
                (item[index].son)[gg].show = 0;
              }
            }
          }
//一一遍歷。取出每一個屬性,獲取含有具體屬性的陣列
          for (let a = 0; a < item.length; a++) {
            let matchattr = "";
            for (let b = 0; b < item[a].son.length; b++) {
              if ((item[a].son)[b].show != 1) {
                //取出了值,然後進行遍歷
                let matchGroup = [];//完成的商品列表陣列
                let sonGroup = [];//含有具體屬性的陣列
                matchGroup = this.shopattr;
                matchattr = item[a].name + ":" + (item[a].son)[b].paramvalue + ";";
                //得到含有該屬性的商品集合
                for (let k = 0; k < matchGroup.length; k++) {
                  if (matchGroup[k].attrStr.indexOf(matchattr) != -1) {
                    sonGroup.push(matchGroup[k])
                  }
                }
                //遍歷是否該商品集合中,含有點選事件的集合,有則該屬性可選;
                let judgeShow = "", start = 0;//judgeShow  通過該值來控制屬性的狀態;  start;是否等於item的長度來判斷是都遍歷完成
                judgeShow = sonGroup;
                for (let c = 0; c < item.length; c++) {
                  let sonmatch = "";
                  if (item[c].value == null) {
                    sonmatch = item[c].name + ":";
                  } else {
                    sonmatch = item[c].name + ":" + item[c].value + ";";
                  }
                  judgeShow = this.checkStr(judgeShow, sonmatch, item[c].name, item[a].name);//判斷字串是否可選的遞迴方法
                  if (judgeShow == false) {
                    (item[a].son)[b].show = 2;
                    break;
                  }else{
                    start++;
                  }
                }
                //遍歷完成,則該屬性可選
                if (start == item.length) {
                  (item[a].son)[b].show = 0;
                }
              }
            }
          }
          this.allattr = item;
        }
        //放置點選的屬性以後。判斷一下是否三個屬性全部選擇完成
        let clicknum = 0;
        for (let h = 0; h < item.length; h++) {
          if (item[h].value != null) {
            clicknum++;
          }
        }
        if (clicknum == item.length) {
          let son = "";
          for (var i = 0; i < item.length; i++) {
            son = son + item[i].name + ":" + item[i].value + ";";
          }

          //         用得到的son  去查詢總的商品列表獲取商品的資訊
          for (var j = 0; j < this.shopattr.length; j++) {
            if (son === this.shopattr[j].attrStr) {
              this.pdid = this.shopattr[j].pdid;
              break;
            }
          }
        }else{
          this.pdid = "";
        }
      },
//    //檢視該屬性是否匹配成功
      //  用於迴圈屬性是否成功
      checkStr:function(sonGroup,sonmatch,matchname,getname){
        if(matchname==getname){
          return sonGroup;//如果遍歷的屬性,和所遍歷物件同一個父屬性:例如顏色;則預設遞迴返回
        }else{
          //遍歷是否該商品集合中,含有點選事件的集合,有則該屬性可選;
          let myGroup=[],haveGroup=[];
          myGroup=sonGroup;
          let num=0;
          for(let w=0;w<myGroup.length;w++){
            if(myGroup[w].attrStr.indexOf(sonmatch)!=-1 ){
              haveGroup.push(myGroup[w]);
            }else{
              num++;
            }
          }
          if(num==myGroup.length){
            return false;
          }else{
            return haveGroup;
          }
        }
      },
複製程式碼

相關文章