blob: 503ca6b5ea419c7f61dc994131829f1a4e44aba2 [file] [log] [blame]
蒋大力498c1562025-06-08 13:01:39 +08001import React, { useState } from 'react';
2import { Heart, MessageCircle, Share2, Bookmark, Search, User, Home, Compass, Plus, Bell } from 'lucide-react';
3import './App.css';
4
5function App() {
6 const [posts, setPosts] = useState([
7 {
8 id: 1,
9 username: "创作者小红",
10 avatar: "/api/placeholder/40/40",
11 image: "/api/placeholder/300/400",
12 title: "今日OOTD分享 🌸",
13 content: "春日温柔穿搭,粉色系永远不会出错!",
14 likes: 1234,
15 comments: 89,
16 isLiked: false,
17 isSaved: false
18 },
19 {
20 id: 2,
21 username: "美食达人",
22 avatar: "/api/placeholder/40/40",
23 image: "/api/placeholder/300/400",
24 title: "超简单的蛋糕制作 🍰",
25 content: "零失败率的草莓蛋糕,新手也能做出完美作品!",
26 likes: 2567,
27 comments: 156,
28 isLiked: false,
29 isSaved: false
30 },
31 {
32 id: 3,
33 username: "旅行摄影师",
34 avatar: "/api/placeholder/40/40",
35 image: "/api/placeholder/300/400",
36 title: "云南大理古城 📸",
37 content: "漫步在石板路上,感受千年古城的魅力",
38 likes: 3421,
39 comments: 234,
40 isLiked: true,
41 isSaved: false
42 }
43 ]);
44
45 const [activeTab, setActiveTab] = useState('home');
46
47 const handleLike = (postId) => {
48 setPosts(posts.map(post =>
49 post.id === postId
50 ? { ...post, isLiked: !post.isLiked, likes: post.isLiked ? post.likes - 1 : post.likes + 1 }
51 : post
52 ));
53 };
54
55 const handleSave = (postId) => {
56 setPosts(posts.map(post =>
57 post.id === postId
58 ? { ...post, isSaved: !post.isSaved }
59 : post
60 ));
61 };
62
63 return (
64 <div className="app">
65 {/* Header */}
66 <header className="header">
67 <div className="header-content">
68 <h1 className="logo">小红书</h1>
69 <div className="search-bar">
70 <Search size={20} />
71 <input type="text" placeholder="搜索你感兴趣的内容" />
72 </div>
73 <div className="header-actions">
74 <Bell size={24} />
75 <User size={24} />
76 </div>
77 </div>
78 </header>
79
80 {/* Main Content */}
81 <main className="main-content">
82 <div className="posts-container">
83 {posts.map(post => (
84 <div key={post.id} className="post-card">
85 <div className="post-image">
86 <img src={post.image} alt={post.title} />
87 </div>
88 <div className="post-content">
89 <h3 className="post-title">{post.title}</h3>
90 <p className="post-description">{post.content}</p>
91 <div className="post-author">
92 <img src={post.avatar} alt={post.username} className="author-avatar" />
93 <span className="author-name">{post.username}</span>
94 </div>
95 <div className="post-actions">
96 <button
97 className={`action-btn ${post.isLiked ? 'liked' : ''}`}
98 onClick={() => handleLike(post.id)}
99 >
100 <Heart size={16} fill={post.isLiked ? '#ff4757' : 'none'} />
101 <span>{post.likes}</span>
102 </button>
103 <button className="action-btn">
104 <MessageCircle size={16} />
105 <span>{post.comments}</span>
106 </button>
107 <button className="action-btn">
108 <Share2 size={16} />
109 </button>
110 <button
111 className={`action-btn ${post.isSaved ? 'saved' : ''}`}
112 onClick={() => handleSave(post.id)}
113 >
114 <Bookmark size={16} fill={post.isSaved ? '#ffa502' : 'none'} />
115 </button>
116 </div>
117 </div>
118 </div>
119 ))}
120 </div>
121 </main>
122
123 {/* Bottom Navigation */}
124 <nav className="bottom-nav">
125 <button
126 className={`nav-btn ${activeTab === 'home' ? 'active' : ''}`}
127 onClick={() => setActiveTab('home')}
128 >
129 <Home size={24} />
130 <span>首页</span>
131 </button>
132 <button
133 className={`nav-btn ${activeTab === 'discover' ? 'active' : ''}`}
134 onClick={() => setActiveTab('discover')}
135 >
136 <Compass size={24} />
137 <span>发现</span>
138 </button>
139 <button
140 className={`nav-btn ${activeTab === 'create' ? 'active' : ''}`}
141 onClick={() => setActiveTab('create')}
142 >
143 <Plus size={24} />
144 <span>创作</span>
145 </button>
146 <button
147 className={`nav-btn ${activeTab === 'profile' ? 'active' : ''}`}
148 onClick={() => setActiveTab('profile')}
149 >
150 <User size={24} />
151 <span>我</span>
152 </button>
153 </nav>
154 </div>
155 );
156}
157
158export default App;