Element-ui の組み込み 2 つのリモート検索 (ファジークエリ) の使用方法の説明

Element-ui の組み込み 2 つのリモート検索 (ファジークエリ) の使用方法の説明

問題の説明

フロントエンドリモート検索やファジークエリと呼ばれる種類のクエリがあります。 Ele.me には、これを行うための 2 つの方法があります。1 つは el-input で el-autocomplete を使用する方法、もう 1 つは el-select と el-option を使用する方法です。どちらのオプションも受け入れ可能ですが、具体的な実装のアイデアについてはバックエンドと話し合う必要があります。あいまいクエリを実行するのは誰ですか?

バックエンドが

その後、フロントエンドは、ユーザーが入力ボックスに入力したキーワードをバックエンドに投げるだけです。バックエンドは、フロントエンドから渡されたユーザーがクエリしたいキーワードに基づいてデータベースでファジークエリを実行し、見つかった関連データをフロントエンドに投げます。フロントエンドはデータを取得した後、それを直接ユーザーに提示できます。フロントエンドで時間を節約

フロントエンドが

通常の状況では、バックエンドは実際にはよりあいまいなクエリを実行します。ユーザーが文字「王」を入力し、文字「王」を含むすべてのデータをクエリするとします。データベースに数万のデータがある場合、バックエンドは一度に数万のデータをフロントエンドに投げるでしょうか?フロントエンドはフィルタリング、選択、検索を実行しますか?これにより、フロントエンドがバックエンドから返されたデータをフィルタリングするときにデータが変更されるなどして、フロントエンドが長時間停止し、データが不正確になります。しかし、フロントエンドができないということではありません。この記事では、Ele.me が提供する 2 つの方法を紹介します。個人的には 2 番目の方法を好みます。さっそく、コードを紹介します...

方法1

方法1の効果図

「Sun」という単語を入力すると、関連データが表示されます。これがファジークエリの意味です。

<テンプレート>
 <div id="アプリ">
  <!-- リモート検索の場合は、filterable と remote を使用します -->
  <el-選択
   v-model="値"
   フィルター可能
   リモート
   placeholder="キーワードを入力してください"
   :remote-method="リモートメソッド"
   :loading="読み込み中"
  >
   <!-- リモートメソッドによってカプセル化されたフック関数。ユーザーが入力ボックスにコンテンツを入力すると、この関数の実行がトリガーされます。
   入力ボックスに対応する値は、コールバック関数にパラメータとして渡されます。読み込みとは、リモート検索中の待機時間を意味します。つまり、読み込み中 -->
   <el-オプション
    v-for="オプション内の項目"
    :key="アイテム.値"
    :label="アイテム.ラベル"
    :value="アイテムの値"
   >
   </el-option>
  </el-select>
 </div>
</テンプレート>
<スクリプト>
エクスポートデフォルト{
 名前:「アプリ」、
 データ() {
  戻る {
   オプション: [],
   価値: []、
   読み込み中: false、
  };
 },
 メソッド: {
  // ユーザーがリモート検索ファジークエリを開始するためにコンテンツを入力すると、remoteMethodメソッドremoteMethod(query) {
   // ユーザーがコンテンツを入力した場合、データを取得するためのリクエストを送信し、リモートであいまいクエリを検索します if (query !== "") {
    this.loading = true; // データの取得を開始します // ここではリクエストの送信をシミュレートし、res はリクエストによって返されるデータと見なされます。
    res = [とする
     {
      ラベル: 「孫悟空」、
      値: 500、
     },
     {
      ラベル:「孫尚香」、
      値: 18,
     },
     {
      ラベル:「沙僧侶」、
      値: 1000、
     },
     {
      ラベル:「沙ジュニア兄弟」、
      値: 999、
     },
    ];
    this.loading = false // データを取得します // 次に、最初に取得したすべてのデータをフィルタリングし、関連するデータを新しい配列にフィルタリングして、this.options = res.filter((item)=>{ を使用してオプションに渡します

     // indexOf が 0 の場合、最初の単語のみが一致することを意味します。たとえば、Wang Wang Xiaohu のデータを検索するとフィルター処理されますが、Xiaohu Wang のデータはフィルター処理されません。 indexOf が 0 なので、何かで始まることを意味します // return item.label.toLowerCase().indexOf(query.toLowerCase()) == 0

     // indexOf が -1 より大きい場合、単語が出現する限りフィルタリングされます。たとえば、Wang Wang Xiaohu、Xiao Hu Wang、Xiao Wang Hu を検索すると、すべてフィルタリングされます。 indexOf は見つけることができないため、-1 を返します。
     // -1 より大きい場合は、先頭、中間、末尾のいずれであっても、存在する限り OK です。 return item.label.toLowerCase().indexOf(query.toLowerCase()) > -1
    })
   } それ以外 {
    this.options = [];
   }
  },
 },
};
</スクリプト>

正直に言うと、私は個人的に方法 2 の方が好きです。さあ、コードを入れて

方法2

方法2の効果図

<テンプレート>
 <div id="アプリ">
  <div>
   <el-オートコンプリート
    v-model="state2"
    :fetch-suggestions="クエリ検索"
    placeholder="コンテンツを入力してください"
    :トリガーオンフォーカス="false"
    @select="ハンドル選択"
    サイズ="小"
   </el-オートコンプリート>
  </div>
  <div>
   <ul>
    <li v-for="(item, index) in fruit" :key="index">{{ item.value }}</li>
   </ul>
  </div>
 </div>
</テンプレート>
<スクリプト>
エクスポートデフォルト{
 名前:「アプリ」、
 データ() {
  戻る {
   状態2: "",
   フルーツ:
    {
     値: "バナナ"、
     価格: "8.58",
    },
    {
     値: "チェリー"、
     価格: "39.99",
    },
    {
     値: "ウォールナット"、
     価格: "26.36",
    },
    {
     値: "マンゴー",
     価格: "15.78",
    },
   ]、
  };
 },
 メソッド: {
  // ステップ 2 // queryString が空でない場合は、ユーザーが何かを入力したことを意味します。ユーザーの入力をデータベースと比較します。あいまいな関連付けがある場合は、それを直接取得し、検索候補とともに入力ボックスに返します。入力ボックスには、返されたデータがドロップダウン ボックスの形式で表示され、ユーザーが選択できます。
  クエリ検索(クエリ文字列、cb) {
   クエリ文字列が "" の場合
    // コンテンツを入力した後にあいまい検索を実行する setTimeout(() => {
     let callBackArr = []; // 空の配列を準備します。これは最終的に入力ボックスに返される配列です // この res はリクエストを送信した後にバックエンドから取得されるデータです const res = [
      {
       値: "Apple",
       価格: "13.25",
      },
      {
       値: "Apple 1",
       価格: "13.25",
      },
      {
       値: "Apple 2",
       価格: "13.25",
      },
      {
       値: "Apple 3",
       価格: "13.25",
      },
      {
       値: "Apple 4",
       価格: "13.25",
      },
      {
       値: "Apple 5",
       価格: "13.25",
      },
      
     ];
     res.forEach((アイテム) => {
      // データベースを走査し、ユーザーが入力した単語をデータベース内の各項目と比較します // if (item.value.indexOf(queryString) == 0) { // 0 に等しく、何かで始まる if (item.value.indexOf(queryString) > -1) { // -1 より大きい。含まれている限り、位置は関係ありません // 関連データがある場合 callBackArr.push(item); // それを callBackArr に格納し、返して提示する準備をします }
     });
     // この一連のクエリ操作の後、配列がまだ空の場合は、関連するデータが見つからなかったことを意味し、データがないことが直接ユーザーに返されます if (callBackArr.length == 0) {
      cb([{ 値: "データなし", 価格: "データなし" }]);
     }
     // この一連のクエリ操作の後にデータが見つかった場合、関連データを含む配列 callBackArr がユーザーに表示されます。それ以外の場合は {
      cb(コールバックArr);
     }
    }, 1000);
   }
  },
  // handleSelect(item) に配置されているものをクリックします。
   this.fruit = []
   this.fruit.push(アイテム)
  },
 },
};
</スクリプト>

要約する

どちらもデータの要求、データの取得、データの処理とフィルタリング、データの提示という点で似ています。この記事のケースでは、ファジークエリフィルタリングとデータのスクリーニングはフロントエンドで行われていますが、もちろんバックエンドで行うこともできます。具体的なプロジェクトを行う際には、バックエンドと相談することができます。

Element-ui に付属する 2 つのリモート検索 (ファジークエリ) の使用方法に関するこの記事はこれで終わりです。Element-ui ファジークエリに関する関連コンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • VueはInput入力ボックスのファジークエリメソッドを実装します
  • Vueは入力ボックスのファジークエリのサンプルコードを実装します(スロットリング機能の適用シナリオ)
  • Vue2 フィルター ファジー クエリ メソッド
  • Vue 入力ボックスのファジークエリのサンプルコード

<<:  歴史的な Linux 画像処理および修復ソリューション

>>:  MySQL でのインデックスの追加と削除に関連する操作

推薦する

vue3を使用してAppleシステムのサイドメッセージプロンプト効果を模倣する

目次アニメーションプレビューその他のUIライブラリ始めるコンポーネントディレクトリ構造トーストおおよ...

Docker を使用した Laravel アプリケーションのデプロイ例

この記事で使用されているPHPベースイメージはphp:7.3-apacheです。この記事の Lara...

Docker を使ってゼロから SOLO 個人ブログを構築する方法

目次1. 環境整備2. Dockerをインストールする3. MySQLマスタースレーブデータベースを...

Nginxのアクセス制限設定の詳細な説明

Nginxのアクセス制限設定とはNginx のアクセス制限は、IP ベースのアクセス制御とユーザーベ...

Docker+K8S クラスタ環境構築と分散アプリケーション展開

1. Dockerをインストールする yumでdockerをインストール #サービスを開始する sy...

html リンク タグ タイトル属性 改行 マウス ホバー プロンプト コンテンツ 改行効果

オブジェクト上にマウスを移動したときにコンテンツ(タイトル属性の内容)を折り返す方法、HTML タイ...

LinuxのCPU負荷とCPU使用率の詳細な説明

CPU 負荷と CPU 使用率これらは両方とも、ある程度、マシンの忙しさを反映できます。 CPU 使...

HTML テーブル_Powernode Java アカデミー

HTMLで表を描くには、表タグを使用します。 trは行を意味しますtdは列を示すth はテーブ...

JSX を使用してマークアップ コンポーネント スタイルの開発を作成する例 (フロントエンドのコンポーネント化)

目次JSX環境の構築NPMを初期化するwebpackをインストールするBabelをインストールするw...

HTML+CSS を使用して、画像の右上隅に削除の十字と画像削除ボタンを追加します。

記録として、将来使用される可能性があり、困っている友人も使用できます。 BBはもうやめて、まずはレン...

Vue コンポーネント (Vuex を含む) 間の値の転送に関する簡単な説明

目次父から息子へ:息子から父へ: Vuex を使用せずにコンポーネント間で値を渡す方法は、親から子、...

MySQL 接続で認証失敗エラーが発生する場合の分析と解決方法

[問題の説明]アプリケーション側では、次のエラーが時々表示されます。メソッド 'mysql_...

MySQLでデータベースデータ保存ディレクトリを変更する方法

序文MySQL データベースのデフォルトのデータベース ファイルは /var/lib/mysql に...

HTML で div を非表示にする テーブルを非表示にする TABLE または DIV コンテンツの CSS スタイル

今夜、数日間悩まされていた問題を解決しました。本当に解決したかどうかはわかりませんが、解決されている...

CSS パフォーマンスの最適化 - will-change の使用方法の詳細な説明

will-change は、要素にどのような変更が行われるかをブラウザに伝え、ブラウザが事前に最適化...