Files
aiot-uniapp/src/components/system-select/user-picker.vue

81 lines
1.7 KiB
Vue
Raw Normal View History

<template>
<wd-select-picker
v-model="selectedId"
:label="label"
2025-12-18 09:44:01 +08:00
:label-width="label ? '180rpx' : '0'"
2025-12-23 20:56:36 +08:00
:columns="userList"
value-key="id"
label-key="nickname"
:type="type"
filterable
2025-12-18 09:44:01 +08:00
:placeholder="placeholder"
@confirm="handleConfirm"
/>
</template>
<script lang="ts" setup>
import type { User } from '@/api/system/user'
2025-12-23 20:56:36 +08:00
import { onMounted, ref, watch } from 'vue'
import { getSimpleUserList } from '@/api/system/user'
const props = withDefaults(defineProps<{
modelValue?: number | number[]
type?: 'radio' | 'checkbox'
label?: string
2025-12-18 09:44:01 +08:00
placeholder?: string
}>(), {
type: 'checkbox',
2025-12-18 09:44:01 +08:00
label: '',
placeholder: '请选择',
})
const emit = defineEmits<{
(e: 'update:modelValue', value: number | number[] | undefined): void
}>()
2025-12-23 20:56:36 +08:00
const userList = ref<User[]>([])
const selectedId = ref<number | string | number[]>([])
2025-12-18 09:44:01 +08:00
/** 根据用户 ID 获取昵称 */
function getUserNickname(userId: number | undefined): string {
2025-12-23 20:56:36 +08:00
if (!userId) {
return ''
2025-12-23 20:56:36 +08:00
}
2025-12-18 09:44:01 +08:00
const user = userList.value.find(u => u.id === userId)
return user?.nickname || ''
}
defineExpose({
getUserNickname,
})
watch(
() => props.modelValue,
(val) => {
if (props.type === 'radio') {
// 单选时,如果值为 undefined使用空字符串避免警告
selectedId.value = val !== undefined ? val : ''
} else {
// 多选时,确保是数组
selectedId.value = Array.isArray(val) ? val : []
}
},
{ immediate: true },
)
2025-12-23 20:56:36 +08:00
/** 加载用户列表 */
async function loadUserList() {
userList.value = await getSimpleUserList()
}
2025-12-23 20:56:36 +08:00
/** 选择确认 */
function handleConfirm({ value }: { value: any }) {
emit('update:modelValue', value)
}
2025-12-23 20:56:36 +08:00
/** 初始化 */
onMounted(() => {
loadUserList()
})
</script>