本指令指导如何在管理后台页面中使用设备类型选择器组件(DeviceTypeSelector),包括基本用法、高级配置和最佳实践。
import { DeviceTypeSelector } from '@/client/admin/components/DeviceTypeSelector';
// 在组件中使用
<DeviceTypeSelector
value={selectedTypeId}
onChange={(id) => setSelectedTypeId(id)}
placeholder="选择设备类型"
/>
<DeviceTypeSelector
value={selectedTypeId}
onChange={(id) => setSelectedTypeId(id)}
includeImage={true}
onlyEnabled={true}
placeholder="选择启用的设备类型(带图片)"
/>
| 参数 | 类型 | 默认值 | 描述 |
|---|---|---|---|
value |
number |
undefined |
当前选中的设备类型ID |
onChange |
(value: number) => void |
undefined |
选择变化时的回调函数 |
placeholder |
string |
"选择设备类型" |
选择框占位符文本 |
disabled |
boolean |
false |
是否禁用选择器 |
onlyEnabled |
boolean |
true |
是否只显示启用的设备类型 |
includeImage |
boolean |
false |
是否在选项中显示设备类型图片 |
import { useForm } from 'react-hook-form';
import { Form, FormField, FormItem, FormLabel, FormControl } from '@/client/components/ui/form';
import { DeviceTypeSelector } from '@/client/admin/components/DeviceTypeSelector';
const form = useForm({
defaultValues: {
deviceTypeId: undefined as number | undefined
}
});
<Form {...form}>
<FormField
control={form.control}
name="deviceTypeId"
render={({ field }) => (
<FormItem>
<FormLabel>设备类型</FormLabel>
<FormControl>
<DeviceTypeSelector
value={field.value}
onChange={field.onChange}
placeholder="请选择设备类型"
includeImage={true}
/>
</FormControl>
</FormItem>
)}
/>
</Form>
import { useState } from 'react';
import { DeviceTypeSelector } from '@/client/admin/components/DeviceTypeSelector';
const [filters, setFilters] = useState({
typeId: undefined as number | undefined,
keyword: ''
});
const handleTypeChange = (typeId: number) => {
setFilters(prev => ({ ...prev, typeId }));
// 触发数据重新加载
refetch();
};
<DeviceTypeSelector
value={filters.typeId}
onChange={handleTypeChange}
placeholder="按设备类型筛选"
onlyEnabled={true}
/>
import { useQuery } from '@tanstack/react-query';
import { deviceTypesClient } from '@/client/api';
// 如果需要获取选中的设备类型详情
const { data: selectedDeviceType } = useQuery({
queryKey: ['deviceType', selectedTypeId],
queryFn: async () => {
if (!selectedTypeId) return null;
const res = await deviceTypesClient[':id'].$get({
param: { id: selectedTypeId.toString() }
});
if (res.status === 200) return await res.json();
return null;
},
enabled: !!selectedTypeId
});
import { z } from 'zod';
const formSchema = z.object({
deviceTypeId: z.number({
required_error: "请选择设备类型",
invalid_type_error: "设备类型ID必须是数字"
}).int().positive()
});
// 在表单提交时验证
const onSubmit = (data: z.infer<typeof formSchema>) => {
// 处理表单提交
};
<DeviceTypeSelector
value={selectedTypeId}
onChange={(id) => {
try {
setSelectedTypeId(id);
} catch (error) {
console.error('选择设备类型失败:', error);
toast.error('选择失败,请重试');
}
}}
/>
// 使用防抖处理频繁的选择变化
import { debounce } from 'lodash-es';
const debouncedTypeChange = debounce((id: number) => {
setSelectedTypeId(id);
}, 300);
<DeviceTypeSelector
onChange={debouncedTypeChange}
/>
<DeviceTypeSelector
placeholder="选择设备类型(按回车键打开选项)"
// 添加ARIA标签
aria-label="设备类型选择器"
/>
A: 确保API路由配置了正确的relations参数:
// 在 src/server/api/device-types/index.ts 中
relations: ['imageFile'] // 必须包含这个配置
A: 可以修改选择器组件中的渲染逻辑,或者创建自定义的选择器变体。
A: 组件内置了错误处理,但可以在onChange回调中添加额外的错误处理逻辑。
UserSelector - 用户选择器DeviceSelector - 设备选择器FileSelector - 文件选择器如果在使用过程中遇到问题,请检查: