CodeBlanks Logo Icon CodeBlanks

Concurrent özellikler

useTransition ile ağır filtrelemeyi düşük öncelikli yaparsın.

Concurrent özellikler

Son adımda projeye concurrent arama eklersin. SearchPanel bileşeni useTransition ile aramayı arka planda yapar; input akıcı kalır.

Başlangıç kodu, önceki üç çözümü içerir. Bu ders yalnızca SearchPanel ekler. Böylece tasarım sistemi, tema, server sayfa ve concurrent arama tek projede birleşir.

isPending ile bekleme sırasında bir yükleniyor göstergesi verilir.

isPending ile bekleme

isPending true iken kullanıcıya bir bekleme göstergesi sunarsın. Bu, aramanın arka planda devam ettiğini bildirir. Gösterge kısa ve anlamlı olmalı; kullanıcı ne beklediğini bilmelidir. Arama tamamlandığında gösterge kaybolur ve sonuç listesi görünür. Böylece uygulama tepkisiz görünmez ve kullanıcı deneyimi kesintisiz kalır.

Uygulama SearchPanel bileşenini yaz

SearchPanel yaz. useState ve useTransition içe aktar. useState('') ile query, useTransition ile isPending ve startTransition. items.filter(i => i.name.includes(query)) ile filtered. <input value={query} onChange={e => startTransition(() => setQuery(e.target.value))} /> ve isPending ? <p>Aranıyor</p> : <ul>{filtered.map(...)}</ul>. Dışa aktar.

Başlangıç kodu

App.jsx
// Button.jsx
function Button({ variant, children }) {
  const className = variant === 'primary' ? 'btn-primary' : 'btn-secondary';
  return <button className={className}>{children}</button>;
}
export default Button;

// ThemeProvider.jsx
import { createContext, useState } from 'react';

const ThemeContext = createContext();

function ThemeProvider({ children }) {
  const [theme, setTheme] = useState('light');
  return (
    <ThemeContext.Provider value={{ theme, setTheme }}>
      {children}
    </ThemeContext.Provider>
  );
}
export default ThemeProvider;

// ProductPage.jsx
async function ProductPage() {
  const res = await fetch('/api/products');
  const products = await res.json();
  return (
    <main>
      <h1>Ürünler</h1>
      <ul>{products.map(p => <li key={p.id}>{p.name}</li>)}</ul>
    </main>
  );
}
export default ProductPage;

// SearchPanel.jsx

// SearchPanel bileşenini buraya yaz

Örnek çözüm

App.jsx
import { useState, useTransition } from 'react';

function SearchPanel({ items }) {
  const [query, setQuery] = useState('');
  const [isPending, startTransition] = useTransition();
  const filtered = items.filter(i => i.name.includes(query));
  return (
    <div>
      <input value={query} onChange={e => startTransition(() => setQuery(e.target.value))} />
      {isPending ? <p>Aranıyor</p> : <ul>{filtered.map(i => <li key={i.id}>{i.name}</li>)}</ul>}
    </div>
  );
}
export default SearchPanel;

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 SearchPanel hangi hook'u kullanır?

  • useTransition Doğru cevap
  • useRef
  • useReducer
  • useEffect

Açıklama: useTransition ile arama arka planda yapılır.

2 Boşluğu doldur: transition başlat

Soru
const [isPending, startTransition] = use____();
Cevap
const [isPending, startTransition] = useTransition();

Açıklama: useTransition ile transition başlatılır.

3 Concurrent kavramlarını eşleştir

Kavram Anlamı
useTransition Ertelenmiş güncelleme
isPending Bekleme durumu
startTransition Güncellemeyi sarar
input Akıcı kalır

Uzman seviye bölümündeki tüm dersler