4.3 KiB
4.3 KiB
Select Empty Value 错误修复
✅ 问题已解决
修复了 Radix UI Select 组件中空字符串值的错误。
🐛 错误描述
Error: A <Select.Item /> must have a value prop that is not an empty string.
This is because the Select value can be set to an empty string to clear
the selection and show the placeholder.
🔍 问题根源
在 FieldClassificationTags.tsx 文件中,有两个 Select 组件使用了空字符串 "" 作为 SelectItem 的 value:
// ❌ 错误的写法
<SelectItem value="">全部</SelectItem>
Radix UI 不允许使用空字符串作为 SelectItem 的 value,因为空字符串被保留用于清除选择和显示占位符。
✅ 修复方案
将空字符串 "" 替换为有意义的值 "all",并更新相应的逻辑:
修复 1: 土壤类型选择器
修改前:
<Select
value={queryCondition.soilType?.[0] || ''}
onValueChange={(value) => {
if (value === '') {
setQueryCondition({ ...queryCondition, soilType: undefined });
} else {
setQueryCondition({ ...queryCondition, soilType: [value as SoilType] });
}
}}
>
<SelectContent>
<SelectItem value="">全部</SelectItem>
<SelectItem value="sandy">沙土</SelectItem>
{/* ... */}
</SelectContent>
</Select>
修改后:
<Select
value={queryCondition.soilType?.[0] || 'all'}
onValueChange={(value) => {
if (value === 'all') {
setQueryCondition({ ...queryCondition, soilType: undefined });
} else {
setQueryCondition({ ...queryCondition, soilType: [value as SoilType] });
}
}}
>
<SelectContent>
<SelectItem value="all">全部</SelectItem>
<SelectItem value="sandy">沙土</SelectItem>
{/* ... */}
</SelectContent>
</Select>
修复 2: 种植模式选择器
修改前:
<Select
value={queryCondition.plantingMode?.[0] || ''}
onValueChange={(value) => {
if (value === '') {
setQueryCondition({ ...queryCondition, plantingMode: undefined });
} else {
setQueryCondition({ ...queryCondition, plantingMode: [value as PlantingMode] });
}
}}
>
<SelectContent>
<SelectItem value="">全部</SelectItem>
<SelectItem value="open-field">露地</SelectItem>
{/* ... */}
</SelectContent>
</Select>
修改后:
<Select
value={queryCondition.plantingMode?.[0] || 'all'}
onValueChange={(value) => {
if (value === 'all') {
setQueryCondition({ ...queryCondition, plantingMode: undefined });
} else {
setQueryCondition({ ...queryCondition, plantingMode: [value as PlantingMode] });
}
}}
>
<SelectContent>
<SelectItem value="all">全部</SelectItem>
<SelectItem value="open-field">露地</SelectItem>
{/* ... */}
</SelectContent>
</Select>
📝 修改文件
- 文件:
/components/field/FieldClassificationTags.tsx - 修改位置: 两个 Select 组件(土壤类型、种植模式)
- 修改内容:
- 将
value=""改为value="all" - 将默认值从
''改为'all' - 将条件判断从
value === ''改为value === 'all'
- 将
🎯 修复效果
- ✅ 消除控制台错误
- ✅ 保持原有功能不变
- ✅ "全部" 选项正常工作
- ✅ 选择其他选项正常过滤
🔧 技术说明
Radix UI Select 规则
Radix UI Select 组件有以下限制:
- 不允许空字符串值:
<SelectItem value="">是不允许的 - 空字符串保留用途: 空字符串被保留用于清除选择
- 必须使用有意义的值: 所有 SelectItem 必须有非空字符串的唯一值
最佳实践
// ✅ 推荐做法
<SelectItem value="all">全部</SelectItem>
<SelectItem value="none">无</SelectItem>
<SelectItem value="default">默认</SelectItem>
// ❌ 避免做法
<SelectItem value="">全部</SelectItem>
<SelectItem value="">无</SelectItem>
📚 相关资源
✨ 总结
通过将空字符串值替换为 "all",成功修复了 Radix UI Select 组件的错误。此修复:
- ✅ 符合 Radix UI 规范
- ✅ 保持功能完整性
- ✅ 提高代码可读性
- ✅ 消除控制台警告
错误已完全修复! 🎉