Strona główna / Artykuły / Renderowanie warunkowe i list w React bez dodatkowych narzędzi.

Renderowanie warunkowe i list w React bez dodatkowych narzędzi.

Jasne gałęzie, stabilne klucze listy oraz wzory, które utrzymują czytelność warunkowej logiki interfejsu użytkownika, gdy komponenty w aplikacjach React produkcyjnych przekraczają proste przykłady.

1963 słów

To przewodnictwo odbudowuje funkcjonalną ścieżkę dla: warunkowego renderowania w React oraz renderowania list — a także prawdziwej natury właściwości key. Skupiamy się na umowach, sprawdzaniach oraz kodzie, który można bez problemu dodać do repozytorium, nie musząc zgadywać intencji twórcy. Aby uzyskać ogólny obraz, zdefiniuj wprowadzenia, osobę odpowiedzialną za dany krok oraz kryteria zakończenia przed modyfikacją kodu. Operatorzy powinni móc ponownie uruchomić dany krok od znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Zapisuj czas trwania i koszty obok funkcjonalnych wyników. Wczesna widoczność zapobiega nieoczekiwanym rachunkom w środowiskach współdzielonych.

Warunkowe renderowanie — Czy pokazać, czy nie

Dla warunkowego renderowania — aby określić, czy coś ma być pokazane, czy nie, należy zdefiniować dane wejściowe, osobę odpowiedzialną za dany krok oraz kryteria zakończenia przed modyfikacją kodu. Operatorzy powinni móc ponownie uruchomić dany krok od znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Konfigurację należy przechowywać poza kodem aplikacji. Pliki środowiskowe, magazyny tajnych danych oraz flagi funkcjonalne powinny znajdować się w jednym miejscu, które operatorzy mogą audytować. Typy należy umieszczać obok komponentów i utrzymywać ograniczoną liczbę właściwości. Zbyt duża liczba właściwości stanowi dług, którego TypeScript ma na celu zapobieganie.

Podejście 1 — Rozgałęzienie za pomocą if i zwrócenie null, gdy nic nie ma być wyświetlone

Dla podejścia 1 — gałąź z if, przy czym zwraca się null, gdy nic nie rysuje się, należy najpierw zdefiniować dane wejściowe, osobę odpowiedzialną za ten krok oraz kryteria zakończenia przed modyfikacją kodu. Operatorzy powinni móc ponownie uruchomić ten krok od znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Należy udokumentować zarówno ścieżkę prawidłowego działania, jak i ścieżkę naprawczą. Próby ponowne oraz obsługa wiadomości błędnych stanowią część produktu. Typy należy umieszczać obok komponentów i utrzymywać ich właściwości w ograniczonym zakresie. Zbyt liczne właściwości stają się długiem, którego TypeScript ma na celu zapobieganie.

type Props = { isInStock: boolean };

function StockBadge({ isInStock }: Props) {
  if (!isInStock) {
    return null; // out of stock — draw nothing
  }
  return <span className="badge">In stock</span>;
}

Podejście 2 — Jedno z dwóch za pomocą operatora ternarnego

W przypadku podejścia 2 – jednego z dwóch wykorzystujących operator ternarny, należy zdefiniować dane wejściowe, osobę odpowiedzialną za dany krok oraz kryteria zakończenia przed zmianą kodu. Operatorzy powinni móc ponownie uruchomić dany krok od znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Należy preferować małe, testowalne jednostki zamiast rozbudowanych skryptów. Gdy dany krok zawiedzie, powinno to wskazywać na konkretną przyczynę. Umieszczaj typy obok komponentów i utrzymuj ograniczoną liczbę właściwości. Zbyt liczne właściwości stanowią dług, którego TypeScript ma na celu zapobieganie. W przypadku podejścia 2 – jednego z dwóch wykorzystujących operator ternarny, należy zdefiniować dane wejściowe, osobę odpowiedzialną za dany krok oraz kryteria zakończenia przed zmianą kodu. Operatorzy powinni móc ponownie uruchomić dany krok od znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Zapisuj czas wykonywania i koszty obok wyników funkcjonalnych. Wczesna widoczność zapobiega nieoczekiwanym kosztom w środowiskach współdzielonych.

