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

智能搜索输入框实现总结

🎯 升级实现目标

基于之前的项目搜索下拉组件,进一步实现了智能搜索输入框,将项目选择和资源搜索功能完美融合到一个输入框中。

📁 新增文件

核心组件

  1. client/src/components/features/resource/SmartSearchInput.tsx

    • 智能搜索输入框组件
    • 集成项目选择和资源搜索功能
    • 支持点击下拉选择项目,也支持直接输入搜索
  2. client/src/components/features/resource/SmartSearchInputDemo.tsx

    • 智能搜索输入框的演示组件
    • 展示完整的交互流程和状态变化

🔧 修改的文件

素材库升级

  1. client/src/components/features/resource/ResourcePanel.tsx

    • 替换了原来的项目选择下拉和搜索框
    • 集成了智能搜索输入框
    • 简化了组件结构和状态管理
  2. 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>

🚀 优势总结

  1. 用户体验统一: 一个输入框解决两个需求
  2. 交互更自然: 符合用户的搜索习惯
  3. 功能更强大: 既能选择又能搜索
  4. 代码更简洁: 减少了组件数量和状态管理
  5. 维护更容易: 集中的逻辑和清晰的职责

🎉 最终效果

成功实现了一个智能搜索输入框,完美融合了项目选择和资源搜索功能。用户可以:

  • 点击输入框选择项目
  • 直接输入搜索项目名称
  • 选择项目后继续输入搜索资源
  • 享受流畅的搜索和高亮体验

这个实现不仅满足了原始需求,还提供了更好的用户体验和更简洁的代码架构。