微信小程序 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获取对象的方法足以应付常见的各种类型的对象
May 14 Javascript
php实例分享之实现显示网站运行时间
May 20 Javascript
jquery 实现两Select 标签项互调示例代码
Sep 25 Javascript
深入浅析AngularJS中的module(模块)
Jan 04 Javascript
jQuery调用Webservice传递json数组的方法
Aug 06 Javascript
jQuery flip插件实现的翻牌效果示例【附demo源码下载】
Sep 20 Javascript
微信小程序如何获知用户运行小程序的场景教程
May 17 Javascript
angular之ng-template模板加载
Nov 09 Javascript
实战node静态文件服务器的示例代码
Mar 08 Javascript
小程序实现左右来回滚动字幕效果
Dec 28 Javascript
js实现盒子拖拽动画效果
Aug 09 Javascript
vue中路由跳转不计入history的操作
Sep 21 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 IP及IP段进行访问限制的代码
2008/12/17 PHP
thinkphp路由规则使用示例详解和伪静态功能实现(apache重写)
2014/02/24 PHP
phplot生成图片类用法详解
2015/01/06 PHP
PHP第三方登录―QQ登录实现方法
2017/02/06 PHP
php 生成加密公钥加密私钥实例详解
2017/06/16 PHP
详解PHP的抽象类和抽象方法以及接口总结
2019/03/15 PHP
php抽象类和接口知识点整理总结
2019/08/02 PHP
js form 验证函数 当前比较流行的错误提示
2009/06/23 Javascript
用js实现小球的自由移动代码
2013/04/22 Javascript
jQuery实现密保互斥问题解决方案
2013/08/16 Javascript
JavaScript设计模式之适配器模式介绍
2014/12/28 Javascript
Javascript变量的作用域和作用域链详解
2015/04/02 Javascript
javascript bom是什么及bom和dom的区别
2015/11/26 Javascript
Linux下为Node.js程序配置MySQL或Oracle数据库的方法
2016/03/19 Javascript
AngularJS中的缓存使用
2017/01/11 Javascript
Nodejs异步回调之异常处理实例分析
2018/06/22 NodeJs
vue-cli 3.x 配置Axios(proxyTable)跨域代理方法
2018/09/19 Javascript
vue+axios实现文件下载及vue中使用axios的实例
2018/09/21 Javascript
linux系统使用python监测系统负载脚本分享
2014/01/15 Python
Python collections模块实例讲解
2014/04/07 Python
python中pandas.DataFrame排除特定行方法示例
2017/03/12 Python
Django基础三之视图函数的使用方法
2019/07/18 Python
python使用nibabel和sitk读取保存nii.gz文件实例
2020/07/01 Python
CSS3 :nth-child()伪类选择器实现奇偶行显示不同样式
2013/11/05 HTML / CSS
全球最大的中文旅行网站:去哪儿网
2017/11/16 全球购物
英国水族馆和池塘用品购物网站:Warehouse Aquatics
2019/08/29 全球购物
成都思必达公司C#程序员招聘面试题
2013/06/26 面试题
27个经典Linux面试题及答案,你知道几个?
2013/01/10 面试题
获奖的大学生创业计划书
2014/01/05 职场文书
七年级政治教学反思
2014/02/03 职场文书
给市场的环保建议书
2014/05/14 职场文书
2014年乡镇团委工作总结
2014/12/18 职场文书
2019年感恩励志演讲稿(收藏备用)
2019/09/11 职场文书
matplotlib画混淆矩阵与正确率曲线的实例代码
2021/06/01 Python
微信小程序中wxs文件的一些妙用分享
2022/02/18 Javascript
以MySQL5.7为例了解一下执行计划
2022/04/13 MySQL