function StockBadge({ isInStock }: Props) {
  return (
    <span className="badge">
      {isInStock ? 'In stock' : 'Out of stock'}
    </span>
  );
}

Podejście 3 — „Tylko wtedy”, gdy używa się &&

W ramach podejścia 3 — „Tylko wtedy”, gdy używa się && — należy zdefiniować dane wejściowe, osobę odpowiedzialną za dany krok oraz kryteria zakończenia przed modyfikacją kodu. Operatorzy powinni móc ponownie uruchomić dany krok na podstawie znanej punktacji kontrolnej, bez konieczności zgadywania ukrytego stanu. Konfigurację należy przechowywać poza kodem aplikacji. Pliki środowiskowe, magazyny tajnych danych oraz flagi funkcjonalne powinny znajdować się w jednym miejscu, które operatorzy mogą audytować. Lepiej jest stosować wyraźne warunkowe renderowanie niż sprytnie zaprojektowane ścieżki skrócone, które ukrywają błędy w produkcji.

function Cart({ count }: { count: number }) {
  return (
    <div>
      <h2>Cart</h2>
      {count > 0 && <p>Items in cart: {count}</p>}
    </div>
  );
}

Najczęstsza pułapka związana z && — liczba 0

Dla najczęstszego problemu z && — liczby 0 — należy zdefiniować dane wejściowe, osobę odpowiedzialną za dany krok oraz kryteria zakończenia przed modyfikacją kodu. Operatorzy powinni móc ponownie uruchomić ten krok od znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Należy udokumentować zarówno prawidłowy przebieg działania, jak i ścieżkę naprawczą. Próby ponownych działań oraz obsługa wiadomości błędnych stanowią część produktu. Lepiej używać wyraźnego renderowania warunkowego niż sprytnych skrótów, które ukrywają błędy w środowisku produkcyjnym.

function Cart({ count }: { count: number }) {
  return (
    <div>
      <h2>Cart</h2>
      {/* 🔴 trap: if count is 0, "0" shows up on screen */}
      {count && <p>Items in cart: {count}</p>}
    </div>
  );
}

function App() {
  return (
    <>
      <Cart count={0} />
      <Cart count={10} />
    </>
  );
}

export default App;
// ✅ count > 0 is true/false, so it's safe
{count > 0 && <p>Items in cart: {count}</p>}

Renderowanie listy — rysowanie tablicy w pętli

Dla renderowania list — rysowania tablicy w pętli, należy zdefiniować dane wejściowe, osobę odpowiedzialną za dany krok oraz kryteria zakończenia przed modyfikacją kodu. Operatorzy powinni móc ponownie uruchomić ten krok od znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Wolno preferować małe, testowalne jednostki nad rozbudowanymi skryptami. Gdy jakiś krok zawiedzie, powinno to wskazywać na konkretną przyczynę. Lepiej jest stosować wyraźne warunkowe renderowanie niż sprytnie zaprojektowane ścieżki przyspieszające, które ukrywają błędy w środowisku produkcyjnym. Dla renderowania list — rysowania tablicy w pętli, należy zdefiniować dane wejściowe, osobę odpowiedzialną za dany krok oraz kryteria zakończenia przed modyfikacją kodu. Operatorzy powinni móc ponownie uruchomić ten krok od znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Zapisuj czas trwania i koszty obok wyników funkcjonalnych. Wczesna widoczność zapobiega nieoczekiwanym rachunkom w środowiskach współdzielonych.

type Product = {
  id: number;
  name: string;
  price: number;
};

const products: Product[] = [
  { id: 1, name: 'Mechanical Keyboard', price: 89000 },
  { id: 2, name: 'Wireless Mouse', price: 45000 },
  { id: 3, name: 'USB Hub', price: 23000 },
];

