← Wszystkie zadaniaReact · Middle

Hook useDebounce

Napisz hook useDebounce(value, ms). Zwraca value, ale z opóźnieniem: nowa wartość pojawia się dopiero, gdy value nie zmieniało się przez ms milisekund. Każda zmiana zaczyna odliczanie od nowa.

Przy pierwszym renderze hook od razu zwraca wartość początkową. Po odmontowaniu oczekująca aktualizacja nie może się wykonać.

Testy (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);