[前端] 微信小程序下拉框组件使用方法

2035 0
王子 2022-10-21 15:42:15 | 显示全部楼层 |阅读模式
小程序有时需要使用下拉框选项,通常我会使用 picker 组件实现。pick 组件使用 mode 来区分类别,默认使用普通选择器就行。
除了上述方式,我们也可以通过自定义组件实现,代码如下:
  1. //index.js
  2. Component({
  3. /**
  4. * 组件的属性列表
  5. */
  6. properties: {
  7.   propArray: {
  8.    type: Array,
  9.   }
  10. },
  11. /**
  12. * 组件的初始数据
  13. */
  14. data: {
  15.   selectShow: false,//初始option不显示
  16.   selectText: "请选择",//初始内容
  17. },
  18. /**
  19. * 组件的方法列表
  20. */
  21. methods: {
  22.   //option的显示与否
  23.   selectToggle: function () {
  24.    var nowShow = this.data.selectShow;//获取当前option显示的状态
  25.    this.setData({
  26.     selectShow: !nowShow
  27.    })
  28.   },
  29.   //设置内容
  30.   setText: function (e) {
  31.    var nowData = this.properties.propArray;//当前option的数据是引入组件的页面传过来的,所以这里获取数据只有通过this.properties
  32.    var nowIdx = e.target.dataset.index;//当前点击的索引
  33.    var nowText = nowData[nowIdx].text || nowData[nowIdx].value || nowData[nowIdx];//当前点击的内容
  34.    //再次执行动画,注意这里一定,一定,一定是this.animation来使用动画
  35.    this.setData({
  36.     selectShow: false,
  37.     selectText: nowText,
  38.    })
  39.    this.triggerEvent('select', nowData[nowIdx])
  40.   }
  41. }
  42. })
复制代码
代码如下:
  1. <view class='ms-content-box'>
  2.   <view class='ms-content' bindtap='selectToggle'>
  3.     <view class='ms-text'>{{selectText}}</view>
  4.     <view class="{{selectShow ? 'icon-up' : 'icon-down'}}"></view>
  5.   </view>
  6.   <view class='ms-options' wx:if="{{selectShow}}">
  7.     <view wx:for="{{propArray}}" data-index="{{index}}" wx:key='index' class'ms-option' bindtap='setText'>{{item.text || item.value || item}}</view>
  8.   </view>
  9. </view>
复制代码
样式实现:
  1. /* components/single-dropdown-select/index.wxss */
  2. .ms-content-box {
  3. width: 120px;
  4. }
  5. .ms-content {
  6. border: 1px solid #e2e2e2;
  7. background: white;
  8. font-size: 16px;
  9. position: relative;
  10. height: 30px;
  11. line-height: 30px;
  12. }
  13. .ms-text {
  14. overflow: hidden;
  15. text-overflow: ellipsis;
  16. white-space: nowrap;
  17. padding: 0 40px 0 6px;
  18. font-size: 14px;
  19. }
  20. .ms-options {
  21. background: white;
  22. width: inherit;
  23. position: absolute;
  24. border: 1px solid #e2e2e2;
  25. border-top: none;
  26. box-sizing: border-box;
  27. z-index: 3;
  28. max-height: 120px;
  29. overflow: auto;
  30. }
  31. .ms-option {
  32. height: 30px;
  33. line-height: 30px;
  34. border-top: 1px solid #e2e2e2;
  35. padding: 0 6px;
  36. text-align: left;
  37. overflow: hidden;
  38. text-overflow: ellipsis;
  39. white-space: nowrap;
  40. font-size: 14px;
  41. }
  42. .ms-item:first-child {
  43. border-top: none;
  44. }
  45. .icon-right, .icon-down, .icon-up {
  46. display: inline-block;
  47. padding-right: 13rpx;
  48. position: absolute;
  49. right: 20rpx;
  50. top: 10rpx;
  51. }
  52. .icon-right::after, .icon-down::after, .icon-up::after {
  53. content: "";
  54. display: inline-block;
  55. position: relative;
  56. bottom: 2rpx;
  57. margin-left: 10rpx;
  58. height: 10px;
  59. width: 10px;
  60. border: solid #bbb;
  61. border-width: 2px 2px 0 0;
  62. }
  63. .icon-right::after {
  64. -webkit-transform: rotate(45deg);
  65. transform: rotate(45deg);
  66. }
  67. .icon-down::after {
  68. bottom: 14rpx;
  69. -webkit-transform: rotate(135deg);
  70. transform: rotate(135deg);
  71. }
  72. .icon-up::after {
  73. bottom: 0rpx;
  74. -webkit-transform: rotate(-45deg);
  75. transform: rotate(-45deg);
  76. }
复制代码
如何使用呢?首先在引用组件的页面,引入组件:
  1. {
  2. "usingComponents": {
  3.   "single-dropdown-select": "/components/single-dropdown-select/index"
  4. }
  5. }
复制代码
在页面中,直接使用 引入的组件,代码如下:
  1. <view>
  2.   <single-dropdown-select prop-array='{{selectArray}}' bind:select='select' />
  3. </view>
复制代码
同时传入数据和监听子组件向父组件传递的 select 方法。
  1. Page({
  2. data: {
  3.   selectArray: [{
  4.    "id": "10",
  5.    "value": "会计类"
  6.   }, {
  7.    "id": "21",
  8.    "text": "工程类"
  9.   }, '技术类', {'value': '其他'}]
  10. },
  11. select: function(e) {
  12.   console.log(e.detail)
  13. }
  14. })
复制代码
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持中国红客联盟。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

中国红客联盟公众号

联系站长QQ:5520533

admin@chnhonker.com
Copyright © 2001-2025 Discuz Team. Powered by Discuz! X3.5 ( 粤ICP备13060014号 )|天天打卡 本站已运行