React+Typescript implementiert die Countdown-Hook-Methode

React+Typescript implementiert die Countdown-Hook-Methode

Zunächst wird setInterval als Hook gekapselt 👇

importiere { useEffect, useRef } von 'react'

/**
 * interTerval-Hook-Komponente * @param fn Ausführungsfunktion * @param Verzögerungszeit * @param Optionen unmittelbar Wenn wahr, führen Sie die fn-Funktion sofort aus und führen Sie dann den Timer aus * /
Funktion useInterval(
  fn: () => ungültig,
  Verzögerung: Zahl | null | undefiniert,
  Optionen?: {
    sofort?: Boolesch
  }
): Leere {
  const unmittelbar = Optionen?.unmittelbar
  const timerRef = useRef<() => void>()

  timerRef.current = fn

  useEffect(() => {
    if (Verzögerung === undefiniert || Verzögerung === null) {
      zurückkehren
    }
    wenn (sofort) {
      timerRef.aktuell?.()
    }
    const timer = setzeInterval(() => {
      timerRef.aktuell?.()
    }, Verzögerung)
    zurückgeben () => {
      Intervall löschen(Timer)
    }
  }, [Verzögerung])
}

Standard-UseIntervall exportieren

Implementierung des Countdown-Hooks

importiere { useState, useEffect, useRef, useMemo } von 'react'
importiere { useInterval } von './'

Schnittstelle ITime {
  /** Aktuelle Uhrzeit */
  aktuelleZeit?: Zahl
  /** Endzeit */
  Endzeit?: Zahl
  /** Eine andere Möglichkeit: Anstatt die aktuelle Zeit und die Endzeit zu übergeben, übergeben Sie direkt die Zeitdifferenz*/
  differentTime?: Zahl
}

Schnittstelle ICbTime {
  d: Zahl
  h: Zahl
  m: Zahl
  s: Zahl
}

/**
 * Countdown-Hooks
 * @param Optionen Zeitobjekt* @param cb Rückruffunktion, die ausgeführt wird, wenn der Countdown abgeschlossen ist* @param noImmediate, ob der Rückruf sofort ausgeführt werden soll, wenn die übergebene Zeit die Bedingungen für die Rückrufausführung erfüllt, der Standardwert ist „false“*/
Funktion useCountDown(
  Optionen: ITime,
  cb?: () => ungültig,
  noImmediate?: Boolescher Wert
): ICbTime {
  const { aktuelleZeit = 0, endZeit = 0, differentZeit = 0 } = Optionen
  const [diffTime, setzeDiffTime] = useState(0)
  /** Der Zeitpunkt, zu dem die Komponente den Parameter empfängt*/
  const entryTime = useRef<Zahl>(0)
  /** Die für den aktuellen Countdown erforderliche Zeitdifferenz*/
  const maxTime = useRef<Zahl>(0)
  /** Ist es möglich, einen Rückruf auszuführen? */
  const isImplementCb = useRef(false)

  useEffect(() => {
    wenn (!isImplementCb.current) {
      isImplementCb.current = true
    }
    wenn ((aktuelleZeit > 0 && Endzeit > 0) || abweichendeZeit > 0) {
      entryTime.current = neues Date().getTime()
      maxTime.current = Zeitunterschied > 0 ? Zeitunterschied : Endzeit - aktuelle Zeit
      wenn (maxTime.current <= 0 && noImmediate) {
        isImplementCb.current = false
      }
      setDiffTime(max.Zeit.aktuell)
    }
  }, [aktuelleZeit, Endzeit, abweichendeZeit])

  Intervall verwenden(
    () => {
      const curtTimes = neues Date().getTime()
      const TimeDifference = curtTimes - Eintragszeit.aktuell
      setDiffTime(maxTime.current - Zeitdifferenz)
    },
    diffTime <= 0 ? null : 1000
  )

  const ZeitObj = useMemo(() => {
    Konstante Zeit = Differenzzeit > 0? Differenzzeit / 1000 : 0
    const d = Math.floor(Zeit / (24 * 60 * 60))
    const h = Math.floor((Zeit / (60 * 60)) % 24)
    const m = Math.floor((Zeit / 60) % 60)
    const s = Math.ceil(Zeit % 60)

    wenn (diffTime <= 0 und isImplementCb.current) {
      /**
       * setTimeout wird verwendet, um das React-Fehlerproblem zu lösen:
       * Anmerkung wird während eines bestehenden Statusübergangs nicht aktualisiert (wie beispielsweise innerhalb von „Render“).
       * Rendermethoden sollten eine reine Funktion von Requisiten und Status sein.
       */
      setzeTimeout(() => {
        cb?.()
      }, 0)
    }
    Rückgabewert { d, h, m, s }
  }, [DiffZeit])

  gibt timeObj zurück || ({} als ICbTime)
}

Exportieren Sie standardmäßig useCountDown

Schreiben Sie eine Demo, um die Wirkung zu sehen👇

  const TimeArea = () => {
    const { d, h, m, s } = useCountDown(
      {
        aktuelleZeit: 1631262176333,
        Endzeit: 1831062176333
      },
      () => {
        Alarm('Countdown endet')
      }
    )
    zurückkehren (
      <div Stil={{ Breite: '200px', Höhe: '200px' }}>
        {d} Tage bis zum Aufgabenende<i>{h < 10 ? '0' + h : h}</i>:
        <i>{m < 10 ? '0' + m : m}</i>:<i>{s < 10 ? '0' + s : s}</i>
      </div>
    )
  }

Dies ist das Ende dieses Artikels zur Implementierung eines Countdown-Hooks mit React+Typescript. Weitere relevante Inhalte zum Countdown mit React+Typescript finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen!

Das könnte Sie auch interessieren:
  • Implementierungscode der React-Countdown-Funktion – Entkopplung allgemein
  • Realisieren Sie den Countdown-Effekt basierend auf Vue und Reagieren
  • Beispielcode zur Implementierung eines Countdowns mit React Render Props
  • Implementierung der React-Registrierungs-Countdown-Funktion
  • Freigabe des React Native-Verifizierungscode-Countdown-Tools

<<:  Zusammenfassung der MySQL-Datenbanknutzungsspezifikationen

>>:  Detailliertes Tutorial zur Installation von CUDA9.0 auf Ubuntu16.04

Artikel empfehlen

So erstellen Sie Ihre eigene Angular-Komponentenbibliothek mit DevUI

Inhaltsverzeichnis Vorwort Erstellen einer Kompon...

Reagieren Sie auf die Konstruktionsreihenfolge verschachtelter Komponenten

Inhaltsverzeichnis Auf der offiziellen React-Webs...

W3C Tutorial (13): W3C WSDL Aktivitäten

Bei Webdiensten geht es um die Kommunikation zwis...

Mit CSS3 erstellte Buchseitenumblättereffekte

Ergebnis:Implementierungscode: html <!-- Wenn ...

Detaillierte Schritte zur Installation von Python 3.7 auf CentOS 6.5

1. Python 3 herunterladen wget https://www.python...

Grafisches Tutorial zur Installation und Konfiguration von MySQL 8.0.22

Dieser Artikel dokumentiert die Installation und ...

Erzielen Sie mit reinem CSS3 in wenigen einfachen Schritten einen 3D-Flip-Effekt

Als Pflichtkurs für Frontend-Entwickler kann CSS3...

Installieren Sie die MySQL5.5-Datenbank in einer CentOS7-Umgebung

Inhaltsverzeichnis 1. Prüfen Sie, ob MySQL auf de...