From 91bd581a5e7ee8c81421a7e59388bc5c2684f711 Mon Sep 17 00:00:00 2001 From: zdl <3489966805@qq.com> Date: Tue, 9 Dec 2025 15:18:06 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=20useCompanyStock=20?= =?UTF-8?q?=E8=82=A1=E7=A5=A8=E4=BB=A3=E7=A0=81=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/Company/hooks/useCompanyStock.js | 90 ++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 src/views/Company/hooks/useCompanyStock.js diff --git a/src/views/Company/hooks/useCompanyStock.js b/src/views/Company/hooks/useCompanyStock.js new file mode 100644 index 00000000..d464a74d --- /dev/null +++ b/src/views/Company/hooks/useCompanyStock.js @@ -0,0 +1,90 @@ +// src/views/Company/hooks/useCompanyStock.js +// 股票代码管理 Hook - 处理 URL 参数同步和搜索逻辑 + +import { useState, useEffect, useCallback } from 'react'; +import { useSearchParams } from 'react-router-dom'; +import { DEFAULT_STOCK_CODE, URL_PARAM_NAME } from '../constants'; + +/** + * 股票代码管理 Hook + * + * 功能: + * - 管理当前股票代码状态 + * - 双向同步 URL 参数 + * - 处理搜索输入和提交 + * + * @param {Object} options - 配置选项 + * @param {string} [options.defaultCode] - 默认股票代码 + * @param {string} [options.paramName] - URL 参数名 + * @param {Function} [options.onStockChange] - 股票代码变化回调 (newCode, prevCode) => void + * @returns {Object} 股票代码状态和操作方法 + */ +export const useCompanyStock = (options = {}) => { + const { + defaultCode = DEFAULT_STOCK_CODE, + paramName = URL_PARAM_NAME, + onStockChange, + } = options; + + const [searchParams, setSearchParams] = useSearchParams(); + + // 从 URL 参数初始化股票代码 + const [stockCode, setStockCode] = useState( + searchParams.get(paramName) || defaultCode + ); + + // 输入框状态(未确认的输入) + const [inputCode, setInputCode] = useState(stockCode); + + /** + * 监听 URL 参数变化,同步到本地状态 + * 支持浏览器前进/后退按钮 + */ + useEffect(() => { + const urlCode = searchParams.get(paramName); + if (urlCode && urlCode !== stockCode) { + setStockCode(urlCode); + setInputCode(urlCode); + } + }, [searchParams, paramName, stockCode]); + + /** + * 执行搜索 - 更新 stockCode 和 URL + */ + const handleSearch = useCallback(() => { + const trimmedCode = inputCode?.trim(); + + if (trimmedCode && trimmedCode !== stockCode) { + // 触发变化回调(用于追踪) + onStockChange?.(trimmedCode, stockCode); + + // 更新状态 + setStockCode(trimmedCode); + + // 更新 URL 参数 + setSearchParams({ [paramName]: trimmedCode }); + } + }, [inputCode, stockCode, paramName, setSearchParams, onStockChange]); + + /** + * 处理键盘事件 - 回车键触发搜索 + */ + const handleKeyPress = useCallback((e) => { + if (e.key === 'Enter') { + handleSearch(); + } + }, [handleSearch]); + + return { + // 状态 + stockCode, // 当前确认的股票代码 + inputCode, // 输入框中的值(未确认) + + // 操作方法 + setInputCode, // 更新输入框 + handleSearch, // 执行搜索 + handleKeyPress, // 处理回车键 + }; +}; + +export default useCompanyStock;