Vueは動的クエリルール生成コンポーネントを実装します

Vueは動的クエリルール生成コンポーネントを実装します

1. 動的クエリルール

動的クエリルールは、おおよそ次の図のようになります。ユーザのカスタマイズに応じてクエリ文をまとめたり、SQLクエリのwhere条件を大まかに実装したりできる複合コンポーネントです。以下はmongodbのとあるソフトからの抜粋です。

ここに画像の説明を挿入

2. コンポーネント構築のアイデア

ルールコンポーネントの構成形式によれば、それは幹と葉を持つ木とみなすことができ、難しくないように思えます。

2.1 コンポーネント属性データ: ツリー構造の内容であり、次のように定義されます。

{
条件: 'AND'、
ルール: [],
}

fieldList: フィールド リスト配列。選択可能なフィールドのコレクション。

operatorList: 操作リストの配列。オプションの操作のセット。次のように定義されます。

{
     ラベル: 'include',
          値: '⊂',
},

2.2 コンポーネント HTML

ここでは ElementUI を使用して構築されているため、さまざまな UI コントロールを簡単に組み合わせて、必要なインターフェイスを構築できます。
もちろん、このコンポーネントはツリーと見なされるため、再帰コンポーネントでもあり、それ自体の呼び出しも含まれます。

<テンプレート>
    <div class="ルールグループコンテナ">
        <div class="rules-group-header">
            <el-radio-group v-model="data.condition" size="mini">
                <el-radio-button label="AND"></el-radio-button>
                <el-radio-button label="または"></el-radio-button>
            </el-ラジオグループ>
            <div>
                <el-button size="mini" @click="addRule(data)">ルールを追加</el-button>
                <el-button size="mini" @click="addGroup(data)">グループを追加</el-button>
                <el-button v-if="parent" size="mini" @click="delGroup(data, parent)">削除</el-button>
            </div>
        </div>
        <div class="rules-group-body">
            <div class="rules-list">
                <template v-for="(rule, index) in data.rules">
                    <div :key="index" v-if="!rule.condition" class="rule-container">                        
                        <!-- フィールド -->
                        <wt-ドロップダウン
                            クラス="ルール項目"
                            v-model="rule.FilterField"
                            :data="getFieldList(rule.FilterTable)"
                            @change="handleFieldChange(ルール)"
                        </wt-dropdown>
                        <!-- 演算子 -->
                        <wt-ドロップダウン
                            クラス="ルール項目"
                            v-model="rule.Operator"
                            :disabled="inputStatus && rule.FilterField === 'コミュニティ ID'"
                            :data="getRule(rule.FilterTable、rule.FilterField)"
                        </wt-dropdown>
                        <!-- 値 -->
                        <wt-マルチドロップダウン
                            クラス="ルール項目長"
                            v-if="rule.type === 'ドロップダウン'"
                            :disabled="inputStatus && rule.FilterField === 'コミュニティ ID'"
                            v-model="rule.FilterValue"
                            :data="getData(rule.FilterTable、rule.FilterField)"
                        </wt-multi-dropdown>
                        <重量番号
                            クラス="ルール項目長"
                            :disabled="inputStatus && rule.FilterField === 'コミュニティ ID'"
                            v-else-if="['DateTime', 'Number', 'Decimal'].includes(rule.type)"
                            v-model="rule.FilterValue"
                        </wt-number>
                        <wt-text class="rule-item-long" v-else v-model="rule.FilterValue" :disabled="inputStatus && rule.FilterField === 'CommunityId'"></wt-text>
                        <el-button size="mini" @click="delRule(index)">削除</el-button>
                    </div>
                    <ルールの作成
                        :key="インデックス"
                        v-else
                        :data="ルール"
                        :parent="データ"
                        :fieldList="フィールドリスト"
                        :operatorList="演算子リスト"
                    </ルールの作成>
                </テンプレート>
            </div>
        </div>
    </div>
</テンプレート>

2.3 異なるデータ型のフィールドに異なる条件を定義する

