You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
4.3 KiB
4.3 KiB
智能搜索输入框实现总结
🎯 升级实现目标
基于之前的项目搜索下拉组件,进一步实现了智能搜索输入框,将项目选择和资源搜索功能完美融合到一个输入框中。
📁 新增文件
核心组件
-
client/src/components/features/resource/SmartSearchInput.tsx- 智能搜索输入框组件
- 集成项目选择和资源搜索功能
- 支持点击下拉选择项目,也支持直接输入搜索
-
client/src/components/features/resource/SmartSearchInputDemo.tsx- 智能搜索输入框的演示组件
- 展示完整的交互流程和状态变化
🔧 修改的文件
素材库升级
-
client/src/components/features/resource/ResourcePanel.tsx- 替换了原来的项目选择下拉和搜索框
- 集成了智能搜索输入框
- 简化了组件结构和状态管理
-
client/src/components/features/resource/index.ts- 添加了新组件的导出
✨ 核心功能升级
1. 智能搜索模式
- ✅ 双重功能: 既可以选择项目,也可以搜索资源
- ✅ 智能切换: 根据用户行为自动切换搜索模式
- ✅ 状态感知: 根据是否选择项目显示不同的占位符
2. 用户交互流程
用户点击输入框 → 显示项目树下拉
用户选择项目 → 项目名称填入输入框 → 可继续输入搜索资源
或者
用户直接输入 → 实时搜索项目名称 → 选择项目
3. 智能占位符
- 未选择项目时: "搜索项目或资源..."
- 已选择项目时: "在 '项目名称' 中搜索资源..."
4. 搜索功能增强
- ✅ 项目名称模糊搜索
- ✅ 搜索关键词高亮显示
- ✅ 智能展开匹配的父节点
- ✅ 清除搜索功能
- ✅ 键盘导航支持
🏗️ 技术架构升级
组件设计
SmartSearchInput
├── Input (搜索输入框)
├── Popover (下拉容器)
│ ├── 搜索提示区域
│ ├── ScrollArea (滚动区域)
│ │ └── ProjectTreeItem[] (项目树)
│ └── 使用说明区域
智能逻辑
// 智能模式判断
const isProjectSearchMode = useMemo(() => {
return !value.trim() || open;
}, [value, open]);
// 动态占位符
const displayPlaceholder = useMemo(() => {
if (selectedProjectId && selectedProjectName && !value) {
return `在 "${selectedProjectName}" 中搜索资源...`;
}
return placeholder;
}, [selectedProjectId, selectedProjectName, value, placeholder]);
🎨 用户体验优化
1. 视觉反馈
- 搜索提示区域显示当前模式
- 底部说明区域提供使用指导
- 高亮显示匹配的搜索关键词
2. 交互优化
- 点击输入框自动显示项目选择
- 选择项目后自动填入名称
- 支持 ESC 键关闭下拉
- 支持 Enter 键打开下拉
3. 状态管理
- 智能清理相关状态
- 项目选择后自动清空搜索查询
- 保持选中资源状态的一致性
🔍 使用示例
基础使用
<SmartSearchInput
value={searchValue}
onChange={setSearchValue}
selectedProjectId={selectedProjectId}
onProjectSelect={handleProjectSelect}
placeholder="点击选择项目或直接搜索..."
/>
在 ResourcePanel 中的集成
<div className="space-y-1">
<label className="text-xs font-medium text-muted-foreground">
搜索项目或资源
</label>
<SmartSearchInput
value={searchQuery}
onChange={setSearchQuery}
selectedProjectId={selectedProjectId}
onProjectSelect={handleProjectSelect}
placeholder="点击选择项目或直接搜索..."
className="w-full"
/>
</div>
🚀 优势总结
- 用户体验统一: 一个输入框解决两个需求
- 交互更自然: 符合用户的搜索习惯
- 功能更强大: 既能选择又能搜索
- 代码更简洁: 减少了组件数量和状态管理
- 维护更容易: 集中的逻辑和清晰的职责
🎉 最终效果
成功实现了一个智能搜索输入框,完美融合了项目选择和资源搜索功能。用户可以:
- 点击输入框选择项目
- 直接输入搜索项目名称
- 选择项目后继续输入搜索资源
- 享受流畅的搜索和高亮体验
这个实现不仅满足了原始需求,还提供了更好的用户体验和更简洁的代码架构。