This commit is contained in:
qiuchenfan 2025-11-18 16:33:56 +08:00
commit 8ddc36b5fc
3 changed files with 53 additions and 31 deletions

View File

@ -4,27 +4,28 @@ export function Header(){
const [currentTime, setCurrentTime] = useState(new Date()); const [currentTime, setCurrentTime] = useState(new Date());
useEffect(() => { useEffect(() => {
// setInterval是 JavaScript 中的一个全局函数,用于重复执行代码
const timer = setInterval(() => { const timer = setInterval(() => {
setCurrentTime(new Date()); setCurrentTime(new Date());
}, 1000); // 每秒更新一次 }, 1000); // 每秒更新一次
// 清理定时器 // 清理定时器
return () => clearInterval(timer); return () => clearInterval(timer);// 只在组件卸载时清理定时器
}, []); }, []); // 只在组件首次挂载时设置定时器
return ( return (
<div <div
className="relative w-[1280px] h-[704px] bg-cover bg-center left-1/2 transform -translate-x-1/2" className="relative w-[1280px] h-[704px] bg-cover bg-center left-1/2 transform -translate-x-1/2"
style={{ backgroundImage: "url('/app/images/header.png')" }} style={{ backgroundImage: "url('/app/images/header.png')" }}
> >
{/* 时间显示 */} {/* 时间显示 只显示日期: "2025/3/15"*/}
<div className="absolute top-4 right-4 mr-40"> <div className="absolute top-4 right-4 mr-40">
<div> <div>
{currentTime.toLocaleString('zh-CN')} {currentTime.toLocaleDateString('zh-CN')}
</div> </div>
</div> </div>
<div className="absolute top-4 right-4 mr-20 cursor-pointer"> <div className="absolute top-4 right-4 mr-20">
<h2 className="text-lg font-bold" onClick={() => console.log('登录')}></h2> <h2 className="text-lg font-bold cursor-pointer" onClick={() => console.log('登录')}></h2>
</div> </div>
<div className="absolute top-4 right-4 mr-5"> <div className="absolute top-4 right-4 mr-5">
<h2 className="text-lg font-bold cursor-pointer" onClick={() => console.log('注册')}></h2> <h2 className="text-lg font-bold cursor-pointer" onClick={() => console.log('注册')}></h2>

View File

@ -2,21 +2,22 @@ import React from 'react';
import { mockNewsData } from './NewsData'; // 导入新闻数据 import { mockNewsData } from './NewsData'; // 导入新闻数据
interface NewsProps { interface NewsProps {
title?: string; title?: string;
description?: string; description?: string;
time?: string; time?: string;
type?: string; type?: string;
url?: string; url?: string;
} }
const NewsItem: React.FC<NewsProps> = ({ title = '', time = '', url = '' }) => { const NewsItem: React.FC<NewsProps> = ({ title = '', time = '', url = '' }) => {
return ( return (
<div> <div className="mb-4">
<div onClick={() => url && window.open(url)} <div
className="flex items-center justify-between hover:text-blue-500 onClick={() => url && window.open(url)}
cursor-pointer w-96"> className="flex items-center justify-between hover:text-blue-600 cursor-pointer transition duration-300 ease-in-out"
<h3 >{title}</h3> >
<p >{time}</p> <h3 className="text-lg font-semibold text-gray-800">{title}</h3>
<p className="text-sm text-gray-500">{time}</p>
</div> </div>
</div> </div>
); );
@ -25,16 +26,40 @@ const NewsItem: React.FC<NewsProps> = ({ title = '', time = '', url = '' }) => {
// 使用新闻数据渲染列表 // 使用新闻数据渲染列表
const NewsList: React.FC = () => { const NewsList: React.FC = () => {
return ( return (
<div> <div className="bg-gray-100 p-6 rounded-lg shadow-md">
<ul className="flex flex-col justify-center items-center h-screen"> <div className="grid grid-cols-1 md:grid-cols-2 gap-8">
{mockNewsData.map((news) => ( {/* 科技新闻 */}
<NewsItem title={news.title} time={news.time} url={news.url} /> <div className="bg-white p-6 rounded-lg shadow-sm">
))} <div className="flex items-center justify-between mb-4">
</ul> <p className="text-xl font-bold text-gray-900"></p>
<button className="bg-blue-500 hover:bg-blue-600 text-white px-4 py-2 rounded-md transition duration-300 ease-in-out">
</button>
</div>
<ul className="space-y-4">
{mockNewsData.map((news, index) => (
<NewsItem key={index} title={news.title} time={news.time} url={news.url} />
))}
</ul>
</div>
{/* 社会新闻 */}
<div className="bg-white p-6 rounded-lg shadow-sm">
<div className="flex items-center justify-between mb-4">
<p className="text-xl font-bold text-gray-900"></p>
<button className="bg-green-500 hover:bg-green-600 text-white px-4 py-2 rounded-md transition duration-300 ease-in-out">
</button>
</div>
<ul className="space-y-4">
{mockNewsData.map((news, index) => (
<NewsItem key={index} title={news.title} time={news.time} url={news.url} />
))}
</ul>
</div>
</div>
</div> </div>
); );
}; };
export default NewsList; export default NewsList;

View File

@ -1,14 +1,9 @@
import { CarouselDemo } from "@/components/untils/Carousel"; import { CarouselDemo } from "@/components/untils/Carousel";
import type { Route } from "./+types/news"; import type { Route } from "./+types/news";
import { Header } from "@/components/header/Header"; import {Header} from "@/components/header/Header";
import { TopNav } from "@/components/header/TopNav"; import {TopNav} from "@/components/header/TopNav";
import NewsList from "@/components/list/NewsList"; import NewsList from "@/components/list/NewsList";
export function meta( ) {
import { C } from "node_modules/react-router/dist/development/index-react-server-client-rcoGPJhU.mjs";
import { Carousel } from "@/ui/carousel";
export function meta({}: Route.MetaArgs) {
return [ return [
{ title: "New React Router App" }, { title: "New React Router App" },
{ name: "description", content: "Welcome to React Router!" }, { name: "description", content: "Welcome to React Router!" },
@ -19,6 +14,7 @@ export default function Home() {
return ( return (
<div> <div>
<CarouselDemo /> <CarouselDemo />
<NewsList />
</div> </div>
); );
} }