Framework
Version
Debouncer API Referenz
Throttler API Referenz
Rate Limiter API Referenz
Queue API Referenz
Batcher API Referenz

useRateLimitedState

Funktion: useRateLimitedState()

ts
function useRateLimitedState<TValue, TSelected>(
   value, 
   options, 
   selector?): [TValue, Dispatch<SetStateAction<TValue>>, ReactRateLimiter<Dispatch<SetStateAction<TValue>>, TSelected>]
function useRateLimitedState<TValue, TSelected>(
   value, 
   options, 
   selector?): [TValue, Dispatch<SetStateAction<TValue>>, ReactRateLimiter<Dispatch<SetStateAction<TValue>>, TSelected>]

Definiert in: react-pacer/src/rate-limiter/useRateLimitedState.ts:107

Ein React-Hook, der einen ratenbegrenzten Zustands­wert erstellt, der eine harte Grenze für Zustands­aktualisierungen innerhalb eines Zeit­fensters erzwingt. Dieser Hook kombiniert Reacts useState mit Raten­begrenzungs­funktionalität, um kontrollierte Zustands­aktualisierungen bereitzustellen.

Raten­begrenzung ist ein einfacher "Harte­grenze"-Ansatz – sie erlaubt alle Aktualisierungen, bis das Limit erreicht ist, und blockiert dann nachfolgende Aktualisierungen, bis das Fenster zurückgesetzt wird. Im Gegensatz zu Throttling oder Debouncing versucht sie nicht, Aktualisierungen zu verteilen oder intelligent zusammenzufassen. Dies kann zu Schüben schneller Aktualisierungen führen, gefolgt von Perioden ohne Aktualisierungen.

Der Ratenbegrenzer unterstützt zwei Arten von Fenstern

  • 'fixed': Ein strenges Fenster, das nach der Fenster­periode zurückgesetzt wird. Alle Aktualisierungen innerhalb des Fensters zählen für das Limit, und das Fenster wird nach der Periode vollständig zurückgesetzt.
  • 'sliding': Ein rollierendes Fenster, das Aktualisierungen zulässt, wenn alte ablaufen. Dies sorgt für eine konsistentere Rate von Aktualisierungen im Laufe der Zeit.

Für sanftere Aktualisierungs­muster sollten Sie in Betracht ziehen:

  • useThrottledState: Wenn Sie eine konsistente Abstands­regel zwischen Aktualisierungen wünschen (z. B. UI-Änderungen)
  • useDebouncedState: Wenn Sie schnelle Aktualisierungen zu einer einzigen Aktualisierung zusammenfassen möchten (z. B. Such­eingabe)

Raten­begrenzung sollte hauptsächlich verwendet werden, wenn Sie strenge Limits erzwingen müssen, wie z. B. API-Raten­limits.

Der Hook gibt ein Tupel zurück, das enthält

  • Der ratenbegrenzte Zustands­wert
  • Eine ratenbegrenzte Setter-Funktion, die die konfigurierten Limits einhält
  • Die rateLimiter-Instanz für zusätzliche Kontrolle

Für direktere Kontrolle über Raten­begrenzung ohne Zustands­verwaltung sollten Sie stattdessen den untergeordneten useRateLimiter-Hook in Betracht ziehen.

Zustandsverwaltung und Selektor

Der Hook verwendet TanStack Store zur reaktiven Zustands­verwaltung über die zugrunde liegende raten­begrenzte Instanz. Der selector-Parameter ermöglicht es Ihnen, anzugeben, welche Änderungen am raten­begrenzten Zustand ein Neu­rendern auslösen, wodurch die Leistung optimiert wird, indem unnötige Neu­rendern verhindert werden, wenn irrelevante Zustands­änderungen auftreten.

Standardmäßig erfolgen keine reaktiven Zustands-Subscriptions und Sie müssen das Zustands-Tracking durch Bereitstellen einer Selector-Funktion aktivieren. Dies verhindert unnötige Renderings und gibt Ihnen die volle Kontrolle darüber, wann Ihre Komponente aktualisiert wird. Nur wenn Sie einen Selector bereitstellen, wird die Komponente neu gerendert, wenn sich die ausgewählten Zustandswerte ändern.

Verfügbare ratenbegrenzte Zustands­eigenschaften

  • executionCount: Anzahl der abgeschlossenen Funktionsaufrufe
  • executionTimes: Array von Zeit­stempeln, wann Ausführungen für Raten­begrenzungs­berechnungen stattfanden
  • rejectionCount: Anzahl der Funktions­ausführungen, die aufgrund von Raten­begrenzung abgelehnt wurden

