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

推薦する

JavaScript Sandboxについての簡単な説明

序文:サンドボックスといえば、私たちの頭には反射的に上の写真が思い浮かび、すぐに興味がわいてくるかも...

wgetはウェブサイト全体(サブディレクトリ全体)または特定のディレクトリをダウンロードします

wgetコマンドを使用して、親ディレクトリの下のサブディレクトリ全体をダウンロードします。親ディレク...

フォント名に従ってフォントを呼び出すと、ブラウザに必要なフォントが表示されます。

質問 1: ブラウザに必要なフォントを表示するように指示するにはどうすればよいでしょうか? フォント...

Vue プロジェクトがページング効果を実現

ページング効果は、参考までにvueプロジェクトに実装されています。具体的な内容は次のとおりです。 1...

MySQL 文字列インデックスのより合理的な作成ルールに関する議論

序文MySQL インデックスの使用に関しては、これまでインデックスの最左接頭辞ルール、インデックス ...

lastInfdexOf 関数の MySQL 実装例

MySQL では lastIndexOf に似た関数を使用する必要がある場合もありますが、すぐに使用...

HTMLのimgタグで画像の中心部分だけを表示する方法(3つの方法)

HTML の img タグで画像の中心を表示する方法は、現在 3 つあります。ここで記録しておきま...

Nginx 500 内部サーバーエラーの解決方法

今日、Nginxを使っていたら500エラーが発生しました。エラーコードを検索してみんなに共有しました...

TypeScript の Enum が問題となる理由

目次どうしたの?いつ使うか列挙の数を制御するビット値コントロールインデックス非数値列挙結論はType...

ins タグと del タグの属性と使用法

insとdel は、HTML 4.0 で導入され、文書の作成時に作成者が共同作業できるようにし、また...

MySQL Server 8.0.13.0 インストールチュートリアル(画像とテキスト付き)

MySQL 6.1.3 をベースにした 8.0.13 をインストールします。 MySQL 8.0....

MySQL 8.0 における MySQL のインストールと新しいパスワード認証方法の詳細な説明

1. はじめにOracle が MySQL 8.0GA をリリースしました。海外での GA はリリー...

MySqlはページクエリ機能を実装します

まず、ページ分割クエリを使用する理由を明確にする必要があります。データが膨大なため、すべてのデータを...

Vue3のレスポンシブ原則の詳細な説明

目次Vue2 レスポンシブ原則のレビューVue3 レスポンシブ原則の分析ネストされたオブジェクトの応...

Vue のライフサイクルとフック関数

目次1.ライフサイクルとは何か2. Vueのライフサイクル3. ライフサイクルフック関数1.ライフサ...