微信小程序 select 下拉框组件功能


Posted in Javascript onSeptember 09, 2019

一、源码地址

https://github.com/imxiaoer/WeChatMiniSelect

二、效果图

微信小程序 select 下拉框组件功能

录屏图片质量较差,所以大家会看到残影(捂脸)

三、组件源码

1. select.wxml

<view class="select-box">
 <view class="select-current" catchtap="openClose">
  <text class="current-name">{{current.name}}</text>
 </view>
 <view class="option-list" wx:if="{{isShow}}" catchtap="optionTap">
  <text class="option"
   data-id="{{defaultOption.id}}"
   data-name="{{defaultOption.name}}">{{defaultOption.name}}
  </text>
  <text class="option"
   wx:for="{{result}}"
   wx:key="{{item.id}}"
   data-id="{{item.id}}"
   data-name="{{item.name}}">{{item.name}}
  </text>
 </view>
</view>

说明:用 catchtap 而不用 bindtap 是为了阻止事件冒泡,为了实现点击页面其他地方关闭 select, 所以在父页面(index.wxml)最外层绑定了 bindtap="close" 方法, 不阻止冒泡的话会执行父组件的 close 方法

 2. select.js

 

Component({
 properties: {
  options: {
   type: Array,
   value: []
  },
  defaultOption: {
   type: Object,
   value: {
    id: '000',
    name: '全部城市'
   }
  },
  key: {
   type: String,
   value: 'id'
  },
  text: {
   type: String,
   value: 'name'
  }
 },
 data: {
  result: [],
  isShow: false,
  current: {}
 },
 methods: {
  optionTap(e) {
   let dataset = e.target.dataset
   this.setData({
    current: dataset,
    isShow: false
   });

   // 调用父组件方法,并传参
   this.triggerEvent("change", { ...dataset })
  },
  openClose() {
   this.setData({
    isShow: !this.data.isShow
   })
  },

  // 此方法供父组件调用
  close() {
   this.setData({
    isShow: false
   })
  }
 },
 lifetimes: {
  attached() {
   // 属性名称转换, 如果不是 { id: '', name:'' } 格式,则转为 { id: '', name:'' } 格式
   let result = []
   if (this.data.key !== 'id' || this.data.text !== 'name') {    
    for (let item of this.data.options) {
     let { [this.data.key]: id, [this.data.text]: name } = item
     result.push({ id, name })
    }
   }
   this.setData({
    current: Object.assign({}, this.data.defaultOption),
    result: result
   })
  }
 }
})

说明:properties中的 key 和 text 是为了做属性名转换。比如我现在的数据结构如下:

[{
   city_id: '001',
   city_name: '北京'
  }, {
   city_id: '002',
   city_name: '上海'
  }, {
   city_id: '003',
   city_name: '深圳'
 }]

而 select 组件要求的数据结构是:

[{
   id: '001',
   name: '北京'
  }, {
   id: '002',
   name: '上海'
  }, {
   id: '003',
   name: '深圳'
}]

因此我们就要将 city_id 转换成 id,city_name 转换成 name。 怎么实现属性名转换呢? 就是通过 key 和 text 这两个参数。

 3. select.json

{
 "component": true,
 "usingComponents": {}
}

4. select.wxss

.select-box {
 position: relative;
 width: 100%;
 font-size: 30rpx;
}

.select-current {
 position: relative;
 width: 100%;
 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: 100%;
 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 rgba(0, 0, 0, 0.2) inset;
 background-color: #fff;
}

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

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

 四、组件的使用

index.wxml

<view class="container" bindtap="close">
 <view class="select-wrap">
  <select id="select" options="{{options}}" key="city_id" text="city_name" bind:change="change"></select>
 </view>
</view>

总结

以上所述是小编给大家介绍的微信小程序 select 下拉框组件功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
基于jQuery的让非HTML5浏览器支持placeholder属性的代码
May 24 Javascript
JavaScript中for..in循环陷阱介绍
Nov 12 Javascript
JavaScript实现的CRC32函数示例
Nov 23 Javascript
D3.js进阶系列之CSV表格文件的读取详解
Jun 06 Javascript
js微信分享实现代码
Oct 11 Javascript
js用类封装pop弹窗组件
Oct 08 Javascript
Vue父组件如何获取子组件中的变量
Jul 24 Javascript
layer.open 子页面弹出层向父页面传输数据的例子
Sep 26 Javascript
微信小程序实现滑动翻页效果(完整代码)
Dec 06 Javascript
JavaScript代码模拟鼠标自动点击事件示例
Aug 07 Javascript
vue.js封装switch开关组件的操作
Oct 26 Javascript
微信小程序将页面按钮悬浮固定在底部的实现代码
Oct 29 Javascript
移动端手指操控左右滑动的菜单
Sep 08 #Javascript
swiper Scrollbar滚动条组件详解
Sep 08 #Javascript
js实现移动端tab切换时下划线滑动效果
Sep 08 #Javascript
swiper4实现移动端导航切换
Oct 16 #Javascript
Swiper.js实现移动端元素左右滑动
Sep 08 #Javascript
vue实现抖音时间转盘
Sep 08 #Javascript
javascript移动端 电子书 翻页效果实现代码
Sep 07 #Javascript
You might like
php使用指定编码导出mysql数据到csv文件的方法
2015/03/31 PHP
thinkphp3.2点击刷新生成验证码
2016/02/16 PHP
jquery validate使用攻略 第四步
2010/07/01 Javascript
Javascript中valueOf与toString区别浅析
2013/03/19 Javascript
Extjs4 Treegrid 使用心得分享(经验篇)
2013/07/01 Javascript
jquery实现隐藏与显示动画效果/输入框字符动态递减/导航按钮切换
2013/07/01 Javascript
JS调用页面表格导出excel示例代码
2014/03/18 Javascript
jQuery实现的多选框多级联动插件
2014/05/02 Javascript
JQuery判断radio是否选中并获取选中值的示例代码
2014/10/17 Javascript
Angularjs中controller的三种写法分享
2016/09/21 Javascript
angular $watch 一个变量的变化(实例讲解)
2017/08/02 Javascript
判断滚动条滑到底部触发事件(实例讲解)
2017/11/15 Javascript
js解决软键盘遮挡输入框的问题分享
2017/12/19 Javascript
angularjs中判断ng-repeat是否迭代完的实例
2018/09/12 Javascript
koa router 多文件引入的方法示例
2019/05/22 Javascript
vue项目添加多页面配置的步骤详解
2019/05/22 Javascript
[00:58]他们到底在电话里听到了什么?
2017/11/21 DOTA
[41:13]完美世界DOTA2联赛PWL S2 Forest vs Rebirth 第一场 11.20
2020/11/20 DOTA
使用pandas对矢量化数据进行替换处理的方法
2018/04/11 Python
python的移位操作实现详解
2019/08/21 Python
Django用户身份验证完成示例代码
2020/04/03 Python
使用OpenCV实现道路车辆计数的使用方法
2020/07/15 Python
Python如何重新加载模块
2020/07/29 Python
瑞士香水购物网站:Parfumcity.ch
2017/01/14 全球购物
德国家具在线:Fashion For Home
2017/03/11 全球购物
印度尼西亚最大和最全面的网络商城:Blibli.com
2017/10/04 全球购物
Java程序员面试题
2016/09/27 面试题
正风肃纪剖析材料
2014/02/18 职场文书
安全教育实施方案
2014/03/02 职场文书
报关员个人职业生涯规划书
2014/03/12 职场文书
教师师德考核自我评价
2014/09/13 职场文书
市场营销计划书
2015/01/17 职场文书
考研复习计划
2015/01/19 职场文书
致地震灾区的慰问信
2015/03/23 职场文书
导游词之无锡唐城
2019/12/12 职场文书
nginx从安装到配置详细说明(安装,安全配置,防盗链,动静分离,配置 HTTPS,性能优化)
2022/02/12 Servers