该组件必须结合u-dorpdown和u-dropdown-item一起使用,展开的内容由u-dropdown-item通过传递参数或者slot提供
u-dropdown-item每个独立下拉菜单
组件的菜单栏标题由u-dropdown-item通过title参数提供
u-dropdown-item带有默认的单选展示功能,通过options(见下方说明)配置,传入slot则会覆盖默认功能,通过v-model双向绑定options选中项的value值
<template> <view class="container container21094"> <view class="flex diygw-dropdown diygw-col-24"> <u-dropdown class="flex-sub" direction="down" ref="refDropdowns"> <u-dropdown-item @change="changeDropdowns0" v-model="dropdowns0" title="菜单一" :options="dropdownsDatas0"></u-dropdown-item> <u-dropdown-item @change="changeDropdowns1" v-model="dropdowns1" title="菜单二" :options="dropdownsDatas1"></u-dropdown-item> </u-dropdown> </view> <view class="clearfix"></view> </view> </template> <script> export default { data() { return { //用户全局信息 userInfo: {}, //页面传参 globalOption: {}, //自定义全局变量 globalData: {}, dropdowns0: '', dropdowns1: '', dropdownsDatas0: [ { text: '全部商品', value: '0' }, { text: '新款商品', value: '1' }, { text: '活动商品', value: '2' } ], dropdownsDatas1: [ { text: '默认排序', value: '0' }, { text: '好评排序', value: '1' }, { text: '销量排序', value: '2' } ] }; }, onShow() { this.setCurrentPage(this); }, onLoad(option) { this.setCurrentPage(this); if (option) { this.setData({ globalOption: this.getOption(option) }); } this.init(); }, methods: { async init() {}, closeDropdowns() { this.$refs.refDropdowns.close(); }, changeDropdowns0(evt) { let item = this.dropdownsDatas0.find((item) => { return item.value == evt; }); item && item.action && this.navigateTo(item.action); }, changeDropdowns1(evt) { let item = this.dropdownsDatas1.find((item) => { return item.value == evt; }); item && item.action && this.navigateTo(item.action); } } }; </script> <style lang="scss" scoped> .container21094 { } </style>
配置选项卡默认功能
如上所示,u-dropdown-item具有默认的单选功能,这里主要讲解其options和v-model参数:
options参数为一个数组,元素为对象,其中label为需要展示的提示文字,value为点击时双向绑定给v-model的值,v-model初始化时如果设置 某个options中的value,则该条目将会被默认选中:
配置选项卡自定义功能
在选项卡默认的单选功能无法满足的时候,我们可以给u-dropw-item传递slot来自定义需要展示的内容。
价格区间下拉菜单的设计
户型下拉设计
生成源码效果
查看源码
<template> <view class="container container21094"> <u-form :model="form" :rules="formRules" :errorType="['message', 'toast']" ref="formRef" class="flex diygw-form diygw-col-24"> <view class="flex diygw-dropdown diygw-col-24"> <u-dropdown class="flex-sub" direction="down" ref="refDropdowns"> <u-dropdown-item title="价格"> <view class="bg-white"> <view class="flex flex-wrap diygw-col-24 flex-direction-column"> <text class="diygw-col-24 text1-clz"> 价格区间(万) </text> <view class="flex diygw-col-24 items-center flex-nowrap flex1-clz"> <u-form-item class="diygw-col-0 start-clz diygw-form-item-notpadding" labelPosition="top" prop="start"> <u-input :focus="formData.startFocus" placeholder="请输入最低价格" v-model="form.start"></u-input> </u-form-item> <text class="diygw-col-0 text-clz"> 至 </text> <u-form-item class="diygw-col-0 end-clz diygw-form-item-notpadding" labelPosition="top" prop="end"> <u-input :focus="formData.endFocus" placeholder="请输入最高价格" v-model="form.end"></u-input> </u-form-item> </view> <u-form-item labelWidth="auto" class="diygw-col-24 ucheckbox2-clz diygw-form-item-notpadding" labelPosition="top" prop="ucheckbox2"> <diy-checkbox class="diygw-col-24" activeColor="#ff5c47" activeBgColor="#ffecee" mode="radio" v-model="form.ucheckbox2" :list="formData.ucheckbox2Datas" @change="changeFormUcheckbox2"> </diy-checkbox> </u-form-item> <view class="flex flex-wrap diygw-col-24 flex2-clz"> <button @click="resetForm" class="diygw-col-8 btn-clz diygw-btn-default">重置</button> <button @click="submitForm" class="diygw-col-0 btn1-clz diygw-btn-default">确定</button> </view> </view> <view class="clearfix"></view> </view> </u-dropdown-item> <u-dropdown-item title="户型"> <view class="bg-white"> <view class="flex flex-wrap diygw-col-24 flex-direction-column"> <u-form-item labelWidth="auto" class="diygw-col-24 ucheckbox-clz diygw-form-item-notpadding" label="居室" labelPosition="top" prop="ucheckbox"> <diy-checkbox class="diygw-col-24" activeColor="#ff5c47" activeBgColor="#ffecee" mode="checkbox" v-model="form.ucheckbox" :list="formData.ucheckboxDatas" @change="changeFormUcheckbox"> </diy-checkbox> </u-form-item> <u-form-item labelWidth="auto" class="diygw-col-24 ucheckbox3-clz diygw-form-item-notpadding" label="居室" labelPosition="top" prop="ucheckbox3"> <diy-checkbox class="diygw-col-24" activeColor="#ff5c47" activeBgColor="#ffecee" mode="checkbox" v-model="form.ucheckbox3" :list="formData.ucheckbox3Datas" @change="changeFormUcheckbox3"> </diy-checkbox> </u-form-item> <u-form-item labelWidth="auto" class="diygw-col-24 ucheckbox1-clz diygw-form-item-notpadding" label="卫生间" labelPosition="top" prop="ucheckbox1"> <diy-checkbox class="diygw-col-24" activeColor="#ff5c47" activeBgColor="#ffecee" mode="checkbox" v-model="form.ucheckbox1" :list="formData.ucheckbox1Datas" @change="changeFormUcheckbox1"> </diy-checkbox> </u-form-item> <view class="flex flex-wrap diygw-col-24 flex3-clz"> <button @click="resetForm" class="diygw-col-8 btn2-clz diygw-btn-default">重置</button> <button @click="submitForm" class="diygw-col-0 btn3-clz diygw-btn-default">确定</button> </view> </view> <view class="clearfix"></view> </view> </u-dropdown-item> <u-dropdown-item title="排序"> <view class="bg-white"> <view class="flex flex-wrap diygw-col-24 flex-direction-column"> <u-form-item class="diygw-col-24 sortby-clz" labelPosition="top" prop="sortby"> <u-radio-group iconPlacement="right" class="flex flex-wrap diygw-col-24 justify-between" wrapClass=" justify-between" v-model="form.sortby" :iconSize="16"> <u-radio activeImg="/static/g.png" img="/static/g1.png" class="diygw-col-24" shape="circle" v-for="(sortbyitem, sortbyindex) in formData.sortbyDatas" :key="sortbyindex" :name="sortbyitem.value"> {{ sortbyitem.label }} </u-radio> </u-radio-group> </u-form-item> <view class="flex flex-wrap diygw-col-24 flex6-clz"> <button @click="resetForm" class="diygw-col-8 btn4-clz diygw-btn-default">重置</button> <button @click="submitForm" class="diygw-col-0 btn5-clz diygw-btn-default">确定</button> </view> </view> <view class="clearfix"></view> </view> </u-dropdown-item> </u-dropdown> </view> </u-form> <view class="clearfix"></view> </view> </template> <script> export default { data() { return { //用户全局信息 userInfo: {}, //页面传参 globalOption: {}, //自定义全局变量 globalData: {}, dropdowns0: '', dropdowns1: '', dropdowns2: '', dropdownsDatas0: [ { text: '', value: '0' }, { text: '新款商品', value: '1' }, { text: '活动商品', value: '2' } ], dropdownsDatas1: [ { text: '默认排序', value: '0' }, { text: '好评排序', value: '1' }, { text: '销量排序', value: '2' } ], dropdownsDatas2: [ { text: '综合排序', value: '0' }, { text: '总价从低至高', value: '1' }, { text: '总价从高至低', value: '2' } ], form: { start: '', end: '', ucheckbox2: '', ucheckbox: [], ucheckbox3: [], ucheckbox1: [], sortby: '1' }, formRules: {}, formData: { startFocus: false, endFocus: false, ucheckbox2Datas: [ { value: '-1', label: '不限', disabled: false }, { value: '2', label: '50万以下', disabled: false }, { value: '3', label: '50-80万', disabled: false }, { value: '4', label: '80-100万', disabled: false }, { value: '5', label: '100-150万', disabled: false }, { value: '6', label: '150-200万', disabled: false }, { value: '7', label: '200-300万', disabled: false }, { value: '8', label: '300万以上', disabled: false } ], ucheckboxDatas: [ { value: '1', label: '一室', disabled: false }, { value: '2', label: '二室', disabled: false }, { value: '3', label: '三室', disabled: false }, { value: '4', label: '四室', disabled: false }, { value: '5', label: '五室', disabled: false }, { value: '6', label: '五室以上', disabled: false } ], ucheckbox3Datas: [ { value: '1', label: '一室', disabled: false }, { value: '2', label: '二室', disabled: false }, { value: '3', label: '三室', disabled: false }, { value: '4', label: '四室', disabled: false }, { value: '5', label: '五室', disabled: false }, { value: '6', label: '五室以上', disabled: false } ], ucheckbox1Datas: [ { value: '1', label: '一卫', disabled: false }, { value: '2', label: '二卫', disabled: false }, { value: '3', label: '三卫', disabled: false }, { value: '4', label: '四卫', disabled: false }, { value: '5', label: '五卫', disabled: false }, { value: '6', label: '五卫以上', disabled: false } ], sortbyDatas: [ { value: '1', label: '综合排序', checked: true }, { value: '2', label: '总价从低至高', checked: false }, { value: '3', label: '总价从高至低', checked: false }, { value: '4', label: '单价从低至高', checked: false }, { value: '5', label: '单价从高至低', checked: false } ] } }; }, onShow() { this.setCurrentPage(this); }, onLoad(option) { this.setCurrentPage(this); if (option) { this.setData({ globalOption: this.getOption(option) }); } this.init(); }, onReady() { this.$refs.formRef?.setRules(this.formRules); }, methods: { async init() { await this.initResetform(); }, closeDropdowns() { this.$refs.refDropdowns.close(); }, changeDropdowns0(evt) { let item = this.dropdownsDatas0.find((item) => { return item.value == evt; }); item && item.action && this.navigateTo(item.action); }, changeDropdowns1(evt) { let item = this.dropdownsDatas1.find((item) => { return item.value == evt; }); item && item.action && this.navigateTo(item.action); }, changeDropdowns2(evt) { let item = this.dropdownsDatas2.find((item) => { return item.value == evt; }); item && item.action && this.navigateTo(item.action); }, changeFormUcheckbox2(evt) {}, changeFormUcheckbox(evt) {}, changeFormUcheckbox3(evt) {}, changeFormUcheckbox1(evt) {}, initResetform() { this.initform = JSON.stringify(this.form); }, resetForm() { this.form = JSON.parse(this.initform); }, async submitForm(e) { this.$refs.formRef?.setRules(this.formRules); this.$nextTick(async () => { let valid = await this.$refs.formRef.validate(); if (valid) { //保存数据 let param = this.form; let header = {}; let url = ''; if (!url) { this.showToast('请先配置表单提交地址', 'none'); return false; } let res = await this.$http.post(url, param, header, 'json'); if (res.code == 200) { this.showToast(res.msg, 'success'); } else { this.showModal(res.msg, '提示', false); } } else { console.log('验证失败'); } }); } } }; </script> <style lang="scss" scoped> .text1-clz { padding-top: 20rpx; font-weight: bold; padding-left: 20rpx; font-size: 28rpx !important; padding-bottom: 20rpx; padding-right: 20rpx; } .flex1-clz { padding-top: 20rpx; padding-left: 20rpx; padding-bottom: 20rpx; padding-right: 20rpx; } .start-clz { flex: 1; } .text-clz { padding-top: 10rpx; font-weight: bold; padding-left: 20rpx; font-size: 28rpx !important; padding-bottom: 10rpx; padding-right: 20rpx; } .end-clz { flex: 1; } .ucheckbox2-clz { padding-top: 20rpx; padding-left: 20rpx; padding-bottom: 20rpx; padding-right: 20rpx; } .flex2-clz { padding-top: 20rpx; padding-left: 20rpx; padding-bottom: 20rpx; padding-right: 20rpx; } .btn-clz { background-color: #e2e2e2; padding-top: 20rpx; border-bottom-left-radius: 12rpx; overflow: hidden; color: #080808; padding-left: 20rpx; padding-bottom: 20rpx; border-top-left-radius: 12rpx; border-top-right-radius: 12rpx; border-bottom-right-radius: 12rpx; text-align: center; padding-right: 20rpx; } .btn1-clz { padding-top: 20rpx; border-bottom-left-radius: 12rpx; color: #fff; padding-left: 20rpx; padding-bottom: 20rpx; border-top-right-radius: 12rpx; margin-right: 0rpx; background-color: #ff5c47; margin-left: 10rpx; overflow: hidden; flex: 1; border-top-left-radius: 12rpx; margin-top: 0rpx; border-bottom-right-radius: 12rpx; margin-bottom: 0rpx; text-align: center; padding-right: 20rpx; } .ucheckbox-clz { padding-top: 20rpx; padding-left: 20rpx; padding-bottom: 20rpx; padding-right: 20rpx; } .ucheckbox3-clz { padding-top: 20rpx; padding-left: 20rpx; padding-bottom: 20rpx; padding-right: 20rpx; } .ucheckbox1-clz { padding-top: 20rpx; padding-left: 20rpx; padding-bottom: 20rpx; padding-right: 20rpx; } .flex3-clz { padding-top: 20rpx; padding-left: 20rpx; padding-bottom: 20rpx; padding-right: 20rpx; } .btn2-clz { background-color: #e2e2e2; padding-top: 20rpx; border-bottom-left-radius: 12rpx; overflow: hidden; color: #080808; padding-left: 20rpx; padding-bottom: 20rpx; border-top-left-radius: 12rpx; border-top-right-radius: 12rpx; border-bottom-right-radius: 12rpx; text-align: center; padding-right: 20rpx; } .btn3-clz { padding-top: 20rpx; border-bottom-left-radius: 12rpx; color: #fff; padding-left: 20rpx; padding-bottom: 20rpx; border-top-right-radius: 12rpx; margin-right: 0rpx; background-color: #ff5c47; margin-left: 10rpx; overflow: hidden; flex: 1; border-top-left-radius: 12rpx; margin-top: 0rpx; border-bottom-right-radius: 12rpx; margin-bottom: 0rpx; text-align: center; padding-right: 20rpx; } .sortby-clz { font-weight: bold; font-size: 28rpx !important; } .flex6-clz { padding-top: 20rpx; padding-left: 20rpx; padding-bottom: 20rpx; padding-right: 20rpx; } .btn4-clz { background-color: #e2e2e2; padding-top: 20rpx; border-bottom-left-radius: 12rpx; overflow: hidden; color: #080808; padding-left: 20rpx; padding-bottom: 20rpx; border-top-left-radius: 12rpx; border-top-right-radius: 12rpx; border-bottom-right-radius: 12rpx; text-align: center; padding-right: 20rpx; } .btn5-clz { padding-top: 20rpx; border-bottom-left-radius: 12rpx; color: #fff; padding-left: 20rpx; padding-bottom: 20rpx; border-top-right-radius: 12rpx; margin-right: 0rpx; background-color: #ff5c47; margin-left: 10rpx; overflow: hidden; flex: 1; border-top-left-radius: 12rpx; margin-top: 0rpx; border-bottom-right-radius: 12rpx; margin-bottom: 0rpx; text-align: center; padding-right: 20rpx; } .container21094 { } </style>
个性化下拉菜单就是这样轻松完成的。因为默认下拉菜单只是很简单的单选式下拉。