定数ルール = {
    弦: [
        {
            値: '==',
            ラベル: '等しい'、
        },
        {
            値: '<>',
            ラベル: '等しくない'、
        },
        {
            値: '⊂',
            ラベル: 'include'、
        },
        {
            値: '⊄',
            ラベル: '含まれない'、
        },
        {
            値: 'in'、
            ラベル: 「そのうちの一人」
        },
        {
            値: 'ni'、
            ラベル: 「彼らのうちの1人ではない」
        },
        {
            値: 'mc',
            ラベル: 「複数の包含」、
        },
    ]、
    番号: [
        {
            値: '==',
            ラベル: '等しい'、
        },
        {
            値: '<>',
            ラベル: '等しくない'、
        },
        {
            値: '≥',
            ラベル: '以上'、
        },
        {
            値: '≤',
            ラベル: '以下'、
        },
    ]、
    辞書: [
        {
            値: 'in'、
            ラベル: 「そのうちの一人」
        },
        {
            値: 'ni'、
            ラベル: 「彼らのうちの1人ではない」
        },
    ]、
    日付: [
        {
            値: 'sdiff',
            ラベル: '数日前'、
        },
        {
            値: 'ediff',
            ラベル: 「数日後」
        },
    ]、
}

2.4 メソッド操作グループ\ルールの定義

主な操作は、グループルールの追加\削除です。

getRule(テーブル、フィールド) {
            データ = (ルール && ルール.文字列) || []
            theField = this.getCurrentField(テーブル、フィールド) とします。
            if (theField && theField.ControlType) {
                if (['ドロップダウン'].includes(theField.ControlType)) {
                    ルール.dictを返す
                } そうでない場合 (['DateTime'].includes(theField.ControlType)) {
                    ルールを返す.date
                } そうでない場合、(['Number', 'Decimal'].includes(theField.ControlType)) {
                    ルール番号を返す
                } それ以外 {
                    ルール文字列を返す
                }
            }
            データを返す
        },
        // ルールを追加する addRule(data) {
            ルール = {
                タイプ: 'テキスト'、
                フィルターテーブル: this.firstTable、
                フィルターフィールド: this.firstField、
                演算子: '==',
                フィルター値: ''、
            }
            data.rules.push(ルール)
        },
        // ルールを削除する delRule(index) {
            this.data.rules.splice(インデックス、1)
        },
        // グループを追加 addGroup(data) {
            グループ = {
                条件: 'OR'、
                ルール:
                    {
                        タイプ: 'テキスト'、
                        フィルターテーブル: this.firstTable、
                        フィルターフィールド: ''、
                        演算子: ''
                        フィルター値: ''、
                    },
                ]、
            }
            data.rules.push(グループ)
        },
        // グループを削除する delGroup(data, parent) {
            インデックスを parent.rules.findIndex((item) => item === data) とします。
            親.ルール.スプライス(インデックス, 1)
        },

2.5 コンポーネント名の定義

コンポーネントの名前はCreateRuleで、定義コードは非常にシンプルです。

エクスポートデフォルト{
    名前: 'CreateRule',
    小道具: {
        親: {
            タイプ: オブジェクト、
        },
        データ: {
            タイプ: オブジェクト、
        },
        フィールドリスト: {
            タイプ: 配列、
            デフォルト() {
                戻る []
            },
        },
        演算子リスト: {
            タイプ: 配列、
            デフォルト() {
                戻る []
            },
        },
    },
  }

3. コンポーネントを使用する

Vue でコンポーネントを使用するには、コンポーネントを参照してコンポーネント リストに追加するだけです。

'./CreateRule' から CreateRule をインポートします。
エクスポートデフォルト{
    名前: 'NewRuleForm',
    コンポーネント:
        ルールの作成、
    },
}

テンプレートへの参照を追加する

<テンプレート>
    <div class="新しいルールフォーム">
        <ルールの作成
            v-if="!読み込み中"
            :data="データ"
            :fieldList="フィルターテーブル"
            :operatorList="演算子リスト"
        </ルールの作成>
        <div v-if="!loading" class="discription-wrap" v-html="discription"></div>
    </div>
</テンプレート>

4. エフェクト表示

