W React komponenty muszą reagować na zmiany danych i aktualizować interfejs użytkownika. Zwykłe zmienne nie powodują ponownego renderowania komponentu po zmianie wartości, dlatego nie nadają się do przechowywania stanu. Hook useState rozwiązuje ten problem, umożliwiając przechowywanie danych, których zmiana automatycznie aktualizuje widok. Pobawmy się tym.
Utwórz projekt za pomocą Vite i dodaj poniższy kod:
App.jsx
import Box from"./components/Box";import { useState } from"react";functionApp() {// Deklaracja stanu 'licznik' oraz funkcji aktualizującej ten stan// Początkowa wartość licznika wynosi 0// Dziwna składnia wynika z użycia destructuringu:// useState() zwraca tablicę dwuelementową - dajemy nazwy tym elementomconst [licznik, setLicznik] =useState(0);// funkcja anonimowa strzałkowa przypisana do stałej jest// równoważna z zakomentowaną wersją :)//// function dodaj1() {// setLicznik(licznik + 1);// }constdodaj1= () => {setLicznik(licznik +1) };return ( <> <h2>Licznik: {licznik}</h2> <Boxtext="Adam"action={dodaj1} /> <Boxtext="Ewa"action={dodaj1} /> <Boxtext="Stefan"action={dodaj1} /> <Boxtext="Edek"action={dodaj1} /> </> );}exportdefault App;
Dodaj w Boxach przyciski pomniejszające wspólny licznik.
Dodaj indywidualny licznik do każdego Boxa wraz z dodatkowym przyciskiem powiększającym go. W tym celu przyda się nowa zmienna dla stanu komponentu Box.
Zmień działanie przycisków tak by jeden przycisk powiększał oba liczniki: indywidualny oraz wspólny.
Wybierz bardziej zrozumiały dla Ciebie wariant i przerób:
Zamień miejscami kolumny
Podziel wąską kolumnę na 2 oddzielne ramki (jedna pod drugą)
Zmień szerokości
Dodaj trzecią kolumnę
Zmień domyślną kolejność bloków podczas wyświetlania na wąskim ekranie
Pomocne prompty:
Przygotuj zestawienie klas Bootstrapa związanych z layoutem strony
Przygotuj prostą stronę z responsywnym layoutem (nagłówek=obrazek, stopka=tekst, main i nav=lista) opartą wyłącznie na klasach bootstrapa. Ma być tak prosta jak to możliwe, ale w miarę ładna (marginesy, obramowania). Stronę przygotuj na 2 sposoby.
Wyjaśnij breakpointy w Bootstrapie 5. Podaj wszystkie dostępne breakpointy wraz z nazwą, prefiksem i minimalną szerokością ekranu. Pokaż przykłady klas z wyjaśnieniami. Wyjaśnij zasadę mobile first. Uwzględnij najczęstsze błędy początkujących.
Dopytaj AI czym jest Bootstrap, ale koniecznie przyznaj się, że uczysz się dopiero HTML i CSS, żeby nie popłynął w funkcjonalność JS. Poproś o wyjaśnienie klas z przykładów albo o wygenerowanie tabeli najpotrzebniejszych klas Bootstrapa
Przerób poniższy kod tak, żeby wyglądał jak sensowna strona internetowa. Przerabiaj samodzielnie traktując AI jako asystenta a nie jako guru!
Powstałą stronę dodaj do portfolio 🙂
<!DOCTYPE html><htmllang="pl"><head> <metacharset="UTF-8"> <title>Bootstrap – Zakładki i Karty</title> <metaname="viewport"content="width=device-width, initial-scale=1"> <!-- Bootstrap 5 CDN --> <linkhref="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css"rel="stylesheet"></head><body><divclass="container my-4"> <divclass="row"> <!-- GŁÓWNA KOLUMNA --> <divclass="col-lg-8 mb-4"> <!-- Zakładki --> <ulclass="nav nav-tabs"id="myTab"role="tablist"> <liclass="nav-item"role="presentation"> <buttonclass="nav-link active"data-bs-toggle="tab"data-bs-target="#tabela"type="button"> Tabela </button> </li> <liclass="nav-item"role="presentation"> <buttonclass="nav-link"data-bs-toggle="tab"data-bs-target="#galeria"type="button"> Galeria </button> </li> <liclass="nav-item"role="presentation"> <buttonclass="nav-link"data-bs-toggle="tab"data-bs-target="#karuzela"type="button"> Karuzela </button> </li> </ul> <!-- Zawartość zakładek --> <divclass="tab-content border border-top-0 p-3"> <!-- TAB 1: TABELA --> <divclass="tab-pane fade show active"id="tabela"> <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec a vulputate est. Donec tristique placerat finibus. Praesent arcu sapien, aliquam quis massa ullamcorper, feugiat dignissim libero. In consectetur mauris non finibus sollicitudin. Quisque vitae facilisis urna, vel sodales massa. Cras tortor nunc, pellentesque quis augue ac, euismod scelerisque tellus. Etiam purus tellus, posuere a aliquet nec, posuere et diam.</p> <p>Aliquam posuere dignissim orci, ut venenatis eros sollicitudin id. Morbi pharetra aliquet eleifend. Mauris sollicitudin feugiat quam dignissim bibendum. Integer congue risus hendrerit risus ullamcorper, sed semper ligula sodales. Proin nisl enim, faucibus ut ornare id, varius id nibh. Nulla lorem tortor, tincidunt quis nulla egestas, feugiat egestas sem. Nunc sollicitudin auctor odio, ut luctus elit malesuada eu. Maecenas suscipit augue et libero commodo porta. </p> <tableclass="table table-striped table-responsive"> <thead> <tr><th>#</th><th>Nazwa</th><th>Status</th></tr> </thead> <tbody> <tr><td>1</td><td>Element A</td><td>Aktywny</td></tr> <tr><td>2</td><td>Element B</td><td>Nieaktywny</td></tr> <tr><td>3</td><td>Element C</td><td>Aktywny</td></tr> </tbody> </table> <p>Aliquam posuere dignissim orci, ut venenatis eros sollicitudin id. Morbi pharetra aliquet eleifend. Mauris sollicitudin feugiat quam dignissim bibendum. Integer congue risus hendrerit risus ullamcorper, sed semper ligula sodales. Proin nisl enim, faucibus ut ornare id, varius id nibh. Nulla lorem tortor, tincidunt quis nulla egestas, feugiat egestas sem. Nunc sollicitudin auctor odio, ut luctus elit malesuada eu. Maecenas suscipit augue et libero commodo porta. </p> </div> <!-- TAB 2: GALERIA --> <divclass="tab-pane fade"id="galeria"> <divclass="row g-3"> <divclass="col-6 col-md-4"> <imgsrc="https://picsum.photos/300?1"class="img-fluid rounded"> <h6>Lorem</h6> </div> <divclass="col-6 col-md-4"> <imgsrc="https://picsum.photos/300?2"class="img-fluid rounded"> <h6>Dolor</h6> </div> <divclass="col-6 col-md-4"> <imgsrc="https://picsum.photos/300?3"class="img-fluid rounded"> <h6>Ipsum</h6> </div> </div> </div> <!-- TAB 3: KARUZELA --> <divclass="tab-pane fade"id="karuzela"> <divid="carouselExample"class="carousel slide"data-bs-ride="carousel"> <divclass="carousel-inner"> <divclass="carousel-item active"> <imgsrc="https://picsum.photos/800/300?4"class="d-block w-100"> <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec a vulputate est. Donec tristique placerat finibus. Praesent arcu sapien, aliquam quis massa ullamcorper, feugiat dignissim libero. In consectetur mauris non finibus sollicitudin. Quisque vitae facilisis urna, vel sodales massa. Cras tortor nunc, pellentesque quis augue ac, euismod scelerisque tellus. Etiam purus tellus, posuere a aliquet nec, posuere et diam.</p> </div> <divclass="carousel-item"> <imgsrc="https://picsum.photos/800/300?5"class="d-block w-100"> <p>Aliquam posuere dignissim orci, ut venenatis eros sollicitudin id. Morbi pharetra aliquet eleifend. Mauris sollicitudin feugiat quam dignissim bibendum. Integer congue risus hendrerit risus ullamcorper, sed semper ligula sodales. Proin nisl enim, faucibus ut ornare id, varius id nibh. Nulla lorem tortor, tincidunt quis nulla egestas, feugiat egestas sem. Nunc sollicitudin auctor odio, ut luctus elit malesuada eu. Maecenas suscipit augue et libero commodo porta. </p> </div> <divclass="carousel-item"> <imgsrc="https://picsum.photos/800/300?6"class="d-block w-100"> <p>Quisque scelerisque rhoncus cursus. Donec in fringilla lorem, eu molestie orci. Praesent diam odio, cursus in elit vitae, suscipit convallis mi. Mauris aliquam purus a tempus lobortis. Maecenas quam mauris, condimentum ac elementum sit amet, finibus id sapien. Vestibulum ac rutrum quam. Phasellus scelerisque varius enim nec euismod. Quisque pretium dolor nec orci condimentum, consectetur porta diam pretium.</p> </div> </div> <buttonclass="carousel-control-prev"type="button"data-bs-target="#carouselExample"data-bs-slide="prev"> <spanclass="carousel-control-prev-icon"></span> </button> <buttonclass="carousel-control-next"type="button"data-bs-target="#carouselExample"data-bs-slide="next"> <spanclass="carousel-control-next-icon"></span> </button> </div> </div> </div> </div> <!-- BOCZNA KOLUMNA --> <divclass="col-lg-4"> <divclass="card mb-3"> <divclass="card-body"> <h5class="card-title">Karta 1</h5> <pclass="card-text">Krótki opis pierwszej karty.</p> </div> </div> <divclass="card mb-3"> <divclass="card-body"> <h5class="card-title">Karta 2</h5> <pclass="card-text">Krótki opis drugiej karty.</p> </div> </div> <divclass="card"> <divclass="card-body"> <h5class="card-title">Karta 3</h5> <pclass="card-text">Krótki opis trzeciej karty.</p> </div> </div> </div> </div></div><!-- Bootstrap JS --><scriptsrc="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script></body></html>