微信小程序自定义下拉菜单组件

在这里插入图片描述在这里插入图片描述

WXML

<!-- components/menu/index.wxml -->
<view class="menuC">
    <view class="flex">
        <view wx:for="{{arr}}" wx:key="key" data-id='{{item.id}}' bindtap='showkindsof' class="title-wrap" style="width:{{item_Width}}">
            <view>{{item.content?item.content:item.title}}</view>
        </view>
    </view>
    <!-- mask -->
    <view bindtap='closekindof' class="mask" style="display:{{mask}}" catchtouchmove='{{true}}'></view>
    <!-- select -->
    <view class="select" style="height:{{select_height}}" catchtouchmove='{{true}}'>
        <view bindtap='confirm' wx:for="{{select_content}}" wx:for-item="item1" wx:key="key1" class="select-item" data-name='{{item1.name}}' data-id="{{item1.id}}">{{item1.name}}</view>
    </view>
</view>

WXSS

.menuC {
    border-top: 1rpx solid #E6E6E6;
    border-bottom: 1rpx solid #E6E6E6;
    position: relative;
    width: 100%;
}
.menuC .flex {
    width: 100%;
    display: flex;
    justify-content: space-around;
    align-items: center;
    font-size: 28rpx;
}
.menuC .title-wrap {
    flex-grow: 1;
    display: flex;
    justify-content: center;
    align-items: center;
    margin: 20rpx 0;
    border-left:1rpx solid #E6E6E6;
}
.menuC .mask {
    width: 100%;
    height: 100vh;
    position: absolute;
    background-color: black;
    opacity: .3;
    z-index:99;
}
.menuC .select {
    width: 100%;
    /* height: 300rpx; */
    position: absolute;
    background-color: white;
    z-index: 100;
    border-top: 1rpx solid #E6E6E6;
    overflow: auto;
    transition: all .3s ease;
}
.menuC .select-item {
    font-size:30rpx;
    padding:12rpx 0 12rpx 30rpx;
    border-bottom: 1rpx solid #eeeeee;
}

JS

// components/menu/index.js
Component({
  lifetimes: {
    attached: function() {
      console.log(this.data.arr.length)
      this.setData({
        item_Width:100/this.data.arr.length + '%'
      },()=>{
        console.log(this.data.item_Width)
      })
    }
  },
  /**
   * 组件的属性列表
   */
  properties: {
    arr:{
      type:Array,
      value:[
        {
          id:1,title:'待办类型',content:'',arr:[
            {id:101,name:'我负责的'},
            {id:102,name:'我参与的'},
            {id:103,name:'全部'}
          ]
        },
        {
          id:2,title:'待办状态',content:'',arr:[
            {id:201,name:'未完成'},
            {id:202,name:'已完成'},
            {id:203,name:'全部'}
          ]
        },
        {
          id:3,title:'优先级',content:'',arr:[
            {id:301,name:'低'},
            {id:302,name:'中'},
            {id:303,name:'高'},
            {id:304,name:'全部'}
          ]
        },
      ]
    },
  },

  // <picker-date></picker-date>

  /**
   * 组件的初始数据
   */
  data: {
    item_Width:'',
    select_height:'0rpx',
    mask:'none',
    select_content:[]
  },

  /**
   * 组件的方法列表
   */
  methods: {
    //选择具体事项
    confirm(options){
      console.log(options.currentTarget.dataset)
      let temparr = this.data.arr
      let id = options.currentTarget.dataset.id +''
      let fatherid = id.substring(0,1) 
      temparr.forEach(value=>{
        if(value.id == fatherid){
          if(options.currentTarget.dataset.name=='全部'){
            value.content = ''
            return value
          }
          value.content = options.currentTarget.dataset.name
          return value
        }else {
          return value
        }
      })
      this.setData({
        arr:temparr,
        select_height:'0rpx',
        mask:'none'
      },()=>{
        //调用外部方法
        this.triggerEvent('confirmout',options.currentTarget.dataset)
      })
      
    },
    //显示内容
    showkindsof(options){
      console.log(options.currentTarget.dataset.id)
      let tempid = options.currentTarget.dataset.id
      let temp = this.data.arr
      let temparr = []
      temp.forEach(value=>{
        if(tempid==value.id){
          temparr = value.arr
        }
      })
      this.setData({
        select_height:'300rpx',
        mask:'block',
        select_content:temparr
      },()=>{
        console.log(this.data.select_content)
      })
    },
    //隐藏内容
    closekindof(){
      this.setData({
        select_height:'0rpx',
        mask:'none'
      })
    },
  }
})

页面调用组件

WXML

<menu bind:confirmout="confirmout" arr="{{value}}"></menu>
<!-- 
    value模板
    value:[
        {
          id:1,title:'待办类型',content:'',arr:[
            {id:101,name:'我负责的'},
            {id:102,name:'我参与的'},
            {id:103,name:'全部'}
          ]
        },
        {
          id:2,title:'待办状态',content:'',arr:[
            {id:201,name:'未完成'},
            {id:202,name:'已完成'},
            {id:203,name:'全部'}
          ]
        },
        {
          id:3,title:'优先级',content:'',arr:[
            {id:301,name:'低'},
            {id:302,name:'中'},
            {id:303,name:'高'},
            {id:304,name:'全部'}
          ]
        },
      ] -->

JS

const app = getApp()
Page({
  data: {
    
  },
  //确定选择下拉菜单后执行的方法
  confirmout(params){
    console.log('params',params.detail)
  },
  
  onLoad() {
    
  },
})
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值