React+Typescriptはカウントダウンフックメソッドを実装します

React+Typescriptはカウントダウンフックメソッドを実装します

まず、setIntervalはフックとしてカプセル化されます👇

'react' から { useEffect, useRef } をインポートします。

/**
 * interTerval フック コンポーネント* @param fn 実行関数* @param 遅延時間* @param オプション 即時 true の場合、fn 関数をすぐに実行し、タイマーを実行します*/
関数useInterval(
  fn: () => void、
  遅延: 数値 | null | 未定義、
  オプション?: {
    即時?: ブール値
  }
): 空所 {
  const 即時 = オプション?.即時
  定数タイマーRef = useRef<() => void>()

  タイマー参照.current = fn

  使用効果(() => {
    遅延 === 未定義 || 遅延 === null の場合 {
      戻る
    }
    if (即時) {
      タイマーRef.current?.()
    }
    定数タイマー = setInterval(() => {
      タイマーRef.current?.()
    }、 遅れ)
    戻り値 () => {
      クリアインターバル(タイマー)
    }
  }、 [遅れ])
}

デフォルトの useInterval をエクスポートする

カウントダウンフックの実装

'react' から { useState、useEffect、useRef、useMemo } をインポートします。
'./' から { useInterval } をインポートします

インターフェースITime{
  /** 現在の時刻 */
  現在の時刻?: 数値
  /** 終了時間 */
  終了時間?: 数値
  /** 別の方法として、現在の時刻と終了時刻を渡す代わりに、時間差を直接渡す*/
  異なる時間?: 数値
}

インターフェース ICbTime {
  d: 番号
  h: 数値
  m: 数字
  s: 番号
}

/**
 * カウントダウンフック
 * @param options 時間オブジェクト* @param cb カウントダウンが完了したときに実行されるコールバック関数* @param noImmediate 渡された時間がコールバック実行条件を満たしたときにすぐにコールバックを実行するかどうか。デフォルトは false*/
関数useCountDown(
  オプション: ITime、
  cb?: () => 無効、
  即時でない?: ブール値
): ICbTime {
  const { currentTime = 0, endTime = 0, differentTime = 0 } = オプション
  定数[diffTime, setDiffTime] = useState(0)
  /** コンポーネントがパラメータを受け取った時間*/
  const entryTime = useRef<数値>(0)
  /** 現在のカウントダウンに必要な時間差*/
  const maxTime = useRef<数値>(0)
  /** コールバックを実行することは可能ですか? */
  定数isImplementCb = useRef(false)

  使用効果(() => {
    (!isImplementCb.current)の場合{
      isImplementCb.current = true
    }
    ((現在の時刻 > 0 && 終了時刻 > 0) || 異なる時刻 > 0) の場合 {
      entryTime.current = 新しいDate().getTime()
      maxTime.current = 異なる時間 > 0 ? 異なる時間: 終了時間 - 現在の時間
      (maxTime.current <= 0 && noImmediate)の場合{
        isImplementCb.current = false
      }
      setDiffTime(maxTime.current)
    }
  }, [現在の時刻、終了時刻、異なる時刻])

  使用間隔(
    () => {
      const curtTimes = 新しい Date().getTime()
      定数 TimeDifference = curtTimes - entryTime.current
      setDiffTime(maxTime.current - 時間差)
    },
    diffTime <= 0 ? null : 1000
  )

  定数timeObj = useMemo(() => {
    定数時間 = diffTime > 0 ? diffTime / 1000 : 0
    定数d = Math.floor(時間/(24 * 60 * 60))
    定数h = Math.floor((時間/(60 * 60)) % 24)
    定数m = Math.floor((時間/60)%60)
    const s = Math.ceil(時間 % 60)

    diffTime <= 0 の場合、isImplementCb.current になります。
      /**
       * setTimeout は、React エラー問題を解決するために使用されます。
       * 既存の状態遷移中(`render` 内など)は更新されません。
       * レンダリング メソッドは、props と state の純粋な関数である必要があります。
       */
      タイムアウトを設定する(() => {
        cb?.()
      }, 0)
    }
    {d,h,m,s}を返す
  }, [差分時間])

  timeObj を返す || ({} を ICbTime として)
}