これが傍受の実際の効果です。

ここに画像の説明を挿入

インターフェースでは、検索基準またはフィルター基準として適切に機能し、非常に柔軟に使用できます。

5. まとめ

Vue アプリケーションの開発では、Windows ソフトウェアのいくつかのインターフェースを参照することができ、時折大きなインスピレーションと啓発を与えてくれます。

これで、Vue の動的クエリ ルール生成コンポーネントの実装に関するこの記事は終了です。Vue の動的クエリ ルール生成コンポーネントに関するより関連性の高いコンテンツについては、123WORDPRESS.COM で以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Vue コンポーネントを使用して期間別にデータをクエリする方法の詳細な説明
  • Vue 入力ボックスのファジークエリのサンプルコード
  • VueはInput入力ボックスのファジークエリメソッドを実装します
  • Vue.jsはページングクエリ機能を実装します
  • Vueは時間をクリックして期間クエリを取得する機能を実装します
  • Vue.js でのクエリ操作の詳細な例
  • Vue.js フレームワークを使用して列車チケット検索システムを実装する (ソースコード付き)
  • vue.js をベースにページングクエリ機能を実装する
  • Bootstrap4 + Vue2 を使用してページング クエリを実装するサンプル コード
  • vue+element カスタムクエリコンポーネント

<<:  Docker-Composeコマンドの使い方の詳しい説明

>>:  MySQL 5.7 および MySQL 8.0 でルートパスワードを変更する方法の概要

推薦する

Linux sshのデフォルトのリモートポート番号を変更する6つの手順

Linux のデフォルトの ssh リモート ポートは 22 です。デフォルトのポートは、悪意のある...

MySQL 8.0.22 解凍版インストールチュートリアル(初心者向け)

目次1. リソースのダウンロード2. ソフトウェアを解凍する2.1 場所を選択する2.2 名前を変更...

要素 ui の el-table の列にさまざまなスタイルのデータを動的に実装する例

問題の説明Ele.me UI のフレームワークでは、入力データは el-form であり、出力データ...

Linux プログラムの実行中に動的ライブラリをロードできない場合の解決策

Linux でダイナミック ライブラリをロードできません次のような異常事態が発生した場合./test...

Vue Element フロントエンドアプリケーション開発開発環境の準備

目次概要1. 必要なソフトウェア環境を開発する1) VSコードのインストール2) ノード開発環境をイ...

Tomcat で静的リソースを処理するチュートリアル

序文Tomcat 内のすべてのリクエストは Servlet によって処理され、静的リソースも例外では...

CSS で波の効果を作成するためのアイデア

以前、純粋な CSS を使用して波の効果を実現する方法をいくつか紹介しました。それらについては、次の...

Alibaba Cloud で MySQL リモート接続を構成するための詳細な手順

序文ご存知のとおり、デフォルトでは、Alibaba Cloud にインストールされている MySQL...

JavaScriptのプロトタイプオブジェクトを徹底的に理解しましょう

目次1. プロトタイプとは何ですか? 1.1 関数プロトタイプオブジェクト1.2 コンストラクタを使...

サブセットかどうかを判断するためのMySQLメソッドの手順

目次1. 問題2. 解決策オプション1:オプション2: 1. 問題この話は、エラーと脱落率を照会する...

Nginx を使用してグレースケール リリースを実装する

グレースケールリリースとは、白と黒をスムーズに移行できるリリース方法を指します。 ABテストとは、グ...

Linux システム ディレクトリ sys、tmp、usr、var の詳細な説明。

Linux 初心者から Linux マスターへの成長の道: Linux システム ディレクトリ s...

js の getBoundingClientRect() メソッドの詳細な説明

1. getBoundingClientRect() 分析getBoundingClientRect...

vueはEle.me UIを使用してteambitionのフィルタリング機能を模倣します

目次問題の説明一般的な機能効果は次のとおりです。思考分析完全なコード要約する問題の説明Teambit...

Reactはいくつかの方法でパラメータを渡します

目次親コンポーネントと子コンポーネント間でパラメータを渡すルーティングパラメータステータスの改善コン...