You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

169 lines
4.2 KiB

<template>
<view class="uv-drop-down-item" @click="clickHandler">
<uv-text :text="label" :size="getTextStyle.size" :color="getTextStyle.color" lines="1" :custom-style="{marginRight: '10rpx',maxWidth:'200rpx'}"></uv-text>
<uv-icon :name="getDownIcon.name" :size="getDownIcon.size" :color="getDownIcon.color" v-if="[1,'1'].indexOf(type)==-1"></uv-icon>
</view>
</template>
<script>
import mpMixin from '@/uni_modules/uv-ui-tools/libs/mixin/mpMixin.js';
import mixin from '@/uni_modules/uv-ui-tools/libs/mixin/mixin.js';
/**
* DropDown 下拉框
* @description 下拉筛选
* @tutorial https://ext.dcloud.net.cn/plugin?name=uv-drop-down
* @property {String | Number} name 字段标识
* @property {String | Number} type 类型 1 没有筛选项直接进行选中和不选中 2 有多个选项
* @property {String | Number} label 筛选项的文本
* @property {Boolean} isDrop 该项是否打开
*/
export default {
name: 'uv-drop-down-item',
mixins: [mpMixin, mixin],
emits: ['click'],
props: {
name: {
type: [String, Number],
default: ''
},
// 类型 1 没有筛选项,直接进行选中和不选中 2 有多个选项
type: {
type: [String, Number],
default: '2'
},
// 筛选的文本
label: {
type: [String],
default: ''
},
// 筛选值
value: {
type: [String, Number, null],
default: ''
},
// 是否下拉菜单打开
isDrop: {
type: Boolean,
default: false
}
},
data() {
return {
parentData: {
defaultValue: [0, '0', 'all'],
textSize: '30rpx',
textColor: '#333',
textActiveSize: '30rpx',
textActiveColor: '#3c9cff',
extraIcon: {},
extraActiveIcon: {},
sign: '',
clickHandler: Function
},
active: false,
isDroped: false,
elId: ''
}
},
watch: {
isDrop: {
handler(newVal) {
this.isDroped = newVal;
},
immediate: true
},
value: {
handler(newVal) {
this.$nextTick(()=>{
this.active = this.parentData.defaultValue.indexOf(newVal) == -1;
})
},
immediate: true
}
},
computed: {
getDownIcon() {
const style = {
size: '30rpx',
color: '#333',
...this.parentData.extraIcon
}
if (this.active || this.isDroped) {
style.color = this.parentData.extraActiveIcon?.color ? this.parentData.extraActiveIcon?.color : '#3c9cff';
style.size = this.parentData.extraActiveIcon?.size ? this.parentData.extraActiveIcon?.size : '30rpx';
}
if (this.isDroped) {
style.name = this.parentData.extraActiveIcon?.name;
}
return style;
},
getTextStyle() {
const style = {
size: this.parentData.textSize,
color: this.parentData.textColor
};
if (this.active || this.isDroped) {
style.size = this.parentData.textActiveSize;
style.color = this.parentData.textActiveColor;
}
return style;
}
},
created() {
this.init();
},
methods: {
init() {
this.elId = this.$uv.guid();
this.getParentData('uv-drop-down');
if (!this.parent) {
this.$uv.error('uv-drop-down必须搭配uv-drop-down-item组件使用');
}
uni.$on('HANDLE_DROPDOWN_ONE', id => {
if (this.isDroped && this.elId != id) {
this.isDroped = false;
}
})
uni.$on(`${this.parentData.sign}_CLOSEPOPUP`, async () => {
if (this.isDroped) {
this.isDroped = false;
}
})
},
async clickHandler() {
let data = {};
uni.$emit('HANDLE_DROPDOWN_ONE', this.elId);
switch (+this.type) {
case 1:
this.active = !this.active;
data = {
name: this.name,
active: this.active,
type: this.type
};
break;
case 2:
this.isDroped = !this.isDroped;
data = {
name: this.name,
active: this.isDroped,
type: this.type
};
break;
}
this.parentData.clickHandler(data);
this.$emit('click', data);
uni.$emit(`${this.parentData.sign}_CLICKMENU`, {
show: +this.type > 1 && this.isDroped
});
}
}
}
</script>
<style scoped lang="scss">
@import '@/uni_modules/uv-ui-tools/libs/css/components.scss';
.uv-drop-down-item {
@include flex;
align-items: center;
padding: 20rpx;
}
</style>