2025-12-10 20:52:44 +08:00
|
|
|
<script setup lang="ts">
|
2026-02-06 16:37:06 +08:00
|
|
|
import { computed } from 'vue'
|
2025-12-10 20:52:44 +08:00
|
|
|
import { SelectRoot as SelectRootPrimitive } from 'radix-vue'
|
|
|
|
|
|
|
|
|
|
interface Props {
|
|
|
|
|
defaultValue?: string
|
|
|
|
|
modelValue?: string
|
|
|
|
|
open?: boolean
|
|
|
|
|
defaultOpen?: boolean
|
|
|
|
|
dir?: 'ltr' | 'rtl'
|
|
|
|
|
name?: string
|
|
|
|
|
autocomplete?: string
|
|
|
|
|
disabled?: boolean
|
|
|
|
|
required?: boolean
|
|
|
|
|
}
|
|
|
|
|
|
2026-02-06 16:37:06 +08:00
|
|
|
const props = withDefaults(defineProps<Props>(), {
|
2026-02-22 00:43:41 +08:00
|
|
|
defaultValue: undefined,
|
2026-02-06 16:37:06 +08:00
|
|
|
modelValue: undefined,
|
|
|
|
|
open: undefined,
|
2026-02-22 00:43:41 +08:00
|
|
|
dir: undefined,
|
|
|
|
|
name: undefined,
|
|
|
|
|
autocomplete: undefined,
|
2026-02-06 16:37:06 +08:00
|
|
|
})
|
2025-12-10 20:52:44 +08:00
|
|
|
|
|
|
|
|
const emit = defineEmits<{
|
|
|
|
|
'update:modelValue': [value: string]
|
|
|
|
|
'update:open': [value: boolean]
|
|
|
|
|
}>()
|
|
|
|
|
|
2026-02-06 16:37:06 +08:00
|
|
|
// open 未传入时不绑定,让 radix-vue 走 uncontrolled 模式
|
|
|
|
|
const openProp = computed(() =>
|
|
|
|
|
props.open !== undefined ? { open: props.open } : {}
|
2025-12-10 20:52:44 +08:00
|
|
|
)
|
|
|
|
|
|
2026-02-06 16:37:06 +08:00
|
|
|
// modelValue 未传入时不绑定,让 radix-vue 走 uncontrolled 模式
|
|
|
|
|
const modelValueProp = computed(() =>
|
|
|
|
|
props.modelValue !== undefined ? { modelValue: props.modelValue } : {}
|
2025-12-10 20:52:44 +08:00
|
|
|
)
|
|
|
|
|
</script>
|
|
|
|
|
|
|
|
|
|
<template>
|
|
|
|
|
<SelectRootPrimitive
|
|
|
|
|
:default-value="defaultValue"
|
2026-02-06 16:37:06 +08:00
|
|
|
v-bind="{ ...modelValueProp, ...openProp }"
|
2025-12-10 20:52:44 +08:00
|
|
|
:default-open="defaultOpen"
|
|
|
|
|
:dir="dir"
|
|
|
|
|
:name="name"
|
|
|
|
|
:autocomplete="autocomplete"
|
|
|
|
|
:disabled="disabled"
|
|
|
|
|
:required="required"
|
2026-02-06 16:37:06 +08:00
|
|
|
@update:model-value="emit('update:modelValue', $event)"
|
|
|
|
|
@update:open="emit('update:open', $event)"
|
2025-12-10 20:52:44 +08:00
|
|
|
>
|
|
|
|
|
<slot />
|
|
|
|
|
</SelectRootPrimitive>
|
|
|
|
|
</template>
|