微信小程序 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获取input表单值的代码
Apr 19 Javascript
js以对象为索引的关联数组
Jul 04 Javascript
js getBoundingClientRect() 来获取页面元素的位置
Nov 25 Javascript
查找Oracle高消耗语句的方法
Mar 22 Javascript
实例剖析AngularJS框架中数据的双向绑定运用
Mar 04 Javascript
基于JavaScript FileReader上传图片显示本地链接
May 27 Javascript
JavaScript使用正则表达式获取全部分组内容的方法示例
Jan 17 Javascript
div中文字内容溢出常见的解决方法
Mar 16 Javascript
vue组件如何被其他项目引用
Apr 13 Javascript
D3.js 实现带伸缩时间轴拓扑图的示例代码
Jan 20 Javascript
js实现星星海特效的示例
Sep 28 Javascript
JavaScript实现一键复制内容剪贴板
Jul 23 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使用数组依次替换字符串中匹配项
2016/01/08 PHP
[原创]php简单防盗链验证实现方法
2016/07/09 PHP
PHP实现的注册,登录及查询用户资料功能API接口示例
2017/06/06 PHP
PHP count_chars()函数讲解
2019/02/14 PHP
jquery键盘事件使用介绍
2011/11/01 Javascript
网页右下角弹出窗体实现代码
2014/06/05 Javascript
微信JS接口大全
2016/08/25 Javascript
JS判断键盘是否按的回车键并触发指定按钮点击操作的方法
2017/02/13 Javascript
JS去掉字符串前后空格或去掉所有空格的用法
2017/03/25 Javascript
微信小程序中使用javascript 回调函数
2017/05/11 Javascript
VUE实现表单元素双向绑定(总结)
2017/08/08 Javascript
Vue Transition实现类原生组件跳转过渡动画的示例
2017/08/19 Javascript
es6学习之解构时应该注意的点
2017/08/29 Javascript
JS中的Replace()传入函数时的用法详解
2017/09/11 Javascript
vue实现图书管理demo详解
2017/10/17 Javascript
VUE实现Studio管理后台之鼠标拖放改变窗口大小
2020/03/04 Javascript
Python环境变量设置方法
2016/08/28 Python
基于并发服务器几种实现方法(总结)
2017/12/29 Python
PyQt5根据控件Id获取控件对象的方法
2019/06/25 Python
SVG实现多彩圆环倒计时效果的示例代码
2017/11/21 HTML / CSS
环境科学毕业生自荐信
2013/11/21 职场文书
节约用水倡议书
2014/04/16 职场文书
超市创业计划书
2014/04/24 职场文书
责任心演讲稿
2014/05/14 职场文书
校庆标语集锦
2014/06/25 职场文书
文秘自荐信
2014/06/28 职场文书
解除劳动合同协议书范本2014
2014/09/25 职场文书
全国法制宣传日活动总结2014
2014/11/01 职场文书
2015年勤工助学工作总结
2015/04/29 职场文书
电力安全学习心得体会
2016/01/18 职场文书
初中语文教学反思范文
2016/03/03 职场文书
村党总支部公开承诺书2016
2016/03/25 职场文书
python入门之算法学习
2021/04/22 Python
Go 语言下基于Redis分布式锁的实现方式
2021/06/28 Golang
《总之就是很可爱》新作短篇动画《总之就是很可爱~制服~》将于2022年夏天播出
2022/04/07 日漫
python模板入门教程之flask Jinja
2022/04/11 Python