Vue でデータコレクターを設計する

Vue でデータコレクターを設計する

シナリオ

現在、ビジネスにはシナリオがあります。ビジネスの動作が変化すると、各モジュールの動作に関するデータを収集する必要があります。データは、レビューや監視などのシナリオに使用できます。

中核問題

簡単に言えば、この要件は、各モジュールのステータスの変更を記録し、それをフォーマットしてサーバーにアップロードすることです。
この問題を解決するには 2 つの方法があります。1 つはステータス監視、もう 1 つはアクティブ コレクションです。

ステータス監視

状態監視の利点

状態管理とウォッチングメカニズムの使用を迅速に実現して、さまざまなモジュールの状態の変化を迅速に把握し、データを取得してフォーマットし、サーバーに送信できます。

国家監視の欠点

  • wacth の繰り返し監視。wacth が使用されている限り、必要なデータであるかどうかに関係なく、状態が変化すると、変更をトリガーして動作を監視します。
  • 繰り返される依存関係。たとえば、グローバルな開始状態と終了状態がある場合、ウォッチを使用するときに、別のウォッチでこの状態を判断する必要がある、またはグローバルな時間モジュールなどがある場合などです。
  • 繰り返しの書き込み、同じデータフォーマット方法を異なるモニターで練習する必要がある
  • データは無秩序に分散されます。グローバル アップロードには同じパイプラインが使用されますが、同じパイプライン内のデータのマージや重複排除、またはその他のカスタム操作のサポートは、同じパイプライン内に異なるタイプのデータが存在するシナリオでは不十分です。
  • シナリオの判別が難しい。正常なプロセスで監視する場合は問題ありませんが、異常なシナリオで監視すると判断が複雑になります。
  • 説明はまだ比較的抽象的です。コード例を参照してください。
関数useA(){
 見る(新しい、古い){
  if(開始){
    if(new.type == 'need')
     定数a = {
      a:新しいa
     }
     定数aa = {
      aa:新しい.aa
     }
     アップロード(a)
     アップロード(aa)
  }
 }
}
// 複数データ分散関数 useB(){
 // 繰り返し監視 watch(new,old){
 // グローバル判定 if(start){
    // 異なる状態の判断 if(new.type =='need')
     定数b = {
      b:新しい.b
     }
     //繰り返しデータ形式 const aa = {
      b:new.aa
     }
     アップロード(b)
     アップロード(aa)
  }
 }
}

復興実行のアイデア

  • 依存関係の収集 (リスナー パターン)
  • 国家統一
  • データの自律性(戦略モード)

依存関係の収集

  • コアアイデア: 同じコレクターを使用してビジネス プロセス全体を解決したいと考えています。データの変更は、各変更当事者で発生します。データは、コレクターが提供する標準のフォーマット方法で処理され、その後、コレクターに渡されます。データを受け取った後、コレクターはさまざまなデータ形式に応じてデータをさまざまなキャッシュ チャネルに挿入します。キャッシュ チャネルは正常にキャッシュし、ビジネス処理をリスナーに通知します。さまざまなデータ タイプに応じてさまざまな処理方法が実行され、最終的にサーバーに送信されます。
  • 具体的なコードは以下のとおりです
/*
 * @Description: パブリッククラスを収集 * @version: 1.0.0
 * @著者: 呉文州* @日付: 2021-04-20 19:44:35
 * @LastEditors: 呉文州* @LastEditTime: 2021-04-22 15:20:50
 */
/**
 * @name: 退会
 * @msg: 依存関係コレクションオブジェクト */
クラス Dep {
  プライベートサブ: any = []
  // オブザーバーを追加 public addSub(sub: any) {
    if (sub && sub.update) {
      this.subs.push(サブ)
    }
  }
  //通知を送信する public notify(content: any) {
    this.subs.forEach((sub: any) => {
      sub.update(コンテンツ)
    })
  }
}
/**
 * @name: ウォッチャー
 * @msg: オブザーバー オブジェクト*/
クラスウォッチャー{
  プライベート cb!: (引数: 任意) => void
  コンストラクタ(cb: (arg: any) => void) {
    // コールバック関数は this.cb = cb の更新を担当します
  }
  // データが変更されたら更新する update(content: any) {
    this.cb(コンテンツ)
  }
}
/**
 * @name: チャンネル
 * @msg: キャッシュメッセージパイプライン*/
