微信小程序 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 相关文章推荐
新手入门常用代码集锦
Jan 11 Javascript
javascript js cookie的存储,获取和删除
Dec 29 Javascript
js取消单选按钮选中示例代码
Nov 14 Javascript
js触发select onchange事件的小技巧
Aug 05 Javascript
node.js中的querystring.escape方法使用说明
Dec 10 Javascript
jQuery中Ajax的get、post等方法详解
Jan 20 Javascript
很酷的星级评分系统原生JS实现
Aug 25 Javascript
JavaScript中如何使用cookie实现记住密码功能及cookie相关函数介绍
Nov 10 Javascript
JS中append字符串包含onclick无效传递参数失败的解决方案
Dec 26 Javascript
js获取地址栏中传递的参数(两种方法)
Feb 08 Javascript
javascript变量提升和闭包理解
Mar 12 Javascript
Vue Element plus使用方法梳理
Dec 24 Vue.js
移动端手指操控左右滑动的菜单
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-Fcgi下PHP的执行时间设置方法
2013/08/02 PHP
PHP对象克隆clone用法示例
2016/09/28 PHP
PHP 搜索查询功能实现
2016/11/29 PHP
用javascript动态调整iframe高度的代码
2007/04/10 Javascript
javascript setTimeout和setInterval计时的区别详解
2013/06/21 Javascript
禁止拷贝网页内容的js代码
2014/01/22 Javascript
JS判断两个时间大小的示例代码
2014/01/28 Javascript
jQuery获取和设置表单元素的方法
2014/02/14 Javascript
JavaScript调用ajax获取文本文件内容实现代码
2014/03/28 Javascript
下一代Bootstrap的5个特点 超酷炫!
2016/06/17 Javascript
JavaScipt选取文档元素的方法(推荐)
2016/08/05 Javascript
用Angular实时获取本地Localstorage数据,实现一个模拟后台数据登入的效果
2016/11/09 Javascript
nodejs集成sqlite使用示例
2017/06/05 NodeJs
AngularJS中filter的使用实例详解
2017/08/25 Javascript
ES6中Array.find()和findIndex()函数的用法详解
2017/09/16 Javascript
angularjs实现天气预报功能
2020/06/16 Javascript
JavaScript实现JSON合并操作示例【递归深度合并】
2018/09/07 Javascript
vue-cli 项目打包完成后运行文件路径报错问题
2019/07/19 Javascript
javascript面向对象程序设计实践常用知识点总结
2019/07/29 Javascript
vue 验证码界面实现点击后标灰并设置div按钮不可点击状态
2019/10/28 Javascript
Python装饰器基础详解
2016/03/09 Python
python 使用 requests 模块发送http请求 的方法
2018/12/09 Python
PYTHON如何读取和写入EXCEL里面的数据
2019/10/28 Python
Python socket连接中的粘包、精确传输问题实例分析
2020/03/24 Python
django模板获取list中指定索引的值方式
2020/05/14 Python
Python 如何创建一个简单的REST接口
2020/07/30 Python
Python爬虫scrapy框架Cookie池(微博Cookie池)的使用
2021/01/13 Python
HTML5 Canvas实现文本对齐的方法总结
2016/03/24 HTML / CSS
护理专业的自荐信
2013/10/22 职场文书
工商管理实习生自我鉴定范文
2013/12/18 职场文书
大一军训感言
2014/01/09 职场文书
大学生先进事迹材料
2014/02/16 职场文书
公司财务经理岗位职责
2015/04/08 职场文书
2015年第31个教师节致辞
2015/07/31 职场文书
辞职信怎么写?
2019/05/21 职场文书
教学工作总结范文5篇
2019/08/19 职场文书