function ProductList() {
  return (
    <ul>
      {products.map((product) => (
        <li key={product.id}>
          {product.name} — {product.price.toLocaleString()} won
        </li>
      ))}
    </ul>
  );
}

key — tag nazwy używany przez React do odróżniania elementów

Dla klucza – tagu nazwy używanego przez React do odróżniania elementów – należy zdefiniować dane wejściowe, osobę odpowiedzialną za dany krok oraz kryteria zakończenia przed modyfikacją kodu. Operatorzy powinni móc ponownie uruchomić dany krok od znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Konfigurację należy przechowywać poza kodem aplikacji. Pliki środowiskowe, magazyny tajnych danych oraz flagi funkcjonalne powinny znajdować się w jednym miejscu, które operatorzy mogą audytować. Listy kluczy muszą zawierać stabilne identyfikatory biznesowe, a nie indeksy tablic, szczególnie gdy kolejność może ulegać zmianie.

Warning: Each child in a list should have a unique "key" prop.

Klucze powinny być „stabilne i unikalne”

Aby klucze były „stabilne i unikalne”, należy zdefiniować dane wejściowe, osobę odpowiedzialną za dany krok oraz kryteria zakończenia przed modyfikacją kodu. Operatorzy powinni móc ponownie uruchomić dany krok na podstawie znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Należy udokumentować zarówno prawidłowy przebieg działania, jak i ścieżkę naprawczą. Próby ponownych działań oraz obsługa wiadomości błędnych stanowią część produktu. Listy kluczy muszą zawierać stabilne identyfikatory biznesowe, a nie indeksy tablic, szczególnie gdy kolejność może ulegać zmianie.

<li key={product.id}>   // ✅ each product's unique id — stable

Pułapka — Nie używaj indeksu tablicy jako klucza

Dla Trap – nie używaj indeksu tablicy jako klucza; zdefiniuj dane wejściowe, osobę odpowiedzialną za dany krok oraz kryteria zakończenia przed modyfikacją kodu. Operatorzy powinni móc ponownie uruchomić dany krok od znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Wolno preferować małe, testowalne jednostki nad rozbudowanymi skryptami. Gdy dany krok zawiedzie, powinien wskazywać na jedną konkretną przyczynę błędu. Lista kluczy musi zawierać stabilne identyfikatory biznesowe, a nie indeksy tablic, szczególnie gdy kolejność może ulegać zmianie. Dla Trap – nie używaj indeksu tablicy jako klucza; zdefiniuj dane wejściowe, osobę odpowiedzialną za dany krok oraz kryteria zakończenia przed modyfikacją kodu. Operatorzy powinni móc ponownie uruchomić dany krok od znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Zapisuj czas trwania i koszty obok wyników funkcjonalnych. Wczesna widoczność zapobiega nieoczekiwanym rachunkom w środowiskach współdzielonych.

// 🔴 common but dangerous pattern
{products.map((product, index) => (
  <li key={index}>{product.name}</li>
))}

Łączenie elementów – warunki + lista

Aby to połączyć — warunki i listy — należy zdefiniować dane wejściowe, osobę odpowiedzialną za dany krok oraz kryteria zakończenia przed modyfikacją kodu. Operatorzy powinni móc ponownie uruchomić dany krok od znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Konfigurację należy przechowywać poza kodem aplikacji. Pliki środowiskowe, magazyny tajnych danych oraz flagi funkcjonalne powinny znajdować się w jednym miejscu, które operatorzy mogą audytować. Typy należy umieszczać obok komponentów, a właściwości powinny być ograniczone. Zbyt liczne właściwości stanowią dług, którego TypeScript ma na celu zapobieganie.

type Product = {
  id: number;
  name: string;
  price: number;
  inStock: boolean;
};

