微信小程序 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 相关文章推荐
发两个小东西,ASP/PHP 学习工具。 用JavaScript写的
Apr 12 Javascript
parseInt parseFloat js字符串转换数字
Aug 01 Javascript
JS事件在IE与FF中的区别详细解析
Nov 20 Javascript
如何从jQuery的ajax请求中删除X-Requested-With
Dec 11 Javascript
jQuery预加载图片常用方法
Jun 15 Javascript
JS实现浏览器状态栏文字从右向左弹出效果代码
Oct 27 Javascript
jquery实现(textarea)placeholder自动换行
Dec 22 Javascript
D3.js进阶系列之CSV表格文件的读取详解
Jun 06 Javascript
Vue实现带进度条的文件拖动上传功能
Feb 23 Javascript
jQuery+Cookie实现切换皮肤功能【附源码下载】
Mar 25 jQuery
一些你可能不熟悉的JS知识点总结
Mar 15 Javascript
js实现简单掷骰子小游戏
Oct 24 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
微信API接口大全
2015/04/15 PHP
微信access_token的获取开发示例
2015/04/16 PHP
PHP SplObjectStorage使用实例
2015/05/12 PHP
PHP封装的page分页类定义与用法完整示例
2018/12/24 PHP
js 深拷贝函数
2008/12/04 Javascript
jQuery 判断元素上是否绑定了事件
2009/10/28 Javascript
jQuery事件绑定和委托实例
2014/11/25 Javascript
js简单实现点击左右运动的方法
2015/04/10 Javascript
jQuery中的通配符选择器使用总结
2016/05/30 Javascript
浅谈js在html中的加载执行顺序,多个jquery ready执行顺序
2016/11/26 Javascript
清除浏览器缓存的几种方法总结(必看)
2016/12/09 Javascript
Webpack框架核心概念(知识点整理)
2017/12/22 Javascript
使用 JavaScript 创建并下载文件(模拟点击)
2019/10/25 Javascript
[09:37]DOTA2卡尔工作室 英雄介绍圣堂刺客篇
2013/06/13 DOTA
[02:05]2014DOTA2国际邀请赛 BBC外卡赛赛后总结
2014/07/09 DOTA
python检测lvs real server状态
2014/01/22 Python
使用Python脚本生成随机IP的简单方法
2015/07/30 Python
Python实现文件内容批量追加的方法示例
2017/08/29 Python
Python网络编程详解
2017/10/31 Python
django 多数据库配置教程
2018/05/30 Python
Selenium chrome配置代理Python版的方法
2018/11/29 Python
python中pytest收集用例规则与运行指定用例详解
2019/06/27 Python
python numpy库linspace相同间隔采样的实现
2020/02/25 Python
Python中格式化字符串的四种实现
2020/05/26 Python
recorder.js 基于Html5录音功能的实现
2020/05/26 HTML / CSS
AmazeUI底部导航栏与分享按钮的示例代码
2020/08/18 HTML / CSS
印度尼西亚最大的电商平台:Tokopedia(印尼版淘宝)
2017/12/02 全球购物
TripAdvisor瑞典:全球领先的旅游网站
2017/12/11 全球购物
美国高品质个性化珠宝销售网站:Jewlr
2018/05/03 全球购物
澳大利亚工具仓库:Tools Warehouse
2018/10/15 全球购物
HOTEL INFO英国:搜索全球酒店
2019/08/08 全球购物
益模软件Java笔试题
2012/03/27 面试题
珍珠奶茶店创业计划书
2014/01/11 职场文书
青年安全生产示范岗事迹材料
2014/05/04 职场文书
导游词之安徽九华山
2019/09/18 职场文书
2020年基层司法所建设情况调研报告
2019/11/30 职场文书