Vueでタイマーをエレガントにクリアする方法

Vueでタイマーをエレガントにクリアする方法

序文

タイマーをクリアします。次のように書く人も多いと思います。

エクスポートデフォルト{
  データ() {
    戻る
      タイマー: null
    }
  },
  
  マウント() {
    this.timer = setInterval(() => {
      コンソールログ('setInterval')
    }, 2000)
  },
  
  破棄する前に() {
    クリア間隔(this.timer)
  }
}

これは一般的なコードです。少なくとも私の友人の何人か (1 ~ 3 年の経験を持つ) は、このように書いています。ここには 3 つの不適切な問題があります。

  • clearInterval 後、タイマーはクリアされず、null になります。
  • タイマーを開始およびクリアするコードが 2 か所に分散されているため、可読性や保守性が損なわれています。You Dada 氏の言葉を借りれば、構築したものをプログラムでクリーンアップすることが難しくなります。
  • タイマーはデータ内に定義されています。実際、タイマーは応答操作を必要としません。データ内に定義する必要はないため、パフォーマンスの無駄が発生します。

最適化

コード上で直接:

エクスポートデフォルト{
  データ() {
    戻る
    }
  },
  
  マウント() {
    タイマーをsetInterval(() => {
      コンソールログ('setInterval')
    }, 2000)
    this.$once('hook:beforeDestroy', () => {
      クリアインターバル(タイマー)
      タイマー = null
    })
  }
}

ここでは、フックを使用して beforeDestroy ライフサイクルを監視するため、タイマーはライフサイクル内でのみ定義すればよく、上記の問題はすべて解決されます。

派生的な質問: beforeDestroy はトリガーされませんか?

バックエンドシステムでは、ページキャッシュを設定することがよくあります。ルートがキープアライブによってキャッシュされている場合、beforeDestroyライフサイクルは実行されません。そのため、beforeDestroyでタイマーをクリアするだけで十分だと考え、実際にタイマーがクリアされていないかどうかを確認さえしない人もいます。アクティブ化されたフックと非アクティブ化されたフックの助けを借りれば、理由を知ることは簡単に解決できます。

エクスポートデフォルト{
  データ() {
    戻る
    }
  },
  
  マウント() {
    タイマーをsetInterval(() => {
      コンソールログ('setInterval')
    }, 2000)
    this.$on('hook:activated', () => {
      if (timer === null) { // タイマーの繰り返し起動を避ける timer = setInterval(() => {
          コンソールログ('setInterval')
        }, 2000)
      }
    })
    this.$on('hook:deactivated', () => {
      クリアインターバル(タイマー)
      タイマー = null
    })
  }
}

ここで注意すべき点は、キャッシュの理由により、$once ではなく $on を使用する必要があるということです。そうしないと、一度実行された後は再度トリガーされません。

Vue でタイマーをエレガントにクリアする方法についての記事はこれで終わりです。Vue のタイマークリアに関するより関連性の高いコンテンツについては、123WORDPRESS.COM で以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Vue でタイマーを設定およびクリアする方法
  • Vue はタイマーを介して垂直スクロールアナウンスを実装します
  • Vue(タイマー)はマウントされたデータがデータを取得できない問題を解決します
  • Vue setInterval タイマーの失敗の解決策
  • Vueページを離れるときにタイマーを破棄する方法

<<:  VMware 15 を使用して仮想マシンをインストールし、CentOS 8 を使用する詳細な手順

>>:  Linux でスペースを含むファイルを削除する (ディレクトリではない)

推薦する

vue N​​progress のプログレスバー機能を実装する際の一般的な問題

NProgress は、ページがジャンプしたときにブラウザの上部に表示される進行状況バーです。公式ウ...

mysql8.0.11クライアントがログインできない問題の解決方法

この記事では、mysql8.0.11クライアントがログインできない問題の解決策を紹介します。参考まで...

vue+element を使用した Google プラグインの開発プロセス全体

シンプルな機能: ブラウザの右上隅にあるプラグイン アイコンをクリックすると小さなポップアップ ウィ...

ウェブデザイナーが知っておくべき効率的なナビゲーションデザインの3つの原則

ウェブサイトのナビゲーションを設計することは、家の基礎を築くようなものです。基礎がしっかりしていなけ...

デザイン参考 WordPressウェブサイト構築成功事例

これら 16 のサイトはそれぞれ注意深く読む価値があり、どのサイトでも推奨されている Web サイト...

Vue の this.$store.state.xx.xx に関する簡単な説明

目次これを Vue.$store.state.xx.xxストアからデータを取得する私のプロジェクトフ...

この記事はJavaScriptの変数とデータ型を理解するのに役立ちます

目次序文:親切なヒント:変数1. 免責事項2. 譲渡3. 2つの小さな文法上の詳細変数の命名規則なぜ...

Vue における {{}}、v-text、v-html の違いと用途の詳細な説明

{ {}} 値を取得すると、タグの元のコンテンツはクリアされませんv-textは値を取得し、タグの元...

divとspanの違いと使い方

目次1. DIVとSPANの違いと特徴2. スパンタグの概要3. 拡大と改善4. 凡例の効果の実証例...

Tomcat のメモリ構成の正しい姿勢についての簡単な説明

1. 背景多くのブログや記事を読みましたが、JVM のメモリ割り当て方法に関する包括的な記事は見つか...

React 純粋関数コンポーネント setState がページ更新を更新しない問題の解決方法

目次問題の説明:原因分析:解決:補足: Reactでは、フックが使用されている場合、useState...

Linuxのtopコマンド出力の詳細な説明

序文皆さんは Linux で top コマンドを使ったことがあると思います。私は Linux に触れ...

JavaScript クロージャの説明

目次1. クロージャとは何ですか? 1.2 クロージャのメモ化: 関数は定義された環境を記憶する1....

tomcat をインストールし、Linux で Web サイトを展開します (推奨)

jdk をインストールします: Oracle 公式ダウンロード https://www.oracl...

プロジェクトに必須の 8 つの JavaScript コード スニペット

目次1. ファイル拡張子を取得する2. コンテンツをクリップボードにコピーする3. スリープ時間は何...