164 lines
3.4 KiB
Vue
164 lines
3.4 KiB
Vue
|
|
<template>
|
||
|
|
<!-- 带搜索 -->
|
||
|
|
<!-- #ifndef MP-WEIXIN -->
|
||
|
|
<wd-select-picker
|
||
|
|
:label-width="labelWidth"
|
||
|
|
:label="label"
|
||
|
|
type="radio"
|
||
|
|
filterable
|
||
|
|
v-model="selected"
|
||
|
|
:columns="options"
|
||
|
|
:disabled="disabled"
|
||
|
|
:show-confirm="false"
|
||
|
|
placeholder="请选择"
|
||
|
|
@change="handleChange"
|
||
|
|
></wd-select-picker>
|
||
|
|
<!-- #endif -->
|
||
|
|
|
||
|
|
<!-- #ifdef MP-WEIXIN -->
|
||
|
|
<!-- 常规下拉 -->
|
||
|
|
<wd-picker
|
||
|
|
:label-width="labelWidth"
|
||
|
|
:label="label"
|
||
|
|
filterable
|
||
|
|
v-model="selected"
|
||
|
|
:columns="options"
|
||
|
|
:disabled="disabled"
|
||
|
|
placeholder="请选择"
|
||
|
|
@confirm="handleChange"
|
||
|
|
></wd-picker>
|
||
|
|
<!-- #endif -->
|
||
|
|
</template>
|
||
|
|
|
||
|
|
<script lang="ts" setup>
|
||
|
|
import { ref, watch, onMounted } from 'vue'
|
||
|
|
import { isArray, isString } from 'lodash'
|
||
|
|
import { http } from '@/utils/http'
|
||
|
|
import { isNullOrUnDef } from '@/utils/is'
|
||
|
|
|
||
|
|
// 定义 props
|
||
|
|
const props = defineProps({
|
||
|
|
dict: {
|
||
|
|
type: [Array, String],
|
||
|
|
default: () => [],
|
||
|
|
required: true,
|
||
|
|
},
|
||
|
|
label: {
|
||
|
|
type: String,
|
||
|
|
default: '',
|
||
|
|
required: false,
|
||
|
|
},
|
||
|
|
labelWidth: {
|
||
|
|
type: String,
|
||
|
|
default: '80px',
|
||
|
|
required: false,
|
||
|
|
},
|
||
|
|
name: {
|
||
|
|
type: String,
|
||
|
|
default: '',
|
||
|
|
required: false,
|
||
|
|
},
|
||
|
|
dictStr: {
|
||
|
|
type: String,
|
||
|
|
default: '',
|
||
|
|
required: false,
|
||
|
|
},
|
||
|
|
type: {
|
||
|
|
type: String,
|
||
|
|
default: '',
|
||
|
|
required: false,
|
||
|
|
},
|
||
|
|
modelValue: {
|
||
|
|
type: [String, Number],
|
||
|
|
required: false,
|
||
|
|
},
|
||
|
|
disabled: {
|
||
|
|
type: Boolean,
|
||
|
|
default: false,
|
||
|
|
required: false,
|
||
|
|
},
|
||
|
|
})
|
||
|
|
|
||
|
|
// 定义 emits
|
||
|
|
const emit = defineEmits(['input', 'change', 'update:modelValue'])
|
||
|
|
|
||
|
|
// 定义响应式数据
|
||
|
|
const selected = ref<any>('')
|
||
|
|
const options = ref<any>([])
|
||
|
|
|
||
|
|
// 初始化选项
|
||
|
|
const initSelections = async () => {
|
||
|
|
options.value = []
|
||
|
|
if (props.type === 'sel_search' && props.dictStr) {
|
||
|
|
let temp = props.dictStr
|
||
|
|
if (temp.indexOf(' ') > 0) {
|
||
|
|
temp = encodeURI(props.dictStr)
|
||
|
|
}
|
||
|
|
try {
|
||
|
|
const res: any = await http.get('/sys/dict/getDictItems/' + temp)
|
||
|
|
if (res.success) {
|
||
|
|
options.value = (res.result ?? []).filter((item) => item !== null)
|
||
|
|
}
|
||
|
|
} catch (error) {
|
||
|
|
console.error('请求数据出错:', error)
|
||
|
|
}
|
||
|
|
} else {
|
||
|
|
if (!props.dict || props.dict.length === 0) {
|
||
|
|
return
|
||
|
|
}
|
||
|
|
if (isString(props.dict)) {
|
||
|
|
try {
|
||
|
|
let code = props.dict;
|
||
|
|
if (code.indexOf(',') > 0 && code.indexOf(' ') > 0) {
|
||
|
|
// 编码后类似sys_user%20where%20username%20like%20xxx' 是不包含空格的,这里判断如果有空格和逗号说明需要编码处理
|
||
|
|
code = encodeURI(code);
|
||
|
|
}
|
||
|
|
const res: any = await http.get('/sys/dict/getDictItems/' + code)
|
||
|
|
if (res.success) {
|
||
|
|
options.value = res.result
|
||
|
|
}
|
||
|
|
} catch (error) {
|
||
|
|
console.error('请求数据出错:', error)
|
||
|
|
}
|
||
|
|
} else {
|
||
|
|
props.dict.forEach((item) => {
|
||
|
|
options.value.push(item)
|
||
|
|
})
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// 选择器改变事件处理函数
|
||
|
|
const handleChange = ({value}) => {
|
||
|
|
emit('update:modelValue', value)
|
||
|
|
emit('change', value)
|
||
|
|
}
|
||
|
|
|
||
|
|
// 监听 dict 和 value 的变化
|
||
|
|
watch(
|
||
|
|
() => props.dict,
|
||
|
|
() => {
|
||
|
|
initSelections()
|
||
|
|
},
|
||
|
|
)
|
||
|
|
// 监听 value 的变化
|
||
|
|
watch(
|
||
|
|
() => props.modelValue,
|
||
|
|
(val) => {
|
||
|
|
selected.value = isNullOrUnDef(props.modelValue) ? '' : val
|
||
|
|
},
|
||
|
|
{ immediate: true },
|
||
|
|
)
|
||
|
|
|
||
|
|
// 组件挂载时初始化选项
|
||
|
|
onMounted(() => {
|
||
|
|
initSelections()
|
||
|
|
})
|
||
|
|
</script>
|
||
|
|
|
||
|
|
<style lang="scss" scoped>
|
||
|
|
:deep(.wd-checkbox__shape) {
|
||
|
|
border-radius: 0 !important;
|
||
|
|
}
|
||
|
|
</style>
|