微信小程序 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 学习书 推荐
Jun 13 Javascript
jquery ready函数、css函数及text()使用示例
Sep 27 Javascript
js实现带圆角的两级导航菜单效果代码
Aug 24 Javascript
基于JavaScript制作霓虹灯文字 代码 特效
Sep 01 Javascript
jquery表格datatables实例解析 直接加载和延迟加载
Aug 12 Javascript
js实现鼠标拖拽多选功能示例
Aug 01 Javascript
Bootstrap Table快速完美搭建后台管理系统
Sep 20 Javascript
bootstrap响应式工具使用详解
Nov 29 Javascript
vue+VeeValidate 校验范围实例详解(部分校验,全部校验)
Oct 19 Javascript
详解ES6 系列之异步处理实战
Oct 26 Javascript
js数组相减简单示例【删除a数组所有与b数组相同元素】
Mar 04 Javascript
React生命周期原理与用法踩坑笔记
Apr 28 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程序中防止盗链
2008/04/09 PHP
MySQL 日期时间函数常用总结
2012/06/12 PHP
使用php get_headers 判断URL是否有效的解决办法
2013/04/27 PHP
php使用curl模拟登录后采集页面的例子
2013/11/04 PHP
用js判断页面是否加载完成实现代码
2012/12/11 Javascript
利用javascript实现web页面中指定区域打印
2013/10/30 Javascript
jQuery构造函数init参数分析续
2015/05/13 Javascript
JavaScript代码轻松实现网页内容禁止复制(代码简单)
2015/10/23 Javascript
详谈javascript异步编程
2016/02/21 Javascript
简单理解vue中Props属性
2016/10/27 Javascript
JS实现的验证身份证及获取地区功能示例
2017/01/16 Javascript
angular+bootstrap的双向数据绑定实例
2017/03/03 Javascript
jQuery插件HighCharts绘制2D带有Legend的饼图效果示例【附demo源码下载】
2017/03/10 Javascript
Vue2.0权限树组件实现代码
2017/08/29 Javascript
浅谈es6语法 (Proxy和Reflect的对比)
2017/10/24 Javascript
基于Require.js使用方法(总结)
2017/10/26 Javascript
vue 2.5.1 源码学习 之Vue.extend 和 data的合并策略
2019/06/04 Javascript
Layui之table中的radio在切换分页时无法记住选中状态的解决方法
2019/09/02 Javascript
JS数据类型(基本数据类型、引用数据类型)及堆和栈的区别分析
2020/03/04 Javascript
vue中使用vue-print.js实现多页打印
2020/03/05 Javascript
vue项目如何监听localStorage或sessionStorage的变化
2021/01/04 Vue.js
Python中利用函数装饰器实现备忘功能
2015/03/30 Python
详解Python核心编程中的浅拷贝与深拷贝
2018/01/07 Python
python 脚本生成随机 字母 + 数字密码功能
2018/05/26 Python
python能做哪些生活有趣的事情
2020/09/09 Python
python热力图实现简单方法
2021/01/29 Python
瑰珀翠美国官网:Crabtree & Evelyn美国
2016/11/29 全球购物
微软中国官方商城:Microsoft Store中国
2018/10/12 全球购物
ddl,dml和dcl的含义
2016/05/08 面试题
深圳-东方伟业笔试部分
2015/02/11 面试题
旅游业大学生创业计划书
2014/01/31 职场文书
医科大学毕业生自荐信
2014/02/03 职场文书
人事部岗位职责范本
2014/03/05 职场文书
2014年应急工作总结
2014/12/11 职场文书
学校运动会开幕词
2016/03/03 职场文书
MySQL如何使备份得数据保持一致
2022/05/02 MySQL