小程序 封装的商品规格选择器

    index  wxml

<button class="btn" bindtap="popup" data-position="bottom">选择商品</button>

<page-container  // 微信自己退出的底部弹出

  show="{{show}}"

  duration="200"

  position="{{position}}"

  close-on-slide-down="{{false}}"

>

  <view class="detail-page">

    <selector ws:if="{{selectorList}}" skuList="{{skuList}}"  selectorListL="{{selectorList}}"  pitchOnList="{{pitchOnList}}" bindmyevent="myevent" ></selector>

  </view>

</page-container>


index  js

// index/index.js

Page({

  /**

   * 页面的初始数据

   */

  data: {},

  /**

   * 生命周期函数--监听页面加载

   */

  onLoad: function (options) {

    this.selector()

  },

  selector() {

    var that = this

    // 页面加载到详情页 获取详情页要渲染的数据

    var api = '公司AP无法展示,可以看下面的数据格式  去写一个假数据'

    wx.request({

      url: api,

      data: {

        productId: 123,

        userId: 261,

        partnerId: 0,

        platform: 'miniProgram',

      },

      success(res) {

        that.onLoadList(res.data.data)

        that.setData({

          selectorList: res.data.data

        })

      }

    })

  },

  onLoadList(data) {

    var skuList = data.skuList

    var objSku = {}

    for (var i in skuList) {

      objSku[skuList[i].value] = skuList[i]; //修改数据结构格式,改成键值对的方式,以方便和选中之后的值进行匹配

    }

    this.setData({

      skuList: objSku,

      pitchOnList: skuList[0].value.split(',')

    })

  },

  popup(e) {

    const position = e.currentTarget.dataset.position

    let customStyle = ''

    let duration = this.data.duration

    switch (position) {

      case 'top':

      case 'bottom':

        customStyle = 'height: 80%;'

        break

      case 'right':

        break

    }

    this.setData({

      position,

      show: true,

      customStyle,

      duration

    })

  },

  myevent(e) {

    console.log(e.detail.res);

    this.setData({

      show: false

    })

  },

})


index  json

{

  "usingComponents": {

    "selector":"/components/selector/selector"

  }

}


组件 selector  wxml

<view class="selector">

  <view class="close" catchtap="close">X</view>

  <!-- 商品信息 -->

  <view class="top" >

    <image class="image" src="{{skuListSelect.image || selectorListL.skuList[0].image }}"></image>

    <view class="money">

      <view>¥{{skuListSelect.price || selectorListL.skuList[0].price }}</view>

      <view>库存 {{skuListSelect.stock || selectorListL.skuList[0].stock }} 件</view>

      <view>已选:{{skuListSelect.value || selectorListL.skuList[0].value }}</view>

    </view>

  </view>

  <!-- 规格渲染 -->

  <scroll-view scroll-y="true" style="height: 500rpx;">

  <view class="center">

    <!-- 循环渲染规格里面的数据  渲染第一层的数据  wx:for-index="fuIndex"   父级的索引 

     wx:for-item="item1"  渲染的item  重新命名防止冲突

     -->

    <block wx:for="{{selectorListL.specList}}" wx:key="index" wx:for-index="fuIndex" wx:for-item="item1">

    <view>{{item1.name}}</view>

      <!-- 渲染规格下面的第二条数据 -->

      <view class="flexView">

        <block wx:for="{{item1.list}}" wx:key="index" wx:for-index="ziIndex" wx:for-item="item2">

          <text class="item2 {{subIndex[fuIndex] == ziIndex?'item2Class':''}}"bindtap="pitchOn" data-select="{{item2}}" data-fuindex="{{fuIndex}}"data-ziindex="{{ziIndex}}"

          >{{item2.name}}</text>

        </block>

      </view>

    </block>

  </view>

</scroll-view>

  <!-- 最下面的确认按钮 -->

  <view>

    <button bindtap="affirm">确认</button>

  </view>

</view>


组件  selector js

// components/selector/selector.js

Component({

  /**

   * 组件的属性列表

   */

  properties: {

    selectorListL:{

      type:Object,

      value:{},

    },

    skuList:{

      type:Object,

      value:{},

    },

    pitchOnList:{

      type:Array,

      value:[]

    }

  },

  /**

   * 组件的初始数据

   */

  data: {

    pitchOnList: [], // 被选中的值

    subIndex: [0, 0], // 选中的索引 0,0 默认选中第一个

    skuListSelect:{}, // 选中的值

  },

  /**

   * 组件的方法列表

   */

  methods: {

    // 选中的内容

    pitchOn(e){

      var that = this

      let fuindex = e.currentTarget.dataset.fuindex; // 获取第一个循环的index

      let ziindex = e.currentTarget.dataset.ziindex // 获取第二个循环的index

      let selectItem = e.currentTarget.dataset.select.name // 当前选中的数据

      // 存放点击的数据

      var pitchOnList = this.data.pitchOnList

      that.setData({

        [`pitchOnList[${fuindex}]`] : selectItem,

      })

    wx.nextTick(

      that.setData({

        skuListSelect: that.data.skuList[pitchOnList],

        [`subIndex[${fuindex}]`] : ziindex

      })

    )

    },

    // 确认  把选中的数据返回

    affirm(){

      this.triggerEvent('myevent',{res:this.data.skuList[this.data.pitchOnList]})

    },

    close(){

     this.affirm()

    },

  }

})


组件 selector json

{

  "component": true,

  "usingComponents": {}

}


组件 selector wxss

/* components/selector/selector.wxss */

page{

  background-color: #f7f7f7;

}

.selector{

  margin: 20rpx  30rpx;

  background-color: #fff;

  padding: 15rpx;

}

.image{

  width: 200rpx;

  height: 200rpx;

}

.top{

  display: flex;

}

.flexView{

  display: flex;

  flex-wrap:wrap;

}

.item2{

  padding: 15rpx 10rpx;

  border: 1rpx solid #ccc;

  border-radius: 5rpx;

  margin: 10rpx;

}

.item2Class{

  border: 1rpx solid #3399ff;

}

.close{

  position: absolute;

  top: 30rpx;

  right: 30rpx;

}



数据结构1


数据结构2


数据结构3


©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,440评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,814评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,427评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,710评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,625评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,014评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,511评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,162评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,311评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,262评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,278评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,989评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,583评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,664评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,904评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,274评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,856评论 2 339

推荐阅读更多精彩内容