@composy/select-vue
@composy/select-vue
Vue 3 下拉选择器组件,基于 @composy/select-core
安装
pnpm add @composy/select-vue
快速开始
<template>
<LSelect
v-model="value"
:options="options"
searchable
allow-clear
placeholder="请选择"
@change="onChange"
/>
</template>
<script setup>
import { ref } from 'vue'
import { LSelect } from '@composy/select-vue'
const value = ref(null)
const options = [
{ value: '1', label: '选项1' },
{ value: '2', label: '选项2' },
{ value: '3', label: '选项3' },
]
const onChange = val => console.log('选中:', val)
</script>
组件 Props
| Prop | 类型 | 默认值 | 说明 |
|---|---|---|---|
modelValue |
unknown |
- | 绑定值 |
options |
SelectOption[] |
- | 选项列表 |
groups |
SelectGroup[] |
- | 分组列表 |
mode |
'single' | 'multiple' |
'single' |
选择模式 |
size |
'small' | 'medium' | 'large' |
'medium' |
尺寸变体 |
placeholder |
string |
'请选择' |
占位文本 |
disabled |
boolean |
false |
是否禁用 |
readonly |
boolean |
false |
是否只读 |
searchable |
boolean |
false |
是否可搜索 |
allowClear |
boolean |
false |
是否允许清空 |
maxTagCount |
number |
0 |
最多显示标签数 |
loading |
boolean |
false |
是否加载中 |
emptyText |
string |
'暂无数据' |
无数据提示 |
maxHeight |
number |
300 |
下拉最大高度 |
dropdownWidth |
number | string |
- | 下拉宽度 |
remoteDebounce |
number |
300 |
远程搜索防抖间隔(毫秒) |
remoteMethod |
(query, signal?) => Promise<SelectOption[]> |
- | 远程搜索;新请求会取消旧请求,并忽略过期结果 |
renderOption |
(flat) => string |
- | 自定义选项 HTML;只保留安全格式标签和非事件属性 |
renderLabel |
(opt) => string |
- | 自定义标签渲染 |
name |
string |
- | 表单字段名 |
trigger |
'click' | 'hover' | 'manual' |
'click' |
触发方式 |
primaryColor |
string |
- | 主色调 |
Events
| 事件 | 参数 | 说明 |
|---|---|---|
update:modelValue |
value |
值变化(v-model) |
change |
value, option |
值变化 |
open |
- | 下拉打开 |
close |
- | 下拉关闭 |
search |
query |
搜索 |
clear |
- | 清除 |
focus |
FocusEvent |
聚焦 |
blur |
FocusEvent |
失焦 |
renderOption 仅支持安全格式标签;脚本类元素和事件、样式及资源加载属性会被移除。renderLabel
的结果按纯文本显示。
SelectOption.key 可为树节点提供稳定路径,SelectGroup.disabled
会继承到组内选项。Core 会复制输入的 options/groups,并对 state
返回防御性快照;远程搜索会取消旧请求、忽略过期响应,并直接展示当前服务端返回的结果。LSelectDropdown
与 LSelectOption 输出 listbox/option 的 ARIA 状态,下拉定位监听优先使用触发器所属
ownerDocument.defaultView。
插件安装
import { createApp } from 'vue'
import { SelectPlugin } from '@composy/select-vue'
createApp(App).use(SelectPlugin, { prefix: 'L' }).mount('#app')
useSelect 组合式函数
<script setup>
import { useSelect } from '@composy/select-vue'
const { state, open, close, setValue, getValue } = useSelect({
options: [...],
mode: 'multiple',
})
</script>
依赖
@composy/select-core— 核心引擎vue^3.5.32 (peerDependency)
构建产物
| 目录 | 格式 |
|---|---|
es/ |
ESM + .d.ts |
esm/ |
ESM(保留模块结构) |
lib/ |
CJS (.cjs) |
dist/ |
UMD |
Builder、ESLint 与 TypeScript 的权威配置位于 .ldesign/;根 tsconfig.json 是兼容入口。Vue
Playground 使用 Vite 配置 src/playground/vite.config.ts:
corepack pnpm run build
corepack pnpm run type-check
corepack pnpm run lint:check
corepack pnpm run playground:build
License
MIT
Related Packages
Version History
| Version | Released | Vue | License |
|---|---|---|---|
| 0.0.2 | 3.5.32 | MIT | |
| 0.0.1 | ^3.5.32 | MIT |