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

推薦する

WeChatミニプログラムで検索キーワードを強調表示するサンプルコード

1. はじめにプロジェクトで要件に遭遇したら、データを検索してキーワードを強調表示します。要件を受け...

メタ情報に基づいて時間指定のページ更新またはリダイレクトを実装する

メタを使用して、ページの時間指定更新またはジャンプを実装します。 XML/HTML コードコンテンツ...

CSS のサイズ単位についての簡単な説明

ブラウザの互換性はどんどん良くなってきています。モバイル端末は基本的にすべてWebKitベースです。...

プロジェクトを素早く構築するためのvite+vue3.0+ts+element-plusの実装

目次バイト機能使用環境プロジェクトを構築する構成vite.config.ts tsconfig.js...

ウェブページのコピー防止機能の実装方法(クラッキング手法付き)

ソース ファイルを右クリックすると、次のコードが見つかります。 1. CSSを使用してFirefox...

Apacheドメイン名設定の落とし穴の詳細な説明

私はApacheを使ったことがありません。仕事を始めてからはずっとnginxを使っていました(運用保...

win2008 で mysql8.0.11 を mysql8.0.17 にアップグレードする詳細な手順

アップグレードの背景: MySQLの下位バージョンの脆弱性を解決するために、MySQLはMySQL ...

mysql 5.7.5 m15 winx64.zip インストール チュートリアル

win7 64 ビットで mysql-5.7.5-m15-winx64 をインストールして構成する方...

Reactでのこのリファレンスの詳細な説明

目次原因:以下を実行します: 1. コンストラクター2.レンダリング機能3.bind関数とarrow...

フロントエンドAIカットのコツ(体験談)

AI 画像の切り取りは PS と連携する必要があります。まず、スライスするレイヤーを選択し、それを...

MySQL がデフォルト値を持つ NULL 列の使用を推奨しない理由

よく聞かれる答えは、列に NULL 値を使用するとインデックスが無効になるというものですが、実際にテ...

MySQLデータベースの共通操作スキルのまとめ

この記事では、MySQL データベースの一般的な操作テクニックをまとめます。ご参考までに、詳細は以下...

Vueでルーティング権限を動的に設定する主なアイデア

以前、インターネット上で動的ルーティング設定をいくつか見たことがありましたが、現在のプロジェクトとは...

ノードをMySQLデータベースに接続する際に発生する問題と解決策

今日、MySQL の新しいバージョン (8.0.21) をインストールしましたが、ノード フレームワ...

JavaScript が Jingdong の虫眼鏡の特殊効果を模倣

この記事では、Jingdong虫眼鏡を模倣したJavaScriptの具体的なコードを参考までに共有し...