クラスチャンネル{
  //パイプラインストレージ配列のプライベートキュー: any = []
  // パイプラインサイズ private limitSize = 1
  //パイプライン名 public name: 文字列
  コンストラクター(名前: 文字列、制限サイズ = 1) {
    this.name = 名前
    // 最小サイズは1です
    制限サイズ = 制限サイズ >= 1 ? 制限サイズ: 1
    this.limitSize = 制限サイズ
  }
  /**
   * @名前: プッシュ
   * @msg: データを追加しました*/
  プッシュ(アイテム: 任意) {
    // 制限サイズを超えた場合は最初のものを削除します if (this.limitSize == this.queue.length) {
      this.queue.shift()
    }
    this.queue.push(アイテム)
  }
  /**
   * @name: 最終取得
   * @msg: 最後に追加されたデータを取得します*/
  最後の値を取得します(){
    (このキューの長さ>0)の場合{
      this.queue[this.queue.length - 1]を返す
    } それ以外 {
      新しいエラーをスローします('アイテムが返されません')
    }
  }
  /**
   * @name: 最終インデックスを取得する
   * @msg: 最後のカウントダウンデータを取得します*/
  getLastIndex(インデックス: 数値) {
    試す {
      this.queue[this.queue.length - index - 1]を返します
    } キャッチ(エラー){
      新しいエラーをスローします('アイテムが返されません')
    }
  }
  /**
   * @name: 空です
   * @msg: パイプは空ですか? */
  空です() {
    this.queue.length == 0 を返す
  }
}
エクスポートクラスコレクション{
  //依存関係コレクションオブジェクト private dep = new Dep()
  // 各データチャネルの分類 private dataQueue = ['A', 'B', 'C']
  // チャンネルコレクション private channelMap = new Map()
  // アップロードキュープライベート MQ!: LiveCollectionMQ
  // 戦略モード: 異なるデータ型は異なる処理メカニズムに対応します private strategies = {
    答え: () => {
      // 異なる論理処理ごとに異なるパイプラインで対応するデータを取得できます},
    B: () => {

    },
    C: () => {
    },
  } として Record<NotifyType, any>
  コンストラクタ() {
    この.init()
  }
  プライベートinit() {
    // ウォッチャーを初期化する
    this.intウォッチャー()
    // チャネルを初期化する this.initChannel()
    // データを初期化する this.initData()
    // キューを初期化する this.initMQ()
  }
  /**
   * @name:intウォッチャー
   * @msg: リスナーを初期化します */
  プライベートintWatcher() {
    this.dep.addSub(
      新しいウォッチャー((type: NotificationType) => {
        const ハンドラバック = this.getHandler(type)
        ハンドラバック()
      })、
    )
  }
  /**
   * @名前: initChannel
   * @msg: チャネルを初期化します */
  プライベートinitChannel() {
    this.dataQueue.forEach(item => {
      this.channelMap.set(item, 新しいチャンネル(item, 3))
    })
  }
  /**
   * @名前: initData
   * @msg: チャネルデータを初期化します * @param {*}
   */
  プライベートinitData() {
    
  }
  /**
   * @名前: initMQ
   * @msg: アップロードキューを初期化します*/
  プライベートinitMQ() {

  }
  /**
   * @名前: getMQ
   * @msg: メッセージキューを取得します */
  パブリック getMQ() {
    これを返す.MQ
  }
  /**
   * @name:getChannel
   * @msg: チャンネル名に基づいてチャンネルインスタンスを取得します * @param {name} チャンネル名 */
  プライベートgetChannel(名前:NotifyType) {
    if (this.channelMap.get(name)) {
      this.channelMap.get(name) を返します。
    } それ以外 {
      新しいエラーをスローします('チャンネルがありません')
    }
  }
  /**
   * @名前:通知
   * @msg: 依存通知方法 * @param {NotifyType} タイプ
   * @param {any} メス
   */
  パブリック通知(タイプ: 通知タイプ、メッセージ: 任意) {
    // パイプラインキャッシュを設定する this.setChannel(type, mes)
    // データを配布するかどうかを決定するグローバル統一判定状態 if (state.value.type) {
      this.dep.notify(タイプ)
    }
  }
  /**
   * @名前: setChannel
   * @msg: チャネルキャッシュを設定 * @param {NotifyType} name
   * @param {any} メス
   */
  プライベートsetChannel(名前:NotifyType、mes:任意) {
    定数チャンネル = this.getChannel(名前)
    チャンネル.push(mes)
  }
  /**
   * @name:getHandler
   * @msg: 取得 * @param {NotifyType} 名
   */
  プライベートgetHandler(名前:NotifyType) {
    this.strategies[name]を返す
  }
  /**
   * @name: getChannelLast
   * @msg: 指定されたパイプラインの最新データを取得します * @param {NotifyType} name
   * @戻る {*}
   */
  パブリック getChannelLast(名前: 通知タイプ) {
    試す {
      定数チャンネル = this.getChannel(名前)
      channel.getLast() を返す
    } キャッチ(エラー){
      新しいエラー(error)をスローします
    }
  }
  /**
   * @name: getChannelLast
   * @msg: 指定されたパイプラインの逆順データを取得します * @param {NotifyType} name
   * @param {数値} インデックス
   */
  パブリック getChannelItemByLastIndex(名前: 通知タイプ、インデックス: 数値) {
    試す {
      定数チャンネル = this.getChannel(名前)
      channel.getLastIndex(index) を返します。
    } キャッチ(エラー){
      新しいエラー(error)をスローします
    }
  }
  /**
   * @名前: generateA
   * @msg: A データメソッドを生成します */
  パブリックgenerateA() {
    
  }
  /**
   * @名前: 生成B
   * @msg: B データ生成メソッド */
  パブリック生成B() {
    
  }
  /**
   * @名前: 生成C
   * @msg: C データ メソッドを生成します */
  パブリックgenerateC() {
    
  }
}

