test/1114/app/components/weather/WeatherCard.tsx

53 lines
2.0 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* WeatherCard.tsx - 统一的天气卡片组件
* 集成搜索表单、天气展示、搜索历史于一体
*
* 学习要点:
* - 直接使用 store无需通过 props 传递
* - 组件更加独立和可复用
* - 减少 prop drilling
*/
import React, { useEffect } from 'react';
import { WeatherSearchForm } from './WeatherSearchForm';
import { WeatherDisplay } from './WeatherDisplay';
import { WeatherDetailsGrid } from './WeatherDetailsGrid';
import { useWeatherStore } from '@/store/weatherStore';
import {Cloud} from "lucide-react";
export function WeatherCard() {
const { currentWeather } = useWeatherStore();
return (
<div className="relative overflow-hidden rounded-3xl bg-white/80 dark:bg-slate-800/80 backdrop-blur-xl border border-slate-200/80 dark:border-slate-700/80 shadow-2xl shadow-slate-200/50 dark:shadow-slate-900/50 transition-all duration-300">
{/* 搜索表单区域 */}
<WeatherSearchForm />
{/* 天气内容区域 */}
{currentWeather ? (
<div className="p-6">
<WeatherDisplay />
<WeatherDetailsGrid />
</div>
) : (
<div className="flex flex-col items-center justify-center py-16 px-6 text-center">
<div className="relative mb-6">
<div className="absolute inset-0 bg-gradient-to-br from-blue-400 to-cyan-400 rounded-full opacity-10 blur-2xl"></div>
<div className="relative w-20 h-20 rounded-full bg-gradient-to-br from-blue-100 to-cyan-100 dark:from-blue-900/30 dark:to-cyan-900/30 flex items-center justify-center">
<Cloud className="w-10 h-10 text-blue-500 dark:text-blue-400" />
</div>
</div>
<h3 className="text-lg font-semibold text-slate-700 dark:text-slate-200 mb-2">
</h3>
<p className="text-sm text-slate-500 dark:text-slate-400">
</p>
</div>
)}
</div>
);
}