Porozmawiaj z LLM na temat hooka useContext i przetestuj przykłady. Zacznij od prompta:
Stwórz przykładową aplikację w React używającą Vite. Chodzi o pokazanie, kiedy warto użyć hooka useContext zamiast przekazywania propsów.
Wymagania:
1. Pokaż co najmniej jeden przypadek użycia useContext (np. dane użytkownika, motyw, język aplikacji, ustawienia globalne).
2. Pokaż prosty przykład "przed" użyciem useContext, gdzie dane są przekazywane przez propsy w kilku poziomach komponentów.
3. Pokaż "po" użyciu useContext – te same dane są dostępne w głębokich komponentach bez props drilling.
4. Kod powinien być czytelny, działający w projekcie Vite + React.
5. Dodaj komentarze wyjaśniające, dlaczego w danym miejscu użycie useContext jest przydatne.
Przeanalizuj poniższy przykład, a następnie go uruchom. Czy działa zgodnie z oczekiwaniem?
import React, { useState } from"react";functionApp() {const [count, setCount] =useState(0);consthandleIncrement= () => {// Błąd: oba wywołania używają starej wartości countsetCount(count +1);setCount(count +1); };return ( <divstyle={{ padding: "20px" }}> <h1>Błędne zwiększanie licznika</h1> <p>Licznik: {count}</p> <buttononClick={handleIncrement}>Zwiększ dwa razy</button> </div> );}exportdefault App;
React grupuje wiele zmian stanu lub propsów w jednym renderze, zamiast renderować komponent osobno po każdej zmianie. Jeśli w jednej funkcji wywołasz setState kilka razy, React nie wykona tyle renderów, ile wywołań tylko zrobi tylko jeden render na koniec. Poprawna wersja:
consthandleIncrement= () => {// Poprawnie: każda aktualizacja korzysta z aktualnej wartościsetCount(prev=> prev +1);setCount(prev=> prev +1); };
Przykład z tablicą
import React, { useState } from"react";functionApp() {const [items, setItems] =useState([]);constaddItems= () => {// Błąd: oba wywołania używają starej wartości itemssetItems([...items, "A"]);setItems([...items, "B"]); };return ( <divstyle={{ padding: "20px" }}> <h1>Błędne dodawanie elementów</h1> <buttononClick={addItems}>Dodaj A i B</button> <ul> {items.map((item, index) => ( <likey={index}>{item}</li> ))} </ul> </div> );}exportdefault App;
Napisz poprawną wersję addItems wykorzystującą prev
Przykład poniżej pokazuje, że wygląd Bootstrapa 5 można zmieniać (bez SCSS), korzystając z kaskady CSS oraz zmiennych CSS wbudowanych w framework.
Nadpisanie zmiennych globalnych (:root) zmienia cały motyw aplikacji, natomiast nadpisanie zmiennych w kontenerze działa tylko lokalnie, w obrębie danej sekcji. Nadpisywanie zmiennych komponentu (np. przycisków) jest bezpieczniejsze i bardziej przewidywalne niż klasyczne nadpisywanie właściwości typu background-color. Spróbuj zmieniać wartości zmiennych i poprzenosić między style sekcjami, żeby zobaczyć, jak kaskada i dziedziczenie CSS wpływają na wygląd.