// src/views/Company/components/CompanyHeader/SearchBar.js // 股票搜索栏组件 - 金色主题 + 模糊搜索下拉 import React, { useState, useEffect, useRef } from 'react'; import { useSelector } from 'react-redux'; import { Box, HStack, Input, InputGroup, InputLeftElement, Text, VStack, } from '@chakra-ui/react'; import { SearchIcon } from '@chakra-ui/icons'; /** * 股票搜索栏组件(带模糊搜索下拉) * * @param {Object} props * @param {string} props.inputCode - 输入框当前值 * @param {Function} props.onInputChange - 输入变化回调 * @param {Function} props.onSearch - 搜索按钮点击回调 * @param {Function} props.onKeyDown - 键盘事件回调 */ const SearchBar = ({ inputCode, onInputChange, onSearch, onKeyDown, }) => { // 下拉状态 const [showDropdown, setShowDropdown] = useState(false); const [filteredStocks, setFilteredStocks] = useState([]); const containerRef = useRef(null); // 从 Redux 获取全部股票列表 const allStocks = useSelector(state => state.stock.allStocks); // 模糊搜索过滤 useEffect(() => { if (inputCode && inputCode.trim()) { const searchTerm = inputCode.trim().toLowerCase(); const filtered = allStocks.filter(stock => stock.code.toLowerCase().includes(searchTerm) || stock.name.includes(inputCode.trim()) ).slice(0, 10); // 限制显示10条 setFilteredStocks(filtered); setShowDropdown(filtered.length > 0); } else { setFilteredStocks([]); setShowDropdown(false); } }, [inputCode, allStocks]); // 点击外部关闭下拉 useEffect(() => { const handleClickOutside = (event) => { if (containerRef.current && !containerRef.current.contains(event.target)) { setShowDropdown(false); } }; document.addEventListener('mousedown', handleClickOutside); return () => document.removeEventListener('mousedown', handleClickOutside); }, []); // 选择股票 - 直接触发搜索跳转 const handleSelectStock = (stock) => { onInputChange(stock.code); setShowDropdown(false); onSearch(stock.code); }; // 处理键盘事件 const handleKeyDownWrapper = (e) => { if (e.key === 'Enter') { setShowDropdown(false); } onKeyDown?.(e); }; return ( onInputChange(e.target.value)} onKeyDown={handleKeyDownWrapper} onFocus={() => inputCode && filteredStocks.length > 0 && setShowDropdown(true)} borderRadius="md" color="white" borderColor="#C9A961" _placeholder={{ color: '#C9A961' }} _focus={{ borderColor: '#F4D03F', boxShadow: '0 0 0 1px #F4D03F', }} _hover={{ borderColor: '#F4D03F', }} /> {/* 模糊搜索下拉列表 */} {showDropdown && ( {filteredStocks.map((stock) => ( handleSelectStock(stock)} borderBottom="1px solid" borderColor="whiteAlpha.100" _last={{ borderBottom: 'none' }} > {stock.code} {stock.name} ))} )} ); }; export default SearchBar;