基于 Antd Select 组件封装的 Material-UI 风格的 Outlined Select,支持浮动标签动画、完整的 Select 属性继承以及 Form 错误状态处理。
- ✅ 浮动标签动画: 未选中时 label 在 Select 内部,选中后自动浮动到上边框
- ✅ 完整类型支持: 继承 Antd Select 的所有属性,支持 TypeScript 泛型
- ✅ Form 集成: 自动处理 Form 验证错误状态
- ✅ 主题适配: 使用 CSS 变量,自动支持亮色/暗色/金色主题
- ✅ 多种模式: 支持单选、多选、搜索等所有 Select 模式
- ✅ 尺寸支持: 支持 small、middle、large 三种尺寸
import { OutlinedSelect } from '@/components/OutlinedSelect';
function App() {
const [age, setAge] = useState<string>();
return (
<OutlinedSelect
label='年龄'
value={age}
onChange={setAge}
options={[
{ label: 'Twenty', value: '20' },
{ label: 'Thirty', value: '30' },
]}
/>
);
}import { Form } from 'antd';
import { OutlinedSelect } from '@/components/OutlinedSelect';
function FormExample() {
const [form] = Form.useForm();
return (
<Form form={form}>
<Form.Item name='age' rules={[{ required: true, message: '请选择年龄' }]}>
<OutlinedSelect label='年龄' required options={ageOptions} />
</Form.Item>
</Form>
);
}继承 Antd SelectProps 的所有属性,额外添加:
| 属性 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| label | 浮动标签文本 (必填) | string |
- |
| required | 是否显示必填标记 * | boolean |
false |
完整的 API 请参考 Antd Select 文档
<OutlinedSelect label='城市 (多选)' mode='multiple' value={cities} onChange={setCities} options={cityOptions} /><OutlinedSelect
label='搜索用户'
showSearch
value={userId}
onChange={setUserId}
options={userOptions}
filterOption={(input, option) => (option?.label ?? '').toLowerCase().includes(input.toLowerCase())}
/><OutlinedSelect
label="小尺寸"
size="small"
value={value}
onChange={setValue}
options={options}
/>
<OutlinedSelect
label="大尺寸"
size="large"
value={value}
onChange={setValue}
options={options}
/><OutlinedSelect label='禁用的选择框' disabled value='value' options={options} />组件使用 CSS 变量实现主题适配,主要变量:
--fc-fill-2: 标签背景色--fc-text-placeholder: 标签文本色(未激活)--fc-primary-color: 标签文本色(激活)和边框聚焦色--fc-border-color2: 边框正常颜色--fc-red-5-color: 错误状态颜色--fc-geekblue-4-color: 悬停状态颜色
这些变量在 src/theme/variable.css 中定义,会根据主题自动切换。
- 不支持 placeholder: 由于使用了浮动标签,不需要也不支持
placeholder属性 - 必填标记:
required属性只影响 label 的显示,实际验证需要在Form.Item的rules中配置 - Form 集成: 在 Form.Item 内使用时会自动识别错误状态,不需要手动处理
- 主题兼容: 确保项目已引入
src/theme/variable.css
完整的使用示例请参考 demo.tsx 文件。