エクスポート const CollectionHelper = new Collection()

要約する

  • フレームワークを理解する良い方法は、そのコア原則を使用して原則を解決することだと思います。以前の webpack のプラグイン メカニズムと同じように、今回は vue の依存関係コレクションを使用します。
  • 状態の自治と統一された責任は、コードのカプセル化にとって良い習慣である

以上がVueを使ったデータコレクターの設計の詳細です。Vueを使ったデータコレクターの設計の詳細については、123WORDPRESS.COMの他の関連記事にも注目してください。

以下もご興味があるかもしれません:
  • Vue2.0/3.0双方向データバインディングの実装原理の詳細説明
  • vuexの強制リフレッシュによるデータ損失問題の分析
  • Vue はデータの変更をどのように追跡しますか?
  • Vue+canvas は、ウォーターフォール チャートを上から下までリアルタイムに更新する効果を実現します (QT と同様)
  • Vueデータ割り当て問題の解決
  • Vueはデータを初期状態にリセットします
  • Vue コンポーネント値転送中のデータ損失の分析と解決
  • SpringBoot+Vueでデータ追加機能を実現
  • 手書きの Vue2.0 データハイジャックの例
  • Vueデータ双方向バインディング実装方法
  • Vueでデータを読み取るためにこれを悪用しないでください

<<:  Mac OS に MySQL 5.7.20 をインストールするための詳細なグラフィックとテキストの説明

>>:  Linux コマンド クエリ アプレットでの WePY クラウド開発の実践

推薦する

HTML テーブルの境界線を設定する際のヒント

HTML を初めて使用する多くの人にとって、テーブル <table> は最もよく使用され...

jQueryはアコーディオンの小さなケースを実装します

この記事では、アコーディオンを実装するためのjQueryの具体的なコードを参考までに紹介します。具体...

デザイン視点技術はデザイン能力の重要な資本である

ある設計士はこう尋ねた。「実際のプロジェクト制作には参加せずに、純粋に設計だけをすることはできますか...

フローティングメニューを実装するjQueryプラグイン

毎日jQueryプラグインを学ぶ - フローティングメニュー、参考までに、具体的な内容は次のとおりで...

Chrome 4.0 は GreaseMonkey スクリプトをサポートします

GreaseMokey (中国語では Grease Monkey Script と呼んでいます) は...

jsはタイトルと説明のキーワードを検出し、見つかった場合は置換するか他のページにジャンプします。

キーワード 一般タイトルには、クラック、キー、シリアル番号、キージェネレータなどの単語を含めることは...

Vue はファジークエリを実装します - MySQL データベースデータ

目次1. 需要2. 実装3. 結果1. 需要入力ボックスにデータを入力し、入力結果に基づいてデータベ...

Vue3 のウォッチの使用方法とベストプラクティスガイド

目次序文🌟 1. APIの紹介2. 複数のデータソースの監視3. リスニングアレイ4. 監視対象5....

MySQL でパーティション分割後にクエリを実装するために MRG_MyISAM (MERGE) を使用する例

大量のデータベース データを最適化することは非常に高度な科学であり、開発者が習得する必要がある専門的...

js を使用して USB スキャナー データを取得する方法

この記事では、USBバーコードスキャナデータを取得するjsの具体的なプロセスを参考までに紹介します。...

Linux環境でログファイルを表示するコマンドの詳細な説明

目次序文1. catコマンド: 2. moreコマンド: 3. lessコマンド: 4. headコ...

VMware での Ubuntu Docker のインストール (コンテナ構築)

1. マインドマップ 2. コンテナの構築方法2.1 実験環境の準備(1)環境選択管理ツール: D...

MySQL データベースの 1045 エラーの解決方法

ローカル データベースがサーバー データベースに接続されているときに発生する 1045 の問題を解決...

MySQL の問題を解決する: MSVCR120.dll が見つからないため、コードの実行を続行できません

1. 問題MySQL の初期化時に発生する問題は、次のとおりです。 1. 「MSVCR120.dll...

Kubernetes YAMLファイルの使用

目次01 YAMLファイルの概要YAML---キー値型YAML---リスト型02 K8Sにおけるマス...