feat: StockQuoteCard 根据股票代码获取真实行情数据

- 新增 useStockQuote Hook 获取股票行情
- Company 页面使用 Hook 并传递数据给 StockQuoteCard
- StockQuoteCard 处理 null 数据显示骨架屏
- 股票代码变化时自动刷新行情数据

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
zdl
2025-12-10 11:00:03 +08:00
parent 0997cd9992
commit 8786fa7b06
3 changed files with 120 additions and 9 deletions

View File

@@ -23,7 +23,6 @@ import { Share2 } from 'lucide-react';
import FavoriteButton from '@components/FavoriteButton';
import type { StockQuoteCardProps } from './types';
import { mockStockQuoteData } from './mockData';
/**
* 格式化价格显示
@@ -52,7 +51,7 @@ const formatNetInflow = (value: number): string => {
};
const StockQuoteCard: React.FC<StockQuoteCardProps> = ({
data = mockStockQuoteData,
data,
isLoading = false,
isInWatchlist = false,
isWatchlistLoading = false,
@@ -74,19 +73,25 @@ const StockQuoteCard: React.FC<StockQuoteCardProps> = ({
// 涨跌颜色(红涨绿跌)
const upColor = '#F44336'; // 涨 - 红色
const downColor = '#4CAF50'; // 跌 - 绿色
const priceColor = data.changePercent >= 0 ? upColor : downColor;
const inflowColor = data.mainNetInflow >= 0 ? upColor : downColor;
if (isLoading) {
// 加载中或无数据时显示骨架屏
if (isLoading || !data) {
return (
<Card bg={cardBg} shadow="sm" borderWidth="1px" borderColor={borderColor}>
<CardBody>
<Skeleton height="120px" />
<VStack spacing={4} align="stretch">
<Skeleton height="30px" width="200px" />
<Skeleton height="60px" />
<Skeleton height="80px" />
</VStack>
</CardBody>
</Card>
);
}
const priceColor = data.changePercent >= 0 ? upColor : downColor;
const inflowColor = data.mainNetInflow >= 0 ? upColor : downColor;
return (
<Card bg={cardBg} shadow="sm" borderWidth="1px" borderColor={borderColor}>
<CardBody>
@@ -97,7 +102,7 @@ const StockQuoteCard: React.FC<StockQuoteCardProps> = ({
<Text fontSize="22px" fontWeight="bold" color={valueColor}>
{data.name}{data.code}
</Text>
{data.indexTags.length > 0 && (
{data.indexTags?.length > 0 && (
<>
<Text color={labelColor} fontSize="22px" fontWeight="light">|</Text>
<Text fontSize="16px" color={labelColor}>
@@ -128,7 +133,7 @@ const StockQuoteCard: React.FC<StockQuoteCardProps> = ({
/>
</Tooltip>
<Text fontSize="14px" color={labelColor}>
{data.updateTime.split(' ')[1]}
{data.updateTime?.split(' ')[1] || '--:--'}
</Text>
</HStack>
</Flex>