小程序下拉select通用组件

自己码了一个小程序的下拉组件,后续继续优化通用性

最终效果:

 

代码(每段代码最上部标注了文件类型):

<!--components/s-select/index.wxml-->
<view class="select-box">
  <view class="select-current" catchtap="openClose">
    <input class="current-name" placeholder="请选择客户" name="{{showFieldName}}" value="{{showFieldVal}}" data-id="{{keyFieldVal}}"/>
    <input class="key-input" name="{{keyFieldName}}" value="{{keyFieldVal}}"/>
  </view>
  <view class="option-list" wx:if="{{isShow}}">
    <view wx:for="{{result}}" wx:key="id">
      <text class="option"  data-id="{{item.id}}" data-value="{{item.name}}" bindtap="clickSelect">{{item.name}}</text>
    </view>
  </view>
</view>
/* components/s-select/index.wxss */
.select-box {
  position: relative;
  width: 300rpx;
  font-size: 30rpx;
}

.select-current {
  position: relative;
  width: 300rpx;
  padding: 0 10rpx;
  line-height: 70rpx;
  border: 1rpx solid #ddd;
  border-radius: 6rpx;
  box-sizing: border-box;
}

.select-current::after {
  position: absolute;
  display: block;
  right: 16rpx;
  top: 30rpx;
  content: '';
  width: 0;
  height: 0;
  border: 10rpx solid transparent;
  border-top: 10rpx solid #999;
}

.current-name {
  display: block;
  width: 85%;
  height: 70rpx;
  word-wrap: normal;
  overflow: hidden;
}

.option-list {
  position: absolute;
  left: 0;
  top: 76rpx;
  width: 100%;
  padding: 12rpx 20rpx 10rpx 20rpx;
  border-radius: 6rpx;
  box-sizing: border-box;
  z-index: 99;
  box-shadow: 0rpx 0rpx 1rpx 1rpx rcurrent-namegba(0, 0, 0, 0.2) inset;
  background-color: #fff;
}

.option {
  display: block;
  width: 100%;
  line-height: 70rpx;
  border-bottom: 1rpx solid #dadada;
}

.option:last-child {
  border-bottom: none;
  padding-bottom: 0;
}

.key-input{
  display: none;
}

// components/s-select/index.js
Component({
  /**
   * 组件的属性列表
   */
  properties: {
    options: Array,
    showFieldName: "company_name",
    keyFieldName: "company_code"
  },
  /**
   * 声明调用的form表单可以感知到input内容
   */
  behaviors: ['wx://form-field-group'],
  /**
   * 组件的初始数据
   */
  data: {
    result: Array,
    keyFieldVal: "",
    showFieldVal: "",
    isShow: false
  },

  /**
   * 组件的方法列表
   */
  methods: {

    clickSelect: function(e){
      console.log(e);
      this.setData({
        keyFieldVal: e.currentTarget.dataset.id,
        showFieldVal: e.currentTarget.dataset.value,
        isShow: false
      });
    },

    openClose: function(){
      this.setData({
        isShow: !this.data.isShow
      })
    },


    close() {
      this.setData({
        isShow: false
      })
    }
  },
  lifetimes: {
    attached() {
      var pp = new Array();
      for(let item of this.data.options){
        var ob = {};
        for(var colum in item){
          if(colum === this.data.keyFieldName){
            ob.id=item[colum];
          }else if(colum === this.data.showFieldName){
            ob.name=item[colum];
          }
        }
        pp.push(ob);
      };
      this.setData({
        result: pp
      })
    }
  }
  
})

调用:

//  pages/home/home.js

 data: {
    options: [
      {
        companyCode: "1221002",
        companyName: "南京企业"
      },
      {
        companyCode: "1221011",
        companyName: "海尔空调"
      },
      {
        companyCode: "1221012",
        companyName: "京东企业"
      }
    ],
    showFieldName: "companyName",
    keyFieldName: "companyCode"
  }

<!--page/home/home.wxml-->
<s-select options="{{options}}" showFieldName="companyName" keyFieldName="companyCode"></s-select>

本文基于已有的博客内容修改的符合个人理解一些

参考:https://www.cnblogs.com/similar/p/11469091.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值