微信小程序 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 相关文章推荐
JavaScript原型链示例分享
Jan 26 Javascript
jquery查找tr td 示例模拟
May 08 Javascript
javascript学习笔记(三)BOM和DOM详解
Sep 30 Javascript
浅析函数声明和函数表达式——函数声明的声明提前
May 03 Javascript
jQuery实现html table行Tr的复制、删除、计算功能
Jul 10 jQuery
简述jQuery Easyui一些用法
Aug 01 jQuery
慕课网题目之js实现抽奖系统功能
Sep 19 Javascript
es6在react中的应用代码解析
Nov 08 Javascript
解析JS在获取当前月的最后一天遇到的坑
Aug 30 Javascript
vue项目实现图片上传功能
Dec 23 Javascript
javascript中的offsetWidth、clientWidth、innerWidth及相关属性方法
May 14 Javascript
jquery实现简单拖拽效果
Jul 20 jQuery
移动端手指操控左右滑动的菜单
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
5.PHP的其他功能
2006/10/09 PHP
phpQuery让php处理html代码像jQuery一样方便
2015/01/06 PHP
Windows平台实现PHP连接SQL Server2008的方法
2017/07/26 PHP
PHP+jQuery实现即点即改功能示例
2019/02/21 PHP
打印json对象的内容及JSON.stringify函数应用
2013/03/29 Javascript
jquery左边浮动到一定位置时显示返回顶部按钮
2014/06/05 Javascript
js跨域请求数据的3种常用的方法
2015/12/01 Javascript
Javascript中的数组常用方法解析
2016/06/17 Javascript
JavaScript——DOM操作——Window.document对象详解
2016/07/14 Javascript
jQuery向父辈遍历的简单方法
2016/09/18 Javascript
Bootstrap框架实现广告轮播效果
2016/11/28 Javascript
angularjs中使用ng-bind-html和ng-include的实例
2017/04/28 Javascript
Underscore之Array_动力节点Java学院整理
2017/07/10 Javascript
利用node.js实现自动生成前端项目组件的方法详解
2017/07/12 Javascript
Cpage.js给组件绑定事件的实现代码
2017/08/31 Javascript
详解使用PM2管理nodejs进程
2017/10/24 NodeJs
node结合swig渲染摸板的方法
2018/04/11 Javascript
angular 数据绑定之[]和{{}}的区别
2018/09/25 Javascript
js仿360开机效果
2019/12/26 Javascript
[41:12]Liquid vs Secret 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.24
2019/09/10 DOTA
python实现分析apache和nginx日志文件并输出访客ip列表的方法
2015/04/04 Python
基于scrapy实现的简单蜘蛛采集程序
2015/04/17 Python
浅谈Python中列表生成式和生成器的区别
2015/08/03 Python
Python基于二分查找实现求整数平方根的方法
2016/05/12 Python
使用Python爬虫库BeautifulSoup遍历文档树并对标签进行操作详解
2020/01/25 Python
python为什么要安装到c盘
2020/07/20 Python
python 绘制正态曲线的示例
2020/09/24 Python
意大利奢侈品多品牌集合店:TheDoubleF
2019/08/24 全球购物
办公室副主任职责范本
2014/03/08 职场文书
党员干部反四风民主生活会对照检查材料思想汇报
2014/10/12 职场文书
党建工作整改措施
2014/10/28 职场文书
我们的节日中秋节活动总结
2015/03/23 职场文书
2015年计划生育责任书
2015/05/08 职场文书
劳动仲裁撤诉申请书
2015/05/18 职场文书
离婚答辩状怎么写
2015/05/22 职场文书
Go语言读取txt文档的操作方法
2022/01/22 Golang