56 lines
1.4 KiB
Vue
56 lines
1.4 KiB
Vue
<script setup lang="ts">
|
|
import PickerSelect from '../picker-select/index.vue'
|
|
|
|
const props = defineProps({
|
|
label: { type: String, default: '' },
|
|
value: { type: null as unknown as PropType<any>, default: undefined },
|
|
labelField: { type: String, required: true },
|
|
valueField: { type: String, required: true },
|
|
viewname: { type: String, required: true },
|
|
field1: { type: String, required: true },
|
|
field2: { type: String, required: true },
|
|
placeholder: { type: String, default: '请选择' },
|
|
})
|
|
|
|
const emits = defineEmits<{
|
|
(e: 'update:label', val: string): void
|
|
(e: 'update:value', val: any): void
|
|
}>()
|
|
|
|
const _visible = ref(false)
|
|
const _label = ref(props.label)
|
|
|
|
// 同步 props.label
|
|
watch(() => props.label, (val) => {
|
|
_label.value = val
|
|
})
|
|
|
|
// 选中时只处理 label
|
|
function handleSelectChange(selectValue: any) {
|
|
if (!selectValue)
|
|
return
|
|
_label.value = selectValue[props.labelField]
|
|
emits('update:label', _label.value)
|
|
}
|
|
</script>
|
|
|
|
<template>
|
|
<sar-popout-input
|
|
v-model="_label"
|
|
:placeholder="props.placeholder"
|
|
@click="_visible = true"
|
|
>
|
|
<PickerSelect
|
|
v-model:visible="_visible"
|
|
:value="props.value"
|
|
:viewname="props.viewname"
|
|
:field1="props.field1"
|
|
:field2="props.field2"
|
|
:label-field="props.labelField"
|
|
:value-field="props.valueField"
|
|
@update:value="emits('update:value', $event)"
|
|
@change="handleSelectChange"
|
|
/>
|
|
</sar-popout-input>
|
|
</template>
|