← Alle AufgabenReact · Middle

Hook useDebounce

Schreib einen Hook useDebounce(value, ms). Er liefert value, aber verzögert: ein neuer Wert erscheint erst, wenn sich value ms Millisekunden lang nicht geändert hat. Jede Änderung startet den Countdown neu.

Beim ersten Render liefert der Hook sofort den Anfangswert. Nach dem Aushängen darf das ausstehende Update nicht mehr ausgeführt werden.

Tests (4)

  1. const { result } = renderHook(({ v }) => useDebounce(v, 50), { initialProps: { v: 'a' } });
    expect(result.current).toBe('a');
  2. const { result, rerender } = renderHook(({ v }) => useDebounce(v, 50), { initialProps: { v: 'a' } });
    rerender({ v: 'ab' });
    expect(result.current).toBe('a');
    await wait(90);
    expect(result.current).toBe('ab');
  3. const { result, rerender } = renderHook(({ v }) => useDebounce(v, 60), { initialProps: { v: 'a' } });
    rerender({ v: 'b' });
    await wait(30);
    rerender({ v: 'c' });
    await wait(40);
    expect(result.current).toBe('a');
    await wait(60);
    expect(result.current).toBe('c');
  4. const { result, rerender, unmount } = renderHook(({ v }) => useDebounce(v, 30), { initialProps: { v: 1 } });
    rerender({ v: 2 });
    unmount();
    await wait(60);
    expect(result.current).toBe(1);