微信小程序自定義select下拉選項框的方法

本文實例為大傢分享瞭微信小程序自定義select下拉選項框的具體代碼,供大傢參考,具體內容如下

第一步:創建組件所需的文件

第二步:開始配置組件

select.json

{
  "component": true,
  "usingComponents": {
    "select": "./select"
  }
}

第三步:自定義組件樣式及js

select.wxml

<view class='com-selectBox'>
    <view class='com-sContent' bindtap='selectToggle'>
        <view class='com-sTxt'>{{nowText}}</view>
        <image src='../../public/image/index/[email protected]'  class='com-sImg'  animation="{{animationData}}"></image>
    </view>
    <view class='com-sList' wx:if="{{selectShow}}">
        <view wx:for="{{propArray}}" data-index="{{index}}" wx:key='' class='com-sItem' bindtap='setText'>{{item.text}}</view>
    </view>
</view>

select.wxss

.com-selectBox{
  width: 200px;
}
.com-sContent{
  border: 1px solid #e2e2e2;
  background: white;
  font-size: 16px;
  position: relative;
  height: 30px;
  line-height: 30px;
}
.com-sImg{
  position: absolute;
  right: 10px;
  top: 11px;
  width: 16px;
  height: 9px;
  transition: all .3s ease;
}
.com-sTxt{
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  padding:0 20px 0 6px;
  font-size: 14px;
}
.com-sList{
  background: white;
  width: inherit;
  position: absolute;
  border: 1px solid #e2e2e2;
  border-top: none;
  box-sizing: border-box;
  z-index: 3;
  max-height: 120px;
  overflow: auto;
}
.com-sItem{
  height: 30px;
  line-height: 30px;
  border-top: 1px solid #e2e2e2;
  padding: 0 6px;
  text-align: left;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  font-size: 14px;
}
.com-sItem:first-child{
  border-top: none;
}

select.js

Component({
  /**
   * 組件的屬性列表
   */
  properties: {
    propArray: {
      type: Array,
    }
  },
  /**
   * 組件的初始數據
   */
  data: {
    selectShow: false, //初始option不顯示
    nowText: "請選擇", //初始內容
    animationData: {} //右邊箭頭的動畫
  },
  /**
   * 組件的方法列表
   */
  methods: {
    //option的顯示與否
    selectToggle: function () {
      var nowShow = this.data.selectShow; //獲取當前option顯示的狀態
      //創建動畫
      var animation = wx.createAnimation({
        timingFunction: "ease"
      })
      this.animation = animation;
      if (nowShow) {
        animation.rotate(0).step();
        this.setData({
          animationData: animation.export()
        })
      } else {
        animation.rotate(180).step();
        this.setData({
          animationData: animation.export()
        })
      }
      this.setData({
        selectShow: !nowShow
      })
    },
    //設置內容
    setText: function (e) {
      var nowData = this.properties.propArray; //當前option的數據是引入組件的頁面傳過來的,所以這裡獲取數據隻有通過this.properties
      var nowIdx = e.target.dataset.index; //當前點擊的索引
      var nowText = nowData[nowIdx].text; //當前點擊的內容
      //子組件觸發事件
      var nowDate = {
        id: nowIdx,
        text: nowText
      }
      this.triggerEvent('myget', nowDate)
      //再次執行動畫,註意這裡一定,一定,一定是this.animation來使用動畫
      this.animation.rotate(0).step();
      this.setData({
        selectShow: false,
        nowText: nowText,
        animationData: this.animation.export()
      })
    }
  }
})

第四步:引入組件,傳入組件所需數據

1、引入組件的頁面的json文件中配置

{
  "usingComponents": {
    "Select": "../../components/select/select"
  },
  "navigationBarTitleText": ""
}

2、引入組件的頁面的wxml文件中配置
bind:myget=‘getDate’ 對組件的事件進行監聽

<Select prop-array='{{selectArray}}' bind:myget='getDate'></Select>

3、引入組件的頁面的js文件中配置

data:{
    selectArray: [
        {
            "id": "01",
            "text": "停車A區"
        }, 
        {
            "id": "02",
            "text": "停車B區"
        }
    ]
 }

getDate:function(e){
    console.log(e.detail)
}

以上就是本文的全部內容,希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。

推薦閱讀: