一、源码地址

https://github.com/imxiaoer/WeChatMiniSelect

二、效果图

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

三、组件源码

1. select.wxml

  1. <view class="select-box">
  2. <view class="select-current" catchtap="openClose">
  3. <text class="current-name">{{current.name}}</text>
  4. </view>
  5. <view class="option-list" wx:if="{{isShow}}" catchtap="optionTap">
  6. <text class="option"
  7. data-id="{{defaultOption.id}}"
  8. data-name="{{defaultOption.name}}">{{defaultOption.name}}
  9. </text>
  10. <text class="option"
  11. wx:for="{{result}}"
  12. wx:key="{{item.id}}"
  13. data-id="{{item.id}}"
  14. data-name="{{item.name}}">{{item.name}}
  15. </text>
  16. </view>
  17. </view>

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

2. select.js

  1. Component({
  2. properties: {
  3. options: {
  4. type: Array,
  5. value: []
  6. },
  7. defaultOption: {
  8. type: Object,
  9. value: {
  10. id: '000',
  11. name: '全部城市'
  12. }
  13. },
  14. key: {
  15. type: String,
  16. value: 'id'
  17. },
  18. text: {
  19. type: String,
  20. value: 'name'
  21. }
  22. },
  23. data: {
  24. result: [],
  25. isShow: false,
  26. current: {}
  27. },
  28. methods: {
  29. optionTap(e) {
  30. let dataset = e.target.dataset
  31. this.setData({
  32. current: dataset,
  33. isShow: false
  34. });
  35.  
  36. // 调用父组件方法,并传参
  37. this.triggerEvent("change", { ...dataset })
  38. },
  39. openClose() {
  40. this.setData({
  41. isShow: !this.data.isShow
  42. })
  43. },
  44.  
  45. // 此方法供父组件调用
  46. close() {
  47. this.setData({
  48. isShow: false
  49. })
  50. }
  51. },
  52. lifetimes: {
  53. attached() {
  54. // 属性名称转换, 如果不是 { id: '', name:'' } 格式,则转为 { id: '', name:'' } 格式
  55. let result = []
  56. if (this.data.key !== 'id' || this.data.text !== 'name') {
  57. for (let item of this.data.options) {
  58. let { [this.data.key]: id, [this.data.text]: name } = item
  59. result.push({ id, name })
  60. }
  61. }
  62. this.setData({
  63. current: Object.assign({}, this.data.defaultOption),
  64. result: result
  65. })
  66. }
  67. }
  68. })

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

  1. [{
  2. city_id: '001',
  3. city_name: '北京'
  4. }, {
  5. city_id: '002',
  6. city_name: '上海'
  7. }, {
  8. city_id: '003',
  9. city_name: '深圳'
  10. }]

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

  1. [{
  2. id: '001',
  3. name: '北京'
  4. }, {
  5. id: '002',
  6. name: '上海'
  7. }, {
  8. id: '003',
  9. name: '深圳'
  10. }]

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

3. select.json

  1. {
  2. "component": true,
  3. "usingComponents": {}
  4. }

4. select.wxss

  1. .select-box {
  2. position: relative;
  3. width: 100%;
  4. font-size: 30rpx;
  5. }
  6.  
  7. .select-current {
  8. position: relative;
  9. width: 100%;
  10. padding: 0 10rpx;
  11. line-height: 70rpx;
  12. border: 1rpx solid #ddd;
  13. border-radius: 6rpx;
  14. box-sizing: border-box;
  15. }
  16.  
  17. .select-current::after {
  18. position: absolute;
  19. display: block;
  20. right: 16rpx;
  21. top: 30rpx;
  22. content: '';
  23. width:;
  24. height:;
  25. border: 10rpx solid transparent;
  26. border-top: 10rpx solid #999;
  27. }
  28.  
  29. .current-name {
  30. display: block;
  31. width: 85%;
  32. height: 100%;
  33. word-wrap: normal;
  34. overflow: hidden;
  35. }
  36.  
  37. .option-list {
  38. position: absolute;
  39. left:;
  40. top: 76rpx;
  41. width: 100%;
  42. padding: 12rpx 20rpx 10rpx 20rpx;
  43. border-radius: 6rpx;
  44. box-sizing: border-box;
  45. z-index:;
  46. box-shadow: 0rpx 0rpx 1rpx 1rpx rgba(0, 0, 0, 0.2) inset;
  47. background-color: #fff;
  48. }
  49.  
  50. .option {
  51. display: block;
  52. width: 100%;
  53. line-height: 70rpx;
  54. border-bottom: 1rpx solid #eee;
  55. }
  56.  
  57. .option:last-child {
  58. border-bottom: none;
  59. padding-bottom:;
  60. }

四、组件的使用

index.wxml

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

微信小程序 select 下拉框组件的更多相关文章

  1. 微信小程序的下拉刷新

    微信小程序的下拉刷新:在page的js文件中有监听用户下拉刷新的处理函数onPullDownRefresh:function(){} //js文件中自带的处理函数,在onUnload下面,注意不要重复 ...

  2. 微信小程序禁止下拉_解决小程序下拉出现空白的情况

    微信小程序禁止下拉 在微信小程序中,用力往下拉动,页面顶部会出现一段空白的地方. 产品的需求不太允许这么做,会影响用户体验,查看文档发现可以使用enablePullDownRefresh这属性来实现, ...

  3. 微信小程序-自定义下拉刷新

    最近给别个公司做技术支持,要实现微信小程序上拉刷新与下拉加载更多 微信给出的接口不怎么友好,最终想实现效果类似QQ手机版 ,一共3种下拉刷新状态变化,文字+图片+背景颜色 最终实现后的效果(这里提示有 ...

  4. 微信小程序-页面下拉

    微信小程序当滑动到最顶部和最底部时,继续下拉,会将整个页面拉下去或者拉上去,本来以为是客户端自有的特性,就没去管他,直到我的禅道出现了这个记录... 其实这个问题是可以解决的,只需要在你不想出现在此情 ...

  5. 微信小程序picker下拉绑定数据

    页面部分 <picker mode = "selector" bindchange="bindPickerChange" value="{{pr ...

  6. Vue ElementUI表格table中使用select下拉框组件时获取改变之前的值

    目前项目中有一个场景,就是表格中显示下拉框,并且下拉框的值可以更改,更改后提交后台更新.因为这个操作比较重要,所以切换时会有一个提示框,提示用户是否修改,是则走提交逻辑,否则直接返回,什么也不做. 之 ...

  7. 【微信小程序】下拉刷新真机测试无效

    根据文档的描述,做上拉加载时直接实现页面的onReachBottom()函数即可.但是要做下拉刷新时,除了实现onPullDownRefresh()函数外,还必须要在app.json中配置开启enab ...

  8. 微信小程序iOS下拉白屏晃动,坑坑坑

    感觉ios的小程序每个页面都可以下拉出现白屏 有时页面带有滑动的属性会跟着晃动,体验不是很好 解决办法: 先禁止页面下拉 <config> { navigationBarTitleText ...

  9. 微信小程序:下拉刷新

    下拉刷新 1.需要在json文件中,设置"enablePullDownRefresh": true,表示该页面使用下拉刷新 2.在微信内置函数onPullDownRefresh中进 ...

随机推荐

  1. JavaSE(二)标识符,关键字,数据类型

    一.标识符和关键字         1.具有特殊作用的分隔符:分号;.花括号{}.圆括号().空格.圆点 .          2.标识符规则:用于给程序中变量.类.方法命名的符号.       Ja ...

  2. 【POJ - 1862】Stripies (贪心)

    Stripies 直接上中文了 Descriptions 我们的化学生物学家发明了一种新的叫stripies非常神奇的生命.该stripies是透明的无定形变形虫似的生物,生活在果冻状的营养培养基平板 ...

  3. Hadoop 系列(七)—— HDFS Java API

    一. 简介 想要使用 HDFS API,需要导入依赖 hadoop-client.如果是 CDH 版本的 Hadoop,还需要额外指明其仓库地址: <?xml version="1.0 ...

  4. Spring cloud 超时配置总结

    基准配置: eureka-server : 注册中心 端口号1000 service-A : 服务A端口号2000 service-B : 服务B 端口号3000 其中,B服务通过feign调用服务A ...

  5. 冬天苹果笔记macbookpro消除静电的方法

    冬天mac除静电的方法 1.mac虽然声称不需要关机,但和apple技术人员沟通后,还是需要1周进行一次关机操作 2.知乎上的回答:https://www.zhihu.com/question/195 ...

  6. android——Fragment

    谷歌官方文档的介绍: https://developer.android.com/guide/components/fragments.html#Design Fragment 表示 Activity ...

  7. ABAP:如何等待小数秒数

    WAIT UP TO x SECONDS. 和CALL FUNCTION 'ENQUE_SLEEP'都只能支持整数的秒数(如果是非整数,则四舍五入),如果要WAIT非整数的描述,可以如下写法:

  8. Mac安装Navicat的那些破事儿

    本文目的如题,navicat 优点不再赘述.如有侵权,请联系我立即删除. 下载地址 Mac版 Navicat Premium 12 v12.0.23.0 官网下载地址: 英文64位 http://do ...

  9. listary的使用心得

    1.关键字里面的 web 不仅仅可以打开网页也可以打开电脑上的应用程序. 2.但是呢,有时候虽然 URL 指向了正确的 exe 但是却打不开相应的软件.这是为什么呢?(有其他方法可以打开) 我在这里提 ...

  10. 随笔编号-08 MYSQL 存储过程,5分钟执行调用过程;

    delimiter //DROP PROCEDUREIF EXISTS jdt.day_instan_data_task// CREATE PROCEDURE jdt.day_instan_data_ ...