【微信小程序】商品多規(guī)格的sku組件完整代碼

一袖迎、效果圖:
無庫存置灰不可選
二王污、使用:

頁面使用組件:

<!-- 規(guī)格 -->
<view class="specification">
    <view class="title">選擇規(guī)格</view>
    <commodity-sku skuNameArr="{{detailData.specList}}" skuInfoArr="{{detailData.specInfo}}"
        bind:getResultObj="getResultObj">
    </commodity-sku>
</view>

記得注冊組件:

{
  "usingComponents": {
    "commodity-sku": "/components/commodity-sku/commodity-sku"
  }
}
三、完整組件:

commodity-sku.wxml

<!-- sku組件 -->
<view class="container">
  <view class="sku-item" wx:for="{{skuNameArr}}" wx:for-item="item" wx:key="index">
    <view class='spec-name'>{{item.specName}}</view>
    <view class="spec-right">
      <view wx:for="{{item.attrList}}" wx:for-item="subItem" wx:for-index='subIndex' wx:key="subIndex"
        bindtap="changeItem" data-show="{{subItem.isShow}}"
        class="{{subItem.isShow?'':'no-active'}} {{subIndexArr[index] == subIndex?'active':''}}"
        data-ol="{{subIndex[index]}}" data-name="{{subItem.attrName}}" data-index="{{index}}"
        data-subindex="{{subIndex}}">{{subItem.attrName}}
        <!-- 勾選的圖片沒有可以不要 -->
        <image class="tags-img" wx:if="{{subIndexArr[index] == subIndex}}" src="/mall-pages/images/commodity/sel.png" />
      </view>
    </view>
  </view>
  <view wx:if="{{resultObj.price}}">該組合價格為 {{resultObj.price}} </view>
</view>

commodity-sku.js

page({
  properties: {
    // 規(guī)格名稱數組
    skuNameArr: {
      type: Array,
      value: []
    },
    // 規(guī)格匹配信息
    skuInfoArr: {
      type: Array,
      value: []
    }
  },
  data: {
    //存放被選中的值
    selectArr: [],
    //存放要和選中的值進行匹配的數據
    selItemObj: {},
    //是否選中 因為不確定是多規(guī)格還是但規(guī)格曲掰,所以這里定義數組來判斷
    subIndexArr: [],
    //最終匹配到的規(guī)格信息結果
    resultObj: {},
  },
  methods: {
    // 切換規(guī)格
    changeItem(e) {
      var index = e.currentTarget.dataset.index
      var subindex = e.currentTarget.dataset.subindex
      var item = e.currentTarget.dataset.name
      var selectArr = this.data.selectArr
      var subIndexArr = this.data.subIndexArr
      var selItemObj = this.data.selItemObj
      if (selectArr[index] != item) {
        selectArr[index] = item;
        subIndexArr[index] = subindex;
      } else {
        //去掉選中的顏色
        // this.selectArr[index] = "";
        // this.subIndexArr[index] = -1;
      }
      this.filterSkuNameArr();
      var obj = selItemObj[selectArr];
      this.setData({
        selectArr: selectArr,
        subIndexArr: subIndexArr,
        resultObj: obj,
        selItemObj: selItemObj
      })
      console.log(obj)
      this.triggerEvent('getResultObj', obj)
    },
    // 過濾每一組是否可選 isShow
    filterSkuNameArr() {
      var self = this;
      var arr = self.data.skuNameArr;
      var result = []; //定義數組存儲被選中的值
      for (var i in arr) {
        result[i] = self.data.selectArr[i] ? self.data.selectArr[i] : "";
      }
      for (var i in arr) {
        var last = result[i]; //把選中的值存放到字符串last去
        for (var j in arr[i].attrList) {
          result[i] = arr[i].attrList[j].attrName; //賦值垃杖,存在直接覆蓋,不存在往里面添加name值
          arr[i].attrList[j].isShow = self.isMay(result); //在數據里面添加字段isShow來判斷是否可以選擇
        }
        result[i] = last; //還原找前,目的是記錄點下去那個值糟袁,避免下一次執(zhí)行循環(huán)時避免被覆蓋
      }
      self.setData({
        skuNameArr: arr
      })
      console.log(arr);
    },
    // 判斷是否可選 
    isMay(result) {
      for (var i in result) {
        if (result[i] == "") {
          //如果數組里有為空的值,那直接返回true
          return true;
        }
      }
      //匹配選中的數據的庫存躺盛,若不為空返回true反之返回false
      return !this.data.selItemObj[result] ? false : this.data.selItemObj[result].stockNum == 0 ? false : true;
    },
  },
  lifetimes: {
    ready() {
      console.log(this.data.skuNameArr);
      console.log(this.data.skuInfoArr);
      var skuInfoArr = this.data.skuInfoArr
      var selItemObj = this.data.selItemObj
      var skuNameArr = this.data.skuNameArr
      for (var i in skuInfoArr) {
        //修改數據結構格式项戴,改成鍵值對的方式,以方便和選中之后的值進行匹配
        selItemObj[skuInfoArr[i].wholeSpecName] = skuInfoArr[i];
      }
      for (var i = 0; i < skuNameArr.length; i++) {
        for (var o = 0; o < skuNameArr[i].attrList.length; o++) {
          skuNameArr[i].attrList[o].isShow = true
        }
      }
      this.setData({
        skuInfoArr: skuInfoArr,
        selItemObj: selItemObj,
        skuNameArr: skuNameArr
      })
    }
  }
})

