perf: Tab 容器组件优化

- TabPanelContainer: Loading 颜色改为金色 #D4AF37,与黑金主题一致
- SubTabContainer: 添加 memo 和 displayName
- 子 Tab 组件: StrategyTab/BusinessTab/ValueChainTab/DevelopmentTab 添加 memo 和 displayName
- TabContainer: 移除未使用的 showDivider 参数

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

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
zdl
2025-12-12 12:02:15 +08:00
parent b8cd520014
commit e049429b09
9 changed files with 26 additions and 20 deletions

View File

@@ -17,7 +17,7 @@
* ``` * ```
*/ */
import React, { useState, useCallback } from 'react'; import React, { useState, useCallback, memo } from 'react';
import { import {
Box, Box,
Tabs, Tabs,
@@ -97,7 +97,7 @@ export interface SubTabContainerProps {
isLazy?: boolean; isLazy?: boolean;
} }
const SubTabContainer: React.FC<SubTabContainerProps> = ({ const SubTabContainer: React.FC<SubTabContainerProps> = memo(({
tabs, tabs,
componentProps = {}, componentProps = {},
defaultIndex = 0, defaultIndex = 0,
@@ -190,6 +190,8 @@ const SubTabContainer: React.FC<SubTabContainerProps> = ({
</Tabs> </Tabs>
</Box> </Box>
); );
}; });
SubTabContainer.displayName = 'SubTabContainer';
export default SubTabContainer; export default SubTabContainer;

View File

@@ -49,7 +49,6 @@ export const DEFAULT_CONFIG = {
themePreset: 'blackGold' as ThemePreset, themePreset: 'blackGold' as ThemePreset,
isLazy: true, isLazy: true,
size: 'lg' as const, size: 'lg' as const,
showDivider: true,
borderRadius: 'lg', borderRadius: 'lg',
shadow: 'lg', shadow: 'lg',
panelPadding: 0, panelPadding: 0,

View File

@@ -54,7 +54,6 @@ const TabContainer: React.FC<TabContainerProps> = ({
themeColors: customThemeColors, themeColors: customThemeColors,
isLazy = DEFAULT_CONFIG.isLazy, isLazy = DEFAULT_CONFIG.isLazy,
size = DEFAULT_CONFIG.size, size = DEFAULT_CONFIG.size,
showDivider = DEFAULT_CONFIG.showDivider,
borderRadius = DEFAULT_CONFIG.borderRadius, borderRadius = DEFAULT_CONFIG.borderRadius,
shadow = DEFAULT_CONFIG.shadow, shadow = DEFAULT_CONFIG.shadow,
panelPadding = DEFAULT_CONFIG.panelPadding, panelPadding = DEFAULT_CONFIG.panelPadding,

View File

@@ -62,8 +62,6 @@ export interface TabContainerProps {
isLazy?: boolean; isLazy?: boolean;
/** Tab 尺寸 */ /** Tab 尺寸 */
size?: 'sm' | 'md' | 'lg'; size?: 'sm' | 'md' | 'lg';
/** 是否显示分割线 */
showDivider?: boolean;
/** 容器圆角 */ /** 容器圆角 */
borderRadius?: string; borderRadius?: string;
/** 容器阴影 */ /** 容器阴影 */

View File

@@ -49,7 +49,7 @@ const LoadingState: React.FC<{ message: string; height: string }> = ({
}) => ( }) => (
<Center h={height}> <Center h={height}>
<VStack spacing={3}> <VStack spacing={3}>
<Spinner size="lg" color="blue.500" thickness="3px" /> <Spinner size="lg" color="#D4AF37" thickness="3px" />
<Text fontSize="sm" color="gray.500"> <Text fontSize="sm" color="gray.500">
{message} {message}
</Text> </Text>

View File

@@ -4,7 +4,7 @@
* 包含:业务结构分析 + 业务板块详情 * 包含:业务结构分析 + 业务板块详情
*/ */
import React from 'react'; import React, { memo } from 'react';
import TabPanelContainer from '@components/TabPanelContainer'; import TabPanelContainer from '@components/TabPanelContainer';
import { BusinessStructureCard, BusinessSegmentsCard } from '../components'; import { BusinessStructureCard, BusinessSegmentsCard } from '../components';
import type { ComprehensiveData } from '../types'; import type { ComprehensiveData } from '../types';
@@ -16,7 +16,7 @@ export interface BusinessTabProps {
onToggleSegment: (index: number) => void; onToggleSegment: (index: number) => void;
} }
const BusinessTab: React.FC<BusinessTabProps> = ({ const BusinessTab: React.FC<BusinessTabProps> = memo(({
comprehensiveData, comprehensiveData,
cardBg, cardBg,
expandedSegments, expandedSegments,
@@ -45,6 +45,8 @@ const BusinessTab: React.FC<BusinessTabProps> = ({
)} )}
</TabPanelContainer> </TabPanelContainer>
); );
}; });
BusinessTab.displayName = 'BusinessTab';
export default BusinessTab; export default BusinessTab;

View File

@@ -4,7 +4,7 @@
* 包含:关键因素 + 发展时间线Grid 布局) * 包含:关键因素 + 发展时间线Grid 布局)
*/ */
import React from 'react'; import React, { memo } from 'react';
import { Grid, GridItem } from '@chakra-ui/react'; import { Grid, GridItem } from '@chakra-ui/react';
import TabPanelContainer from '@components/TabPanelContainer'; import TabPanelContainer from '@components/TabPanelContainer';
import { KeyFactorsCard, TimelineCard } from '../components'; import { KeyFactorsCard, TimelineCard } from '../components';
@@ -15,7 +15,7 @@ export interface DevelopmentTabProps {
cardBg?: string; cardBg?: string;
} }
const DevelopmentTab: React.FC<DevelopmentTabProps> = ({ const DevelopmentTab: React.FC<DevelopmentTabProps> = memo(({
keyFactorsData, keyFactorsData,
cardBg, cardBg,
}) => { }) => {
@@ -42,6 +42,8 @@ const DevelopmentTab: React.FC<DevelopmentTabProps> = ({
</Grid> </Grid>
</TabPanelContainer> </TabPanelContainer>
); );
}; });
DevelopmentTab.displayName = 'DevelopmentTab';
export default DevelopmentTab; export default DevelopmentTab;

View File

@@ -4,7 +4,7 @@
* 包含:核心定位 + 战略分析 + 竞争地位分析 * 包含:核心定位 + 战略分析 + 竞争地位分析
*/ */
import React from 'react'; import React, { memo } from 'react';
import TabPanelContainer from '@components/TabPanelContainer'; import TabPanelContainer from '@components/TabPanelContainer';
import { import {
CorePositioningCard, CorePositioningCard,
@@ -18,7 +18,7 @@ export interface StrategyTabProps {
cardBg?: string; cardBg?: string;
} }
const StrategyTab: React.FC<StrategyTabProps> = ({ const StrategyTab: React.FC<StrategyTabProps> = memo(({
comprehensiveData, comprehensiveData,
cardBg, cardBg,
}) => { }) => {
@@ -46,6 +46,8 @@ const StrategyTab: React.FC<StrategyTabProps> = ({
)} )}
</TabPanelContainer> </TabPanelContainer>
); );
}; });
StrategyTab.displayName = 'StrategyTab';
export default StrategyTab; export default StrategyTab;

View File

@@ -4,7 +4,7 @@
* 包含:产业链分析(层级视图 + Sankey 流向图) * 包含:产业链分析(层级视图 + Sankey 流向图)
*/ */
import React from 'react'; import React, { memo } from 'react';
import TabPanelContainer from '@components/TabPanelContainer'; import TabPanelContainer from '@components/TabPanelContainer';
import { ValueChainCard } from '../components'; import { ValueChainCard } from '../components';
import type { ValueChainData } from '../types'; import type { ValueChainData } from '../types';
@@ -14,7 +14,7 @@ export interface ValueChainTabProps {
cardBg?: string; cardBg?: string;
} }
const ValueChainTab: React.FC<ValueChainTabProps> = ({ const ValueChainTab: React.FC<ValueChainTabProps> = memo(({
valueChainData, valueChainData,
cardBg, cardBg,
}) => { }) => {
@@ -25,6 +25,8 @@ const ValueChainTab: React.FC<ValueChainTabProps> = ({
)} )}
</TabPanelContainer> </TabPanelContainer>
); );
}; });
ValueChainTab.displayName = 'ValueChainTab';
export default ValueChainTab; export default ValueChainTab;