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 でスペースを含むファイルを削除する (ディレクトリではない)

推薦する

Docker 経由で wsl の tar ファイルを作成する方法

最近VScodeのリモート開発機能をいじっています。Dockerのコンテナに接続できるほか、WSLに...

Dockerを使用してMySQLデータベースをインストールするDeepinの詳細な説明

まずMySQLソースをクエリするdocker 検索 mysql公式ウェブサイトにアクセスしてイメージ...

主軸上のFlex子要素の比率を制御する方法

背景フレックス レイアウトにより、配置とスペースの割り当てがより効果的に実現されます。最近、flex...

CentOS サーバーのセキュリティ構成戦略

最近、ブルートフォース攻撃によるサーバのクラッキングが頻発しています。侵入行為を大まかに分析し、よく...

JSはカード配布アニメーションを実現します

この記事の例では、カード配布アニメーションを実装するためのJSの具体的なコードを参考までに共有してい...

Link と @import の違いを詳しく見る

ページで CSS を使用する主な方法は、スタイル属性値をインラインで追加する方法、ページ ヘッダーで...

MySQL でメタデータ ロックがブロックされている場所を確認する方法

MySQL でメタデータ ロックがブロックされている場所を確認する方法手順: 1. セッション1の実...

MySQLデータベースで列を追加、削除、変更する方法

この記事では、例を使用して、MySQL データベースの列を追加、削除、および変更する方法について説明...

メンテナンス可能なJSコードの書き方を教えます

目次保守可能なコードとは何ですか?コード規約1. 読みやすさ2. 変数と関数の命名3. 透過的な変数...

Firefox または IE でスパン幅が決定されない場合の解決策

コードをコピーコードは次のとおりです。 <html xmlns="http://ww...

HTML テキストエスケープのヒント

今日、CSDN で HTML テキスト エスケープのちょっとしたトリックを見ましたが、とても簡単です...

MySQL DDLステートメントの使用

序文SQL の言語分類には主に以下の種類があります。 DDLデータ定義言語作成、削除、変更データ定義...

IE7 互換モードで IE8 を有効にするコード

最も人気のあるタグはIE8ですブラウザベンダーはバージョンアップデートのリリースに躍起になっている一...

Antd+vueは円形属性フォームの動的検証のアイデアを実現します

必要な項目をループして検証するために、クエリ フォームのいくつかのプロパティを実装したいと考えていま...

CSS3 を使用して楕円軌道の回転を実装するサンプルコード

最近、次のような効果を達成する必要がある最初は、CSS3D回転を使用して記述すると、次の効果しか得ら...