commodity-sku.wxss

.sku-item {
    margin-top: 30rpx;
    display: flex;
}

.spec-name {
    position: relative;
    top: 15rpx;
    width: 22%;
    font-size: 24rpx;
    font-weight: 600;
    word-break: break-all;
}

.spec-right view {
    margin-right: 16rpx;
    margin-bottom: 16rpx;
    padding: 0 16rpx;
    line-height: 60rpx;
    background: #FFFFFF;
    border-radius: 8rpx;
    border: 2rpx solid #DDDDDD;
    display: inline-block;
    font-size: 24rpx;
    -webkit-border-radius: 8rpx;
    -moz-border-radius: 8rpx;
    -ms-border-radius: 8rpx;
    -o-border-radius: 8rpx;
    position: relative;
    overflow: hidden;
    word-break: break-all;
    min-height: 42rpx;
}

.spec-right .active {
    background: #FFF7F0;
    border: 2rpx solid #FF6526;
}

.spec-right .no-active {
    color: #9DA0A6;
    pointer-events: none;
}
.tags-img {
    position: absolute;
    width: 26rpx;
    height: 20rpx;
    right: -4rpx;
    bottom: 0;
}
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末槽惫,一起剝皮案震驚了整個濱河市周叮,隨后出現的幾起案子,更是在濱河造成了極大的恐慌界斜,老刑警劉巖仿耽,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異各薇,居然都是意外死亡项贺,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來敬扛,“玉大人晰洒,你說我怎么就攤上這事∩都” “怎么了谍珊?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長急侥。 經常有香客問我砌滞,道長,這世上最難降的妖魔是什么坏怪? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任贝润,我火速辦了婚禮,結果婚禮上铝宵,老公的妹妹穿的比我還像新娘打掘。我一直安慰自己,他們只是感情好鹏秋,可當我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布尊蚁。 她就那樣靜靜地躺著,像睡著了一般侣夷。 火紅的嫁衣襯著肌膚如雪横朋。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天百拓,我揣著相機與錄音琴锭,去河邊找鬼。 笑死衙传,一個胖子當著我的面吹牛决帖,可吹牛的內容都是我干的。 我是一名探鬼主播粪牲,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼古瓤,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了腺阳?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤穿香,失蹤者是張志新(化名)和其女友劉穎亭引,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體皮获,經...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡焙蚓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片购公。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡萌京,死狀恐怖,靈堂內的尸體忽然破棺而出宏浩,到底是詐尸還是另有隱情知残,我是刑警寧澤,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布比庄,位于F島的核電站求妹,受9級特大地震影響,放射性物質發(fā)生泄漏佳窑。R本人自食惡果不足惜制恍,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望神凑。 院中可真熱鬧净神,春花似錦、人聲如沸溉委。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽薛躬。三九已至俯渤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間型宝,已是汗流浹背八匠。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留趴酣,地道東北人梨树。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像岖寞,于是被迫代替她去往敵國和親抡四。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,901評論 2 355

推薦閱讀更多精彩內容