Gratulacje - dotarłeś do finałowego projektu modułu "Stan i zdarzenia"! W poprzednich lekcjach poznałeś
useState, obsługę zdarzeń, przepływ danych, useEffect i kontrolowane formularze. Teraz połączysz całą tę wiedzę w jedną spójną aplikację.Twoim zadaniem jest zbudowanie Marsjańskiego Dashboardu Kolonii - interaktywnego panelu zarządzania bazą na Marsie. Ra, twój kosmiczny przewodnik, zebrał wymagania od centrum dowodzenia. Misja: napisać aplikację React, która monitoruje i kontroluje kluczowe systemy kolonii.
Dashboard składa się z czterech połączonych sekcji:
useEffectWszystkie sekcje muszą ze sobą współpracować - zmiany w jednym panelu wpływają na inne.
Każdy system kolonii ma własny stan:
1const [atmosphere, setAtmosphere] = useState(78);
2const [power, setPower] = useState(85);
3const [water, setWater] = useState(62);
4const [temperature, setTemperature] = useState(-10);
5const [crew, setCrew] = useState([
6 { id: 1, name: 'Anna Kowalska', role: 'Komandor' },
7 { id: 2, name: 'Jan Wiśniewski', role: 'Inżynier' }
8]);Każdy system ma przyciski do regulacji. Pamiętaj o zakresach bezpiecznych:
1const handleAtmosphereBoost = () => {
2 setAtmosphere(prev => Math.min(100, prev + 5));
3 addLogEntry('Zwiększono poziom O2 o 5%');
4};Formularz do dodawania nowych astronautów do załogi:
1const [newCrew, setNewCrew] = useState({ name: '', role: '' });
2
3const handleCrewChange = (event) => {
4 const { name, value } = event.target;
5 setNewCrew(prev => ({ ...prev, [name]: value }));
6};
7
8const handleCrewSubmit = (event) => {
9 event.preventDefault();
10 if (!newCrew.name.trim()) return;
11 setCrew(prev => [...prev, { id: Date.now(), ...newCrew }]);
12 setNewCrew({ name: '', role: '' });
13};Monitoring stanu krytycznego:
1useEffect(() => {
2 if (power < 20) {
3 addLogEntry('ALARM: Krytycznie niski poziom zasilania!');
4 }
5}, [power]);Symulacja auto-degradacji z cleanup:
1useEffect(() => {
2 const interval = setInterval(() => {
3 setWater(prev => Math.max(0, prev - 1));
4 setTemperature(prev => prev - 0.5);
5 }, 5000);
6
7 return () => clearInterval(interval);
8}, []);Stan dziennika i funkcja
addLogEntry żyją w komponencie głównym i są przekazywane w dół:1function MarsColonyDashboard() {
2 const [log, setLog] = useState([]);
3
4 const addLogEntry = (message) => {
5 setLog(prev => [
6 { id: Date.now(), time: new Date().toLocaleTimeString(), message },
7 ...prev
8 ].slice(0, 20));
9 };
10
11 return (
12 <div>
13 <SystemsPanel onLog={addLogEntry} />
14 <CrewPanel onLog={addLogEntry} />
15 <EventLog entries={log} />
16 </div>
17 );
18}1MarsColonyDashboard (stan główny)
2├── SystemsPanel (props: wartości + callbacki)
3│ └── SystemGauge × 4
4├── CrewPanel (props: crew, formularz, callbacki)
5│ ├── CrewList
6│ └── CrewForm
7└── EventLog (props: entries)Dane płyną w dół przez props, zdarzenia w górę przez callbacki -- serce jednokierunkowego przepływu danych w React!
Powodzenia, pilotze! Ten projekt to Twoja pierwsza prawdziwa misja w świecie React -- pokaż, że potrafisz zarządzać kolonią na Marsie!