function ProductList({ products }: { products: Product[] }) {
  // when the list is empty — conditional rendering
  if (products.length === 0) {
    return <p>No products to display.</p>;
  }

  return (
    <ul>
      {products.map((product) => (
        <li key={product.id}>
          {product.name} — {product.price.toLocaleString()} won
          {/* badge only when out of stock — && (safe since the left side is boolean) */}
          {!product.inStock && <span className="badge"> (Out of stock)</span>}
        </li>
      ))}
    </ul>
  );
}

// dummy data — swap in an empty array [] to see the "No products" message
const products: Product[] = [
  { id: 1, name: 'Mechanical Keyboard', price: 89000, inStock: true },
  { id: 2, name: 'Wireless Mouse', price: 42000, inStock: false },
  { id: 3, name: 'USB-C Hub', price: 35000, inStock: true },
];

function App() {
  return <ProductList products={products} />;
}

Zakończenie

Aby podsumować, zdefiniuj wprowadzenia, osobę odpowiedzialną za dany krok oraz kryteria zakończenia przed modyfikacją kodu. Operatorzy powinni móc ponownie uruchomić ten krok od znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Zdokumentuj zarówno prawidłowy przebieg działania, jak i ścieżkę naprawczą. Próby ponownych działań oraz obsługa wiadomości błędnych stanowią część produktu. Umieszczaj typy obok komponentów i utrzymuj ograniczoną liczbę właściwości. Zbyt liczne właściwości prowadzą do długu technologicznego, którego TypeScript ma na celu zapobieganie.

Odnośniki

Dla referencji należy zdefiniować dane wejściowe, osobę odpowiedzialną za dany krok oraz kryteria zakończenia przed zmianą kodu. Operatorzy powinni móc ponownie uruchomić dany krok od znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Należy preferować małe, testowalne jednostki zamiast rozbudowanych skryptów. Gdy dany krok zawiedzie, powinien wskazywać na jedną konkretną przyczynę błędu. Umieszczać typy obok komponentów i utrzymywać ograniczoną liczbę właściwości. Zbyt liczne właściwości stanowią dług, którego TypeScript ma na celu zapobieganie. Dla referencji należy zdefiniować dane wejściowe, osobę odpowiedzialną za dany krok oraz kryteria zakończenia przed zmianą kodu. Operatorzy powinni móc ponownie uruchomić dany krok od znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Rejestrować czas trwania i koszty obok wyników funkcjonalnych. Wczesna widoczność zapobiega nieoczekiwanym rachunkom w środowiskach współdzielonych.

Lista kontrolna operacyjna

Dla listy kontrolnej operacyjnej należy zdefiniować dane wejściowe, osobę odpowiedzialną za dany krok oraz kryteria zakończenia przed modyfikacją kodu. Operatorzy powinni móc ponownie wykonać dany krok na podstawie znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu.

Traktuj tę fazę jako umowę pomiędzy danymi wejściowymi a zweryfikowanymi wynikami. Nazwij poszczególne elementy, zdefiniuj kryteria sukcesu i odrzuć ciche, częściowe ukończenie zadań.

Niech lepsza będzie wyraźna renderizacja warunkowa niż sprytnie zaprojektowane ścieżki skrócone, które ukrywają błędy w produkcji.

Niech lepsza będzie nudna, ale niezawodna praca niż sprytnie przygotowane, jednorazowe demonstracje.

Zapisuj czasy wykonywania i koszty obok wyników funkcjonalnych. Wczesna widoczność zapobiega nieoczekiwanym rachunkom w środowiskach współdzielonych.

Niech lepsza będzie wyraźna renderizacja warunkowa niż sprytnie zaprojektowane ścieżki skrócone, które ukrywają błędy w produkcji.

Zanim zaczniesz promować tę architekturę, zamroź wersje, utwórz dokładny zapis dla kluczowych etapów realizacji oraz potwierdź kroki odwracania zmian. Środowiska współdzielone wymagają ograniczeń szybkości, weryfikacji przynależności użytkownika oraz wyraźnego właściciela odpowiedzialnego za rotację haseł.