# tui-top-dropdown 顶部弹出层 开源组件

介绍

可自定义宽高,设置字体大小,阴影,圆角,镂空等,支持表单提交。

# 引入

# uni-app引入

第一种,手动引入(可全局引入)

import tuiTopDropdown from "@/components/thorui/tui-top-dropdown/tui-top-dropdown.vue"
export default {
	components:{
		tuiTopDropdown
	}
}

第二种,开启easycom组件模式,如果不了解如何配置,可先查看 官网文档 (opens new window)

# uni-app版本平台差异说明

App-Nvue App-vue H5 微信小程序 支付宝小程序 百度小程序 字节小程序 QQ小程序
升级中

# 微信小程序引入(可在app.json中全局引入)

{
  "usingComponents": {
    "tui-top-dropdown": "/components/thorui/tui-top-dropdown/tui-top-dropdown"
  }
}

# 代码演示

部分功能演示,具体可参考示例程序以及文档API。

基础使用

通过 show 属性控制组件显示隐藏, paddingbtm 属性设置容器 padding-bottom值 , translatey 属性设置下拉距离 ,close 为弹层关闭事件。

    <template>
      <view class="container">
      	<!--header-->
      	<view class="tui-header">
      		<view class="tui-header-top">
      			<view class="tui-top-item" @tap="screen">综合</view>
      			<view class="tui-top-item" @tap="screen">销量</view>
      			<view class="tui-top-item" @tap="screen">
      				<view>价格</view>
      				<view class="tui-price-arrow">
      					<view class="tui-icon-box tui-arrow-up">
      						<tui-icon name="turningup" :size="12" color="#444"></tui-icon>
      					</view>
      					<view class="tui-icon-box tui-arrow-down">
      						<tui-icon name="turningdown" :size="12" color="#444"></tui-icon>
      					</view>
    
      				</view>
      			</view>
      			<view class="tui-top-item tui-screen" @tap="screen">
      				<text class="tui-bold">筛选</text>
      				<tui-icon name="screen" :size="12" color="#5677fc" :bold="true"></tui-icon>
      			</view>
      		</view>
      		<view class="tui-header-bottom">
      			<view class="tui-bottom-item" :class="[proDropIndex==0?'tui-btmItem-active':'']" @tap="btnDropChange(0)">
      				<view class="tui-bottom-text" :class="[proDropIndex==0?'tui-active':'']">品牌</view>
      				<tui-icon :name="proDropIndex==0?'arrowup':'arrowdown'" :size="14" :color="proDropIndex==0?'#5677fc':'#444'"></tui-icon>
      			</view>
      			<view class="tui-bottom-item" :class="[proDropIndex==1?'tui-btmItem-active':'']" @tap="btnDropChange(1)">
      				<view class="tui-bottom-text" :class="[proDropIndex==1?'tui-active':'']">类型</view>
      				<tui-icon :name="proDropIndex==1?'arrowup':'arrowdown'" :size="14" :color="proDropIndex==1?'#5677fc':'#444'"></tui-icon>
      			</view>
      			<view class="tui-bottom-item" :class="[proDropIndex==2?'tui-btmItem-active':'']" @tap="btnDropChange(2)">
      				<view class="tui-bottom-text" :class="[proDropIndex==2?'tui-active':'']">适用手机</view>
      				<tui-icon :name="proDropIndex==2?'arrowup':'arrowdown'" :size="14" :color="proDropIndex==2?'#5677fc':'#444'"></tui-icon>
      			</view>
      		</view>
    
      	</view>
    
      	<!--header-->
    
      	<!--header 顶部下拉选择框-->
    
      	<tui-top-dropdown :show="dropShow" :paddingbtm="110" :translatey="216" @close="btnCloseDrop">
      		<scroll-view class="tui-scroll-box" scroll-y scroll-with-animation :scroll-top="scrollTop">
      			<view class="tui-seizeaseat-20"></view>
      			<view class="tui-drop-item" :class="[item.selected?'tui-bold':'']" v-for="(item,index) in proDropData" :key="index"
      			 @tap.stop="btnSelected" :data-index="index">
      				<tui-icon name="check" :size="16" color="#5677fc" :bold="true" v-if="item.selected"></tui-icon>
      				<text class="tui-ml tui-middle">{{item.name}}</text>
      			</view>
      			<view class="tui-seizeaseat-30"></view>
      		</scroll-view>
      		<view class="tui-drop-btnbox">
      			<view class="tui-drop-btn tui-button-white" hover-class="tui-button-white_hover" :hover-stay-time="150" @tap="reset">重置</view>
      			<view class="tui-drop-btn tui-button-primary" hover-class="tui-button-hover" :hover-stay-time="150" @tap="btnCloseDrop">确定</view>
      		</view>
      	</tui-top-dropdown>
      	<!--header 顶部下拉选择框-->
    
      	<view class="top-dropdown">
      		<tui-button type="white" shape="circle" @click="btnDropChange(0)">顶部下拉列表</tui-button>
      	</view>
      </view>
    </template>
    
    //uni-app script
    export default {
      data() {
      	return {
      		proDropList: [{
      			list: [{
      				name: "trendsetter",
      				selected: false
      			}, {
      				name: "维肯(Viken)",
      				selected: false
      			}, {
      				name: "AORO",
      				selected: false
      			}, {
      				name: "苏发",
      				selected: false
      			}, {
      				name: "飞花令(FHL)",
      				selected: false
      			}, {
      				name: "叶梦丝",
      				selected: false
      			}, {
      				name: "ITZOOM",
      				selected: false
      			}, {
      				name: "亿魅",
      				selected: false
      			}, {
      				name: "LEIKS",
      				selected: false
      			}, {
      				name: "雷克士",
      				selected: false
      			}, {
      				name: "蕊芬妮",
      				selected: false
      			}, {
      				name: "辉宏达",
      				selected: false
      			}, {
      				name: "英西达",
      				selected: false
      			}, {
      				name: "戴为",
      				selected: false
      			}, {
      				name: "魔风者",
      				selected: false
      			}, {
      				name: "即满",
      				selected: false
      			}, {
      				name: "北比",
      				selected: false
      			}, {
      				name: "娱浪",
      				selected: false
      			}, {
      				name: "搞怪猪",
      				selected: false
      			}]
      		}, {
      			list: [{
      				name: "线充套装",
      				selected: false
      			}, {
      				name: "单条装",
      				selected: false
      			}, {
      				name: "车载充电器",
      				selected: false
      			}, {
      				name: "PD快充",
      				selected: false
      			}, {
      				name: "数据线转换器",
      				selected: false
      			}, {
      				name: "多条装",
      				selected: false
      			}, {
      				name: "充电插头",
      				selected: false
      			}, {
      				name: "无线充电器",
      				selected: false
      			}, {
      				name: "座式充电器",
      				selected: false
      			}, {
      				name: "万能充",
      				selected: false
      			}, {
      				name: "转换器/转接线",
      				selected: false
      			}, {
      				name: "MFI苹果认证",
      				selected: false
      			}, {
      				name: "转换器",
      				selected: false
      			}, {
      				name: "苹果认证",
      				selected: false
      			}]
      		}, {
      			list: [{
      				name: "通用",
      				selected: false
      			}, {
      				name: "vivo",
      				selected: false
      			}, {
      				name: "OPPO",
      				selected: false
      			}, {
      				name: "魅族",
      				selected: false
      			}, {
      				name: "苹果",
      				selected: false
      			}, {
      				name: "华为",
      				selected: false
      			}, {
      				name: "三星",
      				selected: false
      			}, {
      				name: "荣耀",
      				selected: false
      			}, {
      				name: "诺基亚5",
      				selected: false
      			}, {
      				name: "荣耀4",
      				selected: false
      			}, {
      				name: "诺基",
      				selected: false
      			}, {
      				name: "荣耀",
      				selected: false
      			}, {
      				name: "诺基亚2",
      				selected: false
      			}, {
      				name: "荣耀2",
      				selected: false
      			}, {
      				name: "诺基",
      				selected: false
      			}]
      		}],
      		proDropData: [],
      		proDropIndex: -1,
      		dropShow: false,
      		scrollTop: 0
      	}
      },
      methods: {
      	btnDropChange(index) {
      		this.proDropData = [...this.proDropList[index].list];
      		this.proDropIndex = index;
      		this.dropShow = true;
      		this.dropdownShow=false
      	},
      	btnSelected: function(e) {
      		let index = e.currentTarget.dataset.index;
      		let obj = this.proDropData[index];
      		this.$set(obj, 'selected', !obj.selected)
      	},
      	reset() {
      		let arr = this.proDropData;
      		for (let item of arr) {
      			item.selected = false;
      		}
      		this.proDropData = arr
      	},
      	btnCloseDrop() {
      		this.scrollTop = 1;
      		this.$nextTick(() => {
      			this.scrollTop = 0
      		});
      		this.dropShow = false;
      		this.proDropIndex = -1;
      		this.reset()
      	},
      	screen() {
      		//this.tui.xxx 等api 查看【快速上手】文档使用
      		this.tui.toast("商城模板中功能~")
      	}
      }
    }
    
    /*  uni-app style */
     
    /* 隐藏scroll-view滚动条*/
      ::-webkit-scrollbar {
      	width: 0;
      	height: 0;
      	color: transparent;
      }
    
      /*header*/
      .tui-header {
      	width: 100%;
      	padding-top: 34rpx;
      	/* box-shadow: 0 15rpx 10rpx -15rpx #f2f2f2; */
      	box-sizing: border-box;
      	background-color: #fff;
      	position: fixed;
      	z-index: 1000;
      }
    
      .tui-header-top,
      .tui-header-bottom {
      	display: flex;
      	align-items: center;
      	justify-content: space-between;
      	font-size: 26rpx;
      	color: #333;
      }
    
      .tui-top-item {
      	height: 26rpx;
      	line-height: 26rpx;
      	flex: 1;
      	display: flex;
      	align-items: center;
      	justify-content: center;
      }
    
      .tui-topitem-active {
      	position: relative;
      	font-weight: bold;
      }
    
      .tui-topitem-active::after {
      	content: '';
      	position: absolute;
      	width: 44rpx;
      	height: 6rpx;
      	background: #5677fc;
      	border-radius: 6rpx;
      	bottom: -10rpx;
      	left: 50%;
      	-webkit-transform: translateX(-50%);
      	transform: translateX(-50%);
      }
    
      .tui-price-arrow {
      	display: flex;
      	flex-direction: column;
      	align-items: center;
      	justify-content: center;
      	height: 20rpx;
      }
    
      .tui-bottom-item .tui-icon-class,
      .tui-screen .tui-icon-class {
      	margin-left: 6rpx;
      }
    
      .tui-icon-box {
      	line-height: 12px !important;
      	padding: 0 !important;
      	display: block !important;
      	position: relative;
      }
    
      .tui-arrow-up {
      	top: 5px;
      }
    
      .tui-arrow-down {
      	top: -3px;
      }
    
      .tui-header-bottom {
      	margin-top: 56rpx;
      	height: 108rpx;
      	padding: 0 30rpx;
      	box-sizing: border-box;
      	font-size: 24rpx;
      	align-items: flex-start;
      	overflow: hidden;
      }
    
      .tui-bottom-text {
      	line-height: 24rpx;
      }
    
      .tui-bottom-item {
      	flex: 1;
      	display: inline-flex;
      	align-items: center;
      	justify-content: center;
      	padding: 18rpx 12rpx;
      	border-radius: 40rpx;
      	box-sizing: border-box;
      	background: #f2f2f2;
      	margin-right: 20rpx;
      	white-space: nowrap;
      }
    
      .tui-bottom-item:last-child {
      	margin-right: 0;
      }
    
      .tui-btmItem-active {
      	padding-bottom: 60rpx;
      	border-bottom-left-radius: 0;
      	border-bottom-right-radius: 0;
      }
    
      .tui-bold {
      	font-weight: bold;
      }
    
      .tui-active {
      	color: #5677fc;
      }
    
      .tui-ml {
      	margin-left: 6rpx;
      }
    
      .tui-seizeaseat-20 {
      	height: 20rpx;
      }
    
      .tui-seizeaseat-30 {
      	height: 30rpx;
      }
    
      .tui-middle {
      	vertical-align: middle;
      }
    
      .tui-drop-item .tui-icon-class {
      	vertical-align: middle;
      }
    
      /*header*/
    
      
      .top-dropdown {
      	margin-top: 360rpx;
      	padding: 0 40rpx;
      	box-sizing: border-box;
      }
    
    <!-- 使用到的组件请自行在json中进行引入 -->
    <view class="container">
      <!--header-->
      <view class="tui-header">
        <view class="tui-header-top">
          <view class="tui-top-item" bindtap="screen">综合</view>
          <view class="tui-top-item" bindtap="screen">销量</view>
          <view class="tui-top-item" bindtap="screen">
            <view>价格</view>
            <view class="tui-price-arrow">
              <view class="tui-icon-box tui-arrow-up">
                <tui-icon name="turningup" size="{{12}}" color="#444"></tui-icon>
              </view>
              <view class="tui-icon-box tui-arrow-down">
                <tui-icon name="turningdown" size="{{12}}" color="#444"></tui-icon>
              </view>
    
            </view>
          </view>
          <view class="tui-top-item tui-screen" bindtap="screen">
            <text class="tui-bold">筛选</text>
            <tui-icon name="screen" size="{{12}}" color="#5677fc" bold="{{true}}"></tui-icon>
          </view>
        </view>
        <view class="tui-header-bottom">
          <view class="tui-bottom-item {{proDropIndex==0?'tui-btmItem-active':''}}" data-index="0" bindtap="btnDropChange">
            <view class="tui-bottom-text {{proDropIndex==0?'tui-active':''}}">品牌</view>
            <tui-icon name="{{proDropIndex==0?'arrowup':'arrowdown'}}" size="{{14}}" color="{{proDropIndex==0?'#5677fc':'#444'}}"></tui-icon>
          </view>
          <view class="tui-bottom-item {{proDropIndex==1?'tui-btmItem-active':''}}" bindtap="btnDropChange" data-index="1">
            <view class="tui-bottom-text {{proDropIndex==1?'tui-active':''}}">类型</view>
            <tui-icon name="{{proDropIndex==1?'arrowup':'arrowdown'}}" size="14" color="{{proDropIndex==1?'#5677fc':'#444'}}"></tui-icon>
          </view>
          <view class="tui-bottom-item {{proDropIndex==2?'tui-btmItem-active':''}}" bindtap="btnDropChange" data-index="2">
            <view class="tui-bottom-text {{proDropIndex==2?'tui-active':''}}">适用手机</view>
            <tui-icon name="{{proDropIndex==2?'arrowup':'arrowdown'}}" size="14" color="{{proDropIndex==2?'#5677fc':'#444'}}"></tui-icon>
          </view>
        </view>
    
      </view>
    
      <!--header-->
    
      <!--header 顶部下拉选择框-->
    
      <tui-top-dropdown show="{{dropShow}}" paddingbtm="110" translatey="216" bindclose="btnCloseDrop">
        <scroll-view class="tui-scroll-box" scroll-y scroll-with-animation scroll-top="{{scrollTop}}">
          <view class="tui-seizeaseat-20"></view>
          <view class="tui-drop-item {{item.selected?'tui-bold':''}}" wx:for="{{proDropData}}" wx:key="index" catchtap="btnSelected" data-index="{{index}}">
            <tui-icon name="check" size="16" color="#5677fc" bold="{{true}}" wx:if="{{item.selected}}"></tui-icon>
            <text class="tui-ml tui-middle">{{item.name}}</text>
          </view>
          <view class="tui-seizeaseat-30"></view>
        </scroll-view>
        <view class="tui-drop-btnbox">
          <view class="tui-drop-btn tui-button-white" hover-class="tui-button-white_hover" hover-stay-time="150" bindtap="reset">重置</view>
          <view class="tui-drop-btn tui-button-primary" hover-class="tui-button-hover" hover-stay-time="150" bindtap="btnCloseDrop">确定</view>
        </view>
      </tui-top-dropdown>
      <!--header 顶部下拉选择框-->
    
      <view class="top-dropdown">
        <tui-button type="white" shape="circle" bindtap="btnDropChange" data-index="0">顶部下拉列表</tui-button>
      </view>
    </view>
    
    //请确保项目中引入了该js且路径正确
    import tui from '../../../common/httpRequest'
    Page({
      data: {
        proDropList: [{
          list: [{
            name: "trendsetter",
            selected: false
          }, {
            name: "维肯(Viken)",
            selected: false
          }, {
            name: "AORO",
            selected: false
          }, {
            name: "苏发",
            selected: false
          }, {
            name: "飞花令(FHL)",
            selected: false
          }, {
            name: "叶梦丝",
            selected: false
          }, {
            name: "ITZOOM",
            selected: false
          }, {
            name: "亿魅",
            selected: false
          }, {
            name: "LEIKS",
            selected: false
          }, {
            name: "雷克士",
            selected: false
          }, {
            name: "蕊芬妮",
            selected: false
          }, {
            name: "辉宏达",
            selected: false
          }, {
            name: "英西达",
            selected: false
          }, {
            name: "戴为",
            selected: false
          }, {
            name: "魔风者",
            selected: false
          }, {
            name: "即满",
            selected: false
          }, {
            name: "北比",
            selected: false
          }, {
            name: "娱浪",
            selected: false
          }, {
            name: "搞怪猪",
            selected: false
          }]
        }, {
          list: [{
            name: "线充套装",
            selected: false
          }, {
            name: "单条装",
            selected: false
          }, {
            name: "车载充电器",
            selected: false
          }, {
            name: "PD快充",
            selected: false
          }, {
            name: "数据线转换器",
            selected: false
          }, {
            name: "多条装",
            selected: false
          }, {
            name: "充电插头",
            selected: false
          }, {
            name: "无线充电器",
            selected: false
          }, {
            name: "座式充电器",
            selected: false
          }, {
            name: "万能充",
            selected: false
          }, {
            name: "转换器/转接线",
            selected: false
          }, {
            name: "MFI苹果认证",
            selected: false
          }, {
            name: "转换器",
            selected: false
          }, {
            name: "苹果认证",
            selected: false
          }]
        }, {
          list: [{
            name: "通用",
            selected: false
          }, {
            name: "vivo",
            selected: false
          }, {
            name: "OPPO",
            selected: false
          }, {
            name: "魅族",
            selected: false
          }, {
            name: "苹果",
            selected: false
          }, {
            name: "华为",
            selected: false
          }, {
            name: "三星",
            selected: false
          }, {
            name: "荣耀",
            selected: false
          }, {
            name: "诺基亚5",
            selected: false
          }, {
            name: "荣耀4",
            selected: false
          }, {
            name: "诺基",
            selected: false
          }, {
            name: "荣耀",
            selected: false
          }, {
            name: "诺基亚2",
            selected: false
          }, {
            name: "荣耀2",
            selected: false
          }, {
            name: "诺基",
            selected: false
          }]
        }],
        proDropData: [],
        proDropIndex: -1,
        dropShow: false,
        scrollTop: 0
      },
      btnDropChange(e) {
        let index=Number(e.currentTarget.dataset.index)
        this.setData({
          proDropData: [...this.data.proDropList[index].list],
          proDropIndex:index,
          dropShow:true,
          dropdownShow:false
        })
      },
      btnSelected: function (e) {
        let index = e.currentTarget.dataset.index;
        let obj = this.data.proDropData[index];
        let key = `proDropData[${index}].selected`
        this.setData({
          [key]: !obj.selected
        })
      },
      reset() {
        let arr = this.data.proDropData;
        for (let item of arr) {
          item.selected = false;
        }
        this.setData({
          proDropData: arr
        })
      },
      btnCloseDrop() {
        this.setData({
          scrollTop: 0,
          dropShow: false,
          proDropIndex: -1
        })
        this.reset()
      },
      screen() {
        tui.toast("商城模板中功能~")
      }
    })
    
     /* 同 uni-app css */
    
    // Make sure to add code blocks to your code group

    # Slots

    插槽名称 说明
    default 顶部弹出层中显示内容,内容过多可与scroll-view结合使用

    # Props

    属性名 类型 说明 默认值
    mask Boolean 是否需要遮罩 true
    show Boolean 控制显示 false
    backgroundColor String 弹层背景颜色 #f2f2f2
    paddingbtm Number padding-bottom 单位rpx 0
    height Number 高度 单位rpx 580
    translatey Number 移动距离,下拉距离 单位rpx 0

    # Events

    注:uni-app端绑定事件使用@前缀,如@close;微信小程序原生使用bind前缀,如bindclose

    事件名 说明 回调参数
    close 关闭弹层时触发 {}

    # 预览

    # 特别说明

    • 该组件为 开源组件,uni-app版所有用户均可免费使用。
    • 微信小程序原生版仅开源至v1.4.2,后续版本需开通会员才可获取使用。

    # 线上程序扫码预览

    ThorUI组件库 H5二维码 ThorUI示例
    ThorUI组件库小程序码 H5二维码 ThorUI示例小程序码
    Last Updated: 7/21/2023, 2:12:46 PM