エクスポートデフォルトuseCountDown

効果を確認するためにデモを書いてください👇

  定数TimeArea = () => {
    定数d、h、m、s } = useCountDown(
      {
        現在の時刻: 1631262176333、
        終了時間: 1831062176333
      },
      () => {
        アラート('カウントダウン終了')
      }
    )
    戻る (
      <div スタイル = {{ 幅: '200px', 高さ: '200px' }}>
        タスク終了まであと {d} 日<i>{h < 10 ? '0' + h : h}</i>:
        <i>{m < 10 ? '0' + m : m}</i>:<i>{s < 10 ? '0' + s : s}</i>
      </div>
    )
  }

React+Typescript でカウントダウンフックを実装する方法についての記事はこれで終わりです。React+Typescript でのカウントダウンに関するより関連性の高いコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後も 123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • React カウントダウン関数の実装コード - 一般的な分離
  • VueとReactをベースにカウントダウン効果を実現する
  • React Render Props を使用してカウントダウンを実装するサンプルコード
  • React登録カウントダウン機能の実装
  • React Native 検証コードカウントダウンツールの共有

<<:  MySQLデータベースの使用仕様の概要

>>:  Ubuntu16.04にCUDA9.0をインストールするための詳細なチュートリアル

推薦する

React クラスコンポーネントのライフサイクルと実行順序

1. Reactコンポーネントを定義する2つの方法1. 関数コンポーネント。単純な関数コンポーネント...

React 合成イベントの説明

目次入力ボックスをクリックして開始します拡張機能入力ボックスをクリックすると複数のイベントが発生しま...

Centos7環境でMySQL 5.6のインスタンスを複数作成する方法の詳細な説明

この記事では、CentOS 7 環境で MySQL 5.6 の複数のインスタンスを作成する方法につい...

ウェブページが自動的にデュアルコアブラウザの高速モードを呼び出すようにします(Webkit)

コードサンプルヘッドタグにコード行を追加します: XML/HTML コードコンテンツをクリップボード...

MySQL の一般的なログの概要

序文: MySQL システムには、さまざまな種類のログが存在します。さまざまなログにはそれぞれ独自の...

MySQLを定期的にバックアップしてQiniuにアップロードする方法

ほとんどのアプリケーション シナリオでは、緊急時に備えて重要なデータをバックアップし、安全な場所に保...

HTMLはWEB標準の開発の中心的な基盤です

HTML 中心のフロントエンド開発は、ほぼ Web 標準の意味です。共通しているのは「分離」という考...

Vue + Axios リクエストインターフェース方式とパラメータ渡し方式の詳しい説明

目次1. リクエストを取得する: 2. 投稿リクエスト: 3. 拡張と補足Vue スキャフォールディ...

よくある MySQL テーブル設計エラーの概要

目次間違い1: データの列が多すぎる誤解2: 共同クエリが多すぎる誤解3: ENUMの代わりにSET...

dns-prefetch とは何ですか? フロントエンドの最適化: DNS の事前解決によりページ速度が向上します

目次背景1. dns-prefetch とは何ですか? 2. dns-prefetch を設定するに...

JavaScriptでフロアナビゲーションエフェクトを作成するプロセスの詳細な説明

目次この期間の目標1. 関数の実装1.1 構造層1.2 スタイルレイヤー1.3 行動層1.3.1 フ...

フレックスレイアウトが子要素によって引き伸ばされたときに、コンテンツをコンテナ内に保持する方法

モバイル デバイスでは、フレックス レイアウトが非常に便利です。デバイスの幅に応じてコンテナーの幅を...

ネイティブ JS を使用してタッチスライド監視イベントを実装する方法

序文今日はちょっとしたデモを書きました。左右にスワイプするロジックに関わる部分があります。当初はプラ...

Nginx は動的と静的の分離を実装します 例の説明

ウェブサイトの解析を高速化するために、動的ページと静的ページを異なるサーバーで解析して、解析速度を向...

CocosCreator ScrollView 最適化シリーズ: フレーム読み込み

目次1. はじめに2. 行き詰まった問題の分析3. 解決策(理論) 4. ソリューション(コード) ...