Files
dvcp_v2_wechat_app/src/components/AiSelect/AiSelect.vue

98 lines
2.1 KiB
Vue
Raw Normal View History

2022-02-14 17:25:54 +08:00
<template>
<section class="AiSelect">
2022-03-03 13:43:32 +08:00
<picker :range="options" :range-key="labelName" @change="handleConfirm" :disabled="disabled" :mode="mode">
2022-03-03 11:13:15 +08:00
<div class="display" v-if="$slots.default">
<slot/>
</div>
<div v-else class="display">
<u-icon v-if="selectedLabel" :label="selectedLabel" label-pos="left" name="arrow-right" color="#ddd"/>
<u-icon v-else :label="placeholder" label-pos="left" name="arrow-right" color="#ddd" label-color="#999"/>
</div>
</picker>
2022-02-14 17:25:54 +08:00
</section>
</template>
<script>
export default {
name: "AiSelect",
model: {
event: "input",
prop: "value"
},
props: {
value: String,
placeholder: {default: "请选择"},
list: {default: () => []},
2022-03-03 11:13:15 +08:00
mode: {default: "selector"},
2022-02-14 17:25:54 +08:00
dict: {default: ""},
2022-03-03 13:43:32 +08:00
disabled: Boolean,
2022-03-03 13:55:45 +08:00
labelName: {default: "label"},
valueName: {default: "value"},
2022-02-14 17:25:54 +08:00
},
computed: {
selectedLabel() {
2022-03-03 13:55:45 +08:00
let str = this.options.find(e => e?.[this.valueName] == this.value)?.[this.labelName]
2022-03-03 13:43:32 +08:00
return this.selected?.[this.labelName] || str
2022-02-14 17:25:54 +08:00
},
options() {
return this.dictKey ? this.$dict.getDict(this.dict).map(e => ({
value: e.dictValue,
label: e.dictName
2022-02-25 15:34:20 +08:00
})) : this.list || []
2022-02-14 17:25:54 +08:00
}
},
data() {
return {
dictKey: '',
2022-03-03 11:13:15 +08:00
selected: {}
2022-02-14 17:25:54 +08:00
}
},
2022-03-03 11:13:15 +08:00
created() {
2022-02-14 17:25:54 +08:00
this.dict && this.$dict.load(this.dict).then(() => {
this.dictKey = this.dict
})
},
methods: {
handleConfirm(v) {
2022-03-03 11:13:15 +08:00
if (this.mode == "selector") {
this.selected = this.options?.[v.detail?.value] || {}
this.$emit("data", this.selected)
2022-03-03 13:55:45 +08:00
this.$emit("input", this.selected?.[this.valueName])
2022-03-03 11:13:15 +08:00
}
2022-02-14 17:25:54 +08:00
}
}
}
</script>
<style lang="scss" scoped>
.AiSelect {
max-width: 100%;
::v-deep .u-icon {
margin-left: 8px;
}
.display {
display: flex;
align-items: center;
.selectedLabel {
flex: 1;
min-width: 0;
overflow: hidden;
text-overflow: ellipsis;
font-size: 30px;
color: #333;
white-space: nowrap;
}
}
i {
font-style: normal;
font-size: 30px;
color: $uni-text-color-grey;
}
}
</style>