重构目标: 减少 HomeNavbar 不必要的重新渲染 Phase 1 完成: ✅ 提取 BrandLogo.js (51行) - Logo 和品牌文字 ✅ 提取 LoginButton.js (37行) - 登录/注册按钮 ✅ 提取 CalendarButton.js (65行) - 投资日历按钮+Modal ✅ 提取 ThemeToggleButton.js (33行) - 主题切换按钮 优化成果: - HomeNavbar.js: 1623行 → 1573行 (↓ 50行, -3%) - 4个独立组件使用 React.memo 包裹 - 组件状态内部管理,不影响父组件 - CalendarModal 状态从主组件移除 性能收益: - 这些组件现在独立渲染,不受父组件影响 - 为后续 Phase 2-6 优化奠定基础 目录结构: src/components/Navbars/ ├── HomeNavbar.js (1573行) └── components/ ├── BrandLogo.js ├── LoginButton.js ├── CalendarButton.js └── ThemeToggleButton.js 下一步: Phase 2 - 提取订阅相关组件 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
38 lines
906 B
JavaScript
38 lines
906 B
JavaScript
// src/components/Navbars/components/LoginButton.js
|
|
import React, { memo } from 'react';
|
|
import { Button } from '@chakra-ui/react';
|
|
import { useAuthModal } from '../../../hooks/useAuthModal';
|
|
|
|
/**
|
|
* 登录/注册按钮组件
|
|
*
|
|
* 性能优化:
|
|
* - 使用 memo 避免父组件重新渲染时的不必要更新
|
|
* - 纯展示组件,无复杂逻辑
|
|
*
|
|
* @returns {JSX.Element}
|
|
*/
|
|
const LoginButton = memo(() => {
|
|
const { openAuthModal } = useAuthModal();
|
|
|
|
return (
|
|
<Button
|
|
colorScheme="blue"
|
|
variant="solid"
|
|
size="sm"
|
|
borderRadius="full"
|
|
onClick={() => openAuthModal()}
|
|
_hover={{
|
|
transform: "translateY(-1px)",
|
|
boxShadow: "md"
|
|
}}
|
|
>
|
|
登录 / 注册
|
|
</Button>
|
|
);
|
|
});
|
|
|
|
LoginButton.displayName = 'LoginButton';
|
|
|
|
export default LoginButton;
|