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 クラウド開発の実践

推薦する

CSSアニメーションを途中で止めて姿勢を維持する方法

序文かつて、難しい問題に遭遇しました。タワークレーンからスイングハウスを落下させる必要がありましたが...

Vue プロジェクトに Electron を追加するための詳細なコード

1. package.jsonに追加する "メイン": "electr...

MySQL5.7.17 winx64 インストール バージョン構成方法 Windows Server 2008 R2 でのグラフィック チュートリアル

参考までに、Winでmysql5.7をインストールします。具体的な内容は次のとおりです。 @Auth...

Docker を使用した MySQL のデプロイの詳細説明 (データ永続化)

この記事では、Docker を使用して MySQL をデプロイし、データを保持する方法について簡単に...

JS ES の新機能: 拡張演算子の紹介

1. スプレッド演算子スプレッド演算子は 3 つのドット ... で、複数の引数 (関数呼び出しなど...

Navicat がリモートで SQL Server に接続し、MySQL に変換する詳細な手順

序文最近、プロジェクトで SQL Server を使用するプログラムに遭遇しました。このデータベース...

Vue Element-ui テーブルはツリー構造テーブルを実現します

この記事では、ツリー構造テーブルを実現するためのElement-uiテーブルの具体的なコードを参考ま...

MySQL 5.7.15 のインストールと設定方法のグラフィック チュートリアル (Windows)

MySQL をインストールする必要があるため、インストール手順を以下のように記録します。 自分なり...

有名なウェブサイトのロゴに使われている25種類のフォントのコレクション

この記事では、25 の有名な Web サイト (Google、Yahoo、Twitter、Digg ...

高速レイアウトのための CSS ビューポート単位

CSS ビューポート ユニットはここ数年登場しており、時が経つにつれて、ますます多くの開発者が使用し...

Vue はネストされたルーティングメソッドの例を実装します

1. ネストされたルーティングはサブルーティングとも呼ばれます。実際のアプリケーションでは、通常、ネ...

Dockerコンテナを介してランプアーキテクチャを構築するプロセス

目次1. Centosイメージを取得する2. nginxイメージをビルドする3. MySQLイメージ...

MYSQL マスタースレーブ レプリケーションの知識ポイントの概要

単一の MYSQL サーバーが現在の Web サイトのトラフィックに対応できない場合の最適化ソリュー...

フレックスマルチカラムレイアウトで発生する問題と解決策の詳細な説明

フレックス レイアウトは間違いなくシンプルで使いやすいです。レイアウトをよりシンプルかつ高速にします...