自定义微信小程序下拉选择组件Select

背景
项目需求要实现类似html标签 <Select/>效果,所以写了一个类型效果的自定义组件。


效果图

wxml

<view class="view-body">
  <text class='item-key'>{{title}}<text style="color:red" wx:if="{{isRequired}}">*</text></text>
  <view class="view-select-container">
    <view class='select-value' bindtap="selectToggle">
      <input value="{{value}}" name='{{name}}' disabled="{{true}}" />
      <image class='img-arrow' style="width:40rpx;height:40rpx" src='/images/drop_down.png' />
    </view>
    <view class="view-options" wx:if="{{showOptions}}">
      <cover-view class='option-item' wx:for="{{options}}" data-index="{{index}}" bindtap="selectItem">{{item[showkey]}}</cover-view>
    </view>
  </view>
</view>

 js

Component({
  behaviors: ['wx://form-field'], //支持表单获取组件值
  properties: {
    //组件的名称
    title: {
      type: String
    },
    //通过form获取组件的值
    name: {
      type: String
    },
    //下拉显示的数据集合
    options: {
      type: Array
    },
    //表单组件是否必填
    isRequired: {
      type: Boolean
    },
    //外部传递的动态变量
    showkey: {
      type: String
    }
  },
  data: {
    showOptions: false //组件默认的展开状态
  },
  /**
   * 组件的方法列表
   */
  lifetimes: {
    attached: function() {
      var key = this.properties.showkey
      this.setData({
        value: this.properties.options[0][key] //默认选中第一个
      })
    },
  },
  methods: {
    selectToggle: function(e) {
      this.setData({
        showOptions: !this.data.showOptions
      })
    },
    selectItem: function(e) {
      var optionList = this.properties.options //外部传进来的数组对象
      var nowIdx = e.currentTarget.dataset.index //当前点击的索引
      var selectItem = optionList[nowIdx] //当前点击的内容
      this.setData({
        showOptions: false,
        value: selectItem[this.properties.showkey]
      });
      var eventOption = {} // 触发事件的选项
      this.triggerEvent("mySelectItem", selectItem) //组件选中回调
    }
  }
})

使用

json中引入自定义组件

{
  "usingComponents": {
    "Select": "/components/select/select"
  }
}


js

Page({
  data: {
    optionArry: [{
      "name": "香蕉",
      "id": "1"
    }, {
      "name": "苹果",
      "id": "2"
    }, {
      "name": "橘子",
      "id": "3"
    }, {
      "name": "雪梨",
      "id": "4"
    }],
  },
  onLoad: function() {},
})


wxml中使用

<Select title="类别" options="{{optionArry}}" isRequired="true" bind:mySelectItem='onSelectItem' name='formkey' showkey='name' />

 

总结:可以动态传递对象数组在组件中显示的属性名,类型picker的range-key;主要遇到的问题就是组件展开时遮住原生组件时的点击击穿问题,所以这里使用了 cover-view 来解决这一问题。

最后完整源码地址为:

https://github.com/tex-github/miniprogram-components-select.git

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值