| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196 |
- import React, { useState, useEffect } from 'react'
- import { View, Text, ScrollView } from '@tarojs/components'
- import Taro from '@tarojs/taro'
- import { Navbar } from '@/components/ui/navbar'
- import TDesignSearch from '@/components/tdesign/search'
- import './index.css'
- // 本地存储搜索历史
- const SEARCH_HISTORY_KEY = 'search_history'
- const SearchPage: React.FC = () => {
- const [searchValue, setSearchValue] = useState('')
- const [historyWords, setHistoryWords] = useState<string[]>([])
- const [popularWords, setPopularWords] = useState<string[]>([])
- // 获取搜索历史
- const getSearchHistory = (): string[] => {
- try {
- const history = Taro.getStorageSync(SEARCH_HISTORY_KEY)
- return Array.isArray(history) ? history : []
- } catch (error) {
- console.error('获取搜索历史失败:', error)
- return []
- }
- }
- // 保存搜索历史
- const saveSearchHistory = (keyword: string) => {
- try {
- const history = getSearchHistory()
- // 移除重复的关键词
- const filteredHistory = history.filter(word => word !== keyword)
- // 将新关键词添加到前面
- const newHistory = [keyword, ...filteredHistory]
- // 限制历史记录数量
- const limitedHistory = newHistory.slice(0, 10)
- Taro.setStorageSync(SEARCH_HISTORY_KEY, limitedHistory)
- setHistoryWords(limitedHistory)
- } catch (error) {
- console.error('保存搜索历史失败:', error)
- }
- }
- // 清空搜索历史
- const clearSearchHistory = () => {
- try {
- Taro.removeStorageSync(SEARCH_HISTORY_KEY)
- setHistoryWords([])
- } catch (error) {
- console.error('清空搜索历史失败:', error)
- }
- }
- // 获取热门搜索词(模拟数据)
- const getPopularSearchWords = (): string[] => {
- return [
- '手机',
- '笔记本电脑',
- '耳机',
- '智能手表',
- '平板电脑',
- '数码相机',
- '游戏机',
- '智能家居'
- ]
- }
- // 页面显示时加载数据
- useEffect(() => {
- setHistoryWords(getSearchHistory())
- setPopularWords(getPopularSearchWords())
- }, [])
- // 处理搜索提交
- const handleSubmit = (value: string) => {
- if (!value.trim()) return
- // 保存搜索历史
- saveSearchHistory(value.trim())
- // 跳转到搜索结果页面
- Taro.navigateTo({
- url: `/pages/search-result/index?keyword=${encodeURIComponent(value)}`
- })
- }
- // 点击历史搜索项
- const handleHistoryTap = (word: string) => {
- setSearchValue(word)
- // 保存搜索历史
- saveSearchHistory(word)
- Taro.navigateTo({
- url: `/pages/search-result/index?keyword=${encodeURIComponent(word)}`
- })
- }
- // 点击热门搜索项
- const handlePopularTap = (word: string) => {
- setSearchValue(word)
- // 保存搜索历史
- saveSearchHistory(word)
- Taro.navigateTo({
- url: `/pages/search-result/index?keyword=${encodeURIComponent(word)}`
- })
- }
- // 清空搜索历史
- const handleClearHistory = () => {
- clearSearchHistory()
- }
- return (
- <View className="search-page">
- <Navbar
- title="搜索"
- leftIcon="i-heroicons-chevron-left-20-solid"
- onClickLeft={() => Taro.navigateBack()}
- className="bg-white"
- />
- <ScrollView className="search-page-content" scrollY>
- {/* 搜索栏 */}
- <View className="search-input-container">
- <TDesignSearch
- placeholder="搜索商品..."
- shape="round"
- value={searchValue}
- onChange={(value) => setSearchValue(value)}
- onSubmit={() => handleSubmit(searchValue)}
- onClear={() => setSearchValue('')}
- />
- </View>
- {/* 搜索历史 */}
- {historyWords.length > 0 && (
- <View className="search-section">
- <View className="search-header">
- <Text className="search-title">搜索历史</Text>
- <Text
- className="search-clear"
- onClick={handleClearHistory}
- data-testid="clear-history"
- >
- 清空
- </Text>
- </View>
- <View className="search-content">
- {historyWords.map((word: string, index: number) => (
- <View
- key={index}
- className="search-item"
- onClick={() => handleHistoryTap(word)}
- data-testid="history-item"
- >
- <Text className="search-item-text">{word}</Text>
- </View>
- ))}
- </View>
- </View>
- )}
- {/* 热门搜索 */}
- {popularWords.length > 0 && (
- <View className="search-section">
- <View className="search-header">
- <Text className="search-title">热门搜索</Text>
- </View>
- <View className="search-content">
- {popularWords.map((word: string, index: number) => (
- <View
- key={index}
- className="search-item"
- onClick={() => handlePopularTap(word)}
- data-testid="popular-item"
- >
- <Text className="search-item-text">{word}</Text>
- </View>
- ))}
- </View>
- </View>
- )}
- {/* 空状态 */}
- {historyWords.length === 0 && popularWords.length === 0 && (
- <View className="empty-state" data-testid="empty-state">
- <View className="i-heroicons-magnifying-glass-20-solid empty-icon" />
- <Text className="empty-text">暂无搜索记录</Text>
- <Text className="empty-subtext">输入关键词搜索商品</Text>
- </View>
- )}
- </ScrollView>
- </View>
- )
- }
- export default SearchPage
|