Hanye官网
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

useSearch.ts 2.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. import { ref, computed } from 'vue';
  2. import { useErrorHandler } from './useErrorHandler';
  3. /**
  4. * 搜索结果项接口
  5. */
  6. interface SearchResult {
  7. id: number;
  8. title: string;
  9. description: string;
  10. type: 'product' | 'faq' | 'page';
  11. url: string;
  12. }
  13. /**
  14. * 全局搜索功能钩子
  15. * @returns 搜索相关状态和方法
  16. */
  17. export function useSearch() {
  18. const searchQuery = ref('');
  19. const searchResults = ref<SearchResult[]>([]);
  20. const { error, isLoading, wrapAsync } = useErrorHandler();
  21. /**
  22. * 根据查询条件过滤搜索结果
  23. */
  24. const filteredResults = computed(() => {
  25. if (!searchQuery.value.trim()) return [];
  26. // 简单的模拟搜索实现,实际项目中应替换为真实API
  27. return mockSearchResults.filter(item =>
  28. item.title.toLowerCase().includes(searchQuery.value.toLowerCase()) ||
  29. item.description.toLowerCase().includes(searchQuery.value.toLowerCase())
  30. );
  31. });
  32. /**
  33. * 执行搜索
  34. * @param query - 搜索关键词
  35. */
  36. async function search(query: string) {
  37. searchQuery.value = query;
  38. // 在实际项目中,这里应该调用搜索API
  39. await wrapAsync(async () => {
  40. await new Promise(resolve => setTimeout(resolve, 300)); // 模拟API延迟
  41. searchResults.value = filteredResults.value;
  42. return searchResults.value;
  43. });
  44. }
  45. /**
  46. * 清空搜索
  47. */
  48. function clearSearch() {
  49. searchQuery.value = '';
  50. searchResults.value = [];
  51. }
  52. return {
  53. searchQuery,
  54. searchResults: computed(() => searchResults.value),
  55. isLoading,
  56. error,
  57. search,
  58. clearSearch
  59. };
  60. }
  61. // 模拟数据,实际项目中应替换为真实API数据
  62. const mockSearchResults: SearchResult[] = [
  63. {
  64. id: 1,
  65. title: '产品一',
  66. description: '这是产品一的详细描述',
  67. type: 'product',
  68. url: '/products/1'
  69. },
  70. {
  71. id: 2,
  72. title: '产品二',
  73. description: '这是产品二的详细描述',
  74. type: 'product',
  75. url: '/products/2'
  76. },
  77. {
  78. id: 3,
  79. title: '如何使用产品?',
  80. description: '详细介绍产品的使用方法',
  81. type: 'faq',
  82. url: '/faq/1'
  83. },
  84. {
  85. id: 4,
  86. title: '关于我们',
  87. description: '公司简介和历史',
  88. type: 'page',
  89. url: '/about'
  90. }
  91. ];