Typparameter

TValue

TSelected = RateLimiterState

Parameter

value

TValue

optionen

RateLimiterOptions<Dispatch<SetStateAction<TValue>>>

selector?

(state) => TSelected

Gibt zurück

[TValue, Dispatch<SetStateAction<TValue>>, ReactRateLimiter<Dispatch<SetStateAction<TValue>>, TSelected>]

Beispiel

tsx
// Default behavior - no reactive state subscriptions
const [value, setValue, rateLimiter] = useRateLimitedState(0, {
  limit: 5,
  window: 60000,
  windowType: 'sliding'
});

// Opt-in to re-render when execution count changes (optimized for tracking successful updates)
const [value, setValue, rateLimiter] = useRateLimitedState(
  0,
  { limit: 5, window: 60000, windowType: 'sliding' },
  (state) => ({ executionCount: state.executionCount })
);

// Opt-in to re-render when rejection count changes (optimized for tracking rate limit violations)
const [value, setValue, rateLimiter] = useRateLimitedState(
  0,
  { limit: 5, window: 60000, windowType: 'sliding' },
  (state) => ({ rejectionCount: state.rejectionCount })
);

// Opt-in to re-render when execution times change (optimized for window calculations)
const [value, setValue, rateLimiter] = useRateLimitedState(
  0,
  { limit: 5, window: 60000, windowType: 'sliding' },
  (state) => ({ executionTimes: state.executionTimes })
);

// With rejection callback and fixed window
const [value, setValue] = useRateLimitedState(0, {
  limit: 3,
  window: 5000,
  windowType: 'fixed',
  onReject: (rateLimiter) => {
    alert(`Rate limit reached. Try again in ${rateLimiter.getMsUntilNextWindow()}ms`);
  }
});

// Access rateLimiter methods if needed
const handleSubmit = () => {
  const remaining = rateLimiter.getRemainingInWindow();
  if (remaining > 0) {
    setValue(newValue);
  } else {
    showRateLimitWarning();
  }
};

// Access the selected rate limiter state (will be empty object {} unless selector provided)
const { executionCount, rejectionCount } = rateLimiter.state;
// Default behavior - no reactive state subscriptions
const [value, setValue, rateLimiter] = useRateLimitedState(0, {
  limit: 5,
  window: 60000,
  windowType: 'sliding'
});

// Opt-in to re-render when execution count changes (optimized for tracking successful updates)
const [value, setValue, rateLimiter] = useRateLimitedState(
  0,
  { limit: 5, window: 60000, windowType: 'sliding' },
  (state) => ({ executionCount: state.executionCount })
);

// Opt-in to re-render when rejection count changes (optimized for tracking rate limit violations)
const [value, setValue, rateLimiter] = useRateLimitedState(
  0,
  { limit: 5, window: 60000, windowType: 'sliding' },
  (state) => ({ rejectionCount: state.rejectionCount })
);

// Opt-in to re-render when execution times change (optimized for window calculations)
const [value, setValue, rateLimiter] = useRateLimitedState(
  0,
  { limit: 5, window: 60000, windowType: 'sliding' },
  (state) => ({ executionTimes: state.executionTimes })
);

// With rejection callback and fixed window
const [value, setValue] = useRateLimitedState(0, {
  limit: 3,
  window: 5000,
  windowType: 'fixed',
  onReject: (rateLimiter) => {
    alert(`Rate limit reached. Try again in ${rateLimiter.getMsUntilNextWindow()}ms`);
  }
});

// Access rateLimiter methods if needed
const handleSubmit = () => {
  const remaining = rateLimiter.getRemainingInWindow();
  if (remaining > 0) {
    setValue(newValue);
  } else {
    showRateLimitWarning();
  }
};

// Access the selected rate limiter state (will be empty object {} unless selector provided)
const { executionCount, rejectionCount } = rateLimiter.state;
Unsere Partner
Code Rabbit
Unkey
Bytes abonnieren

Ihre wöchentliche Dosis JavaScript-Nachrichten. Jeden Montag kostenlos an über 100.000 Entwickler geliefert.

Bytes

Kein Spam. Jederzeit kündbar.

Bytes abonnieren

Ihre wöchentliche Dosis JavaScript-Nachrichten. Jeden Montag kostenlos an über 100.000 Entwickler geliefert.

Bytes

Kein Spam. Jederzeit kündbar.