128 lines
2.3 KiB
Vue
128 lines
2.3 KiB
Vue
<template>
|
||
<el-select
|
||
v-model="selected"
|
||
@focus="fetchItems"
|
||
:placeholder="placeholder"
|
||
:filterable="filterable"
|
||
:value-key="valueKey"
|
||
:style="selectStyle"
|
||
@change="onChange"
|
||
>
|
||
<el-option
|
||
v-for="item in items"
|
||
:key="item.id"
|
||
:label="item.code"
|
||
:value="item.code"
|
||
>
|
||
<span>{{ item.code }}</span>
|
||
<span>{{ item.name }}</span>
|
||
</el-option>
|
||
|
||
</el-select>
|
||
</template>
|
||
|
||
<script>
|
||
import curdArea, {queryAreaList} from '@/api/area'
|
||
|
||
export default {
|
||
name: 'AreaCodeSelect',
|
||
props: {
|
||
value: null, // v-model
|
||
placeholder: {
|
||
type: String,
|
||
default: '请选择库区'
|
||
},
|
||
filterable: {
|
||
type: Boolean,
|
||
default: true
|
||
},
|
||
valueKey: {
|
||
type: String,
|
||
default: 'id'
|
||
},
|
||
// 是否禁用
|
||
disabled: {
|
||
type: Boolean,
|
||
default: false
|
||
},
|
||
isEnabled:{
|
||
type: Boolean,
|
||
default: true
|
||
},
|
||
bexb:{
|
||
type: Boolean,
|
||
default: true
|
||
},
|
||
selectStyle: {
|
||
type: String,
|
||
default: 'width: 200px;'
|
||
},
|
||
immediate: {
|
||
type: Boolean,
|
||
default: false
|
||
},
|
||
// 是否可清空
|
||
clearable: {
|
||
type: Boolean,
|
||
default: false
|
||
},
|
||
// 是否支持多选
|
||
multiple: {
|
||
type: Boolean,
|
||
default: false
|
||
},
|
||
|
||
},
|
||
data() {
|
||
return {
|
||
items: [],
|
||
selected: this.value,
|
||
loading: false
|
||
}
|
||
},
|
||
computed: {
|
||
// 处理 v-model 双向绑定
|
||
selectedValue: {
|
||
get() {
|
||
return this.value
|
||
},
|
||
set(val) {
|
||
this.$emit('input', val)
|
||
}
|
||
}
|
||
},
|
||
watch: {
|
||
value(val) {
|
||
this.selected = val
|
||
},
|
||
selected(val) {
|
||
this.$emit('input', val)
|
||
this.$emit('change', val)
|
||
}
|
||
},
|
||
created() {
|
||
// 如果设置了immediate属性或已有值,则立即加载数据
|
||
//if (this.immediate || (this.value && this.value[this.valueKey])) {
|
||
this.fetchItems();
|
||
// }
|
||
},
|
||
// 清空选中值时触发
|
||
handleClear() {
|
||
this.$emit('clear')
|
||
},
|
||
methods: {
|
||
fetchItems() {
|
||
this.loading = true
|
||
if (this.items.length === 0) {
|
||
curdArea.queryAreaList({ bexb: this.bexb }).then(res => {
|
||
this.items = res
|
||
})
|
||
}
|
||
},
|
||
onChange(val) {
|
||
this.$emit('change', val)
|
||
}
|
||
}
|
||
}
|
||
</script>
|