vue+element カスタムクエリコンポーネント

vue+element カスタムクエリコンポーネント

この記事では主に Vue プロジェクトを紹介します。要素の導入を前提として、コンポーネントを 2 回カプセル化し、設定項目を通じて直接レイアウトを実現します。

1. クエリ条件のコンポーネント化

EventBus.jsの使用と組み合わせることで、イベント配信がより効率的になり、さまざまな複雑なライフサイクルの依存関係を回避できます。
components/dataFormフォルダでは、 dataForm.vueがコンポーネントコレクションのキャリアとして使用され、構成項目が作成されます。

1.1 データフォームのコード例

// データフォーム.vue
<テンプレート>
  <el-行>
    <input-form v-for="(item,index) オプション内" :key="'dataForm_'+index"> 
      <!-- 入力ボックス-->
      <入力フォーム
        :key="インデックス"
        v-if="item.type == '入力'"
        :data='アイテム'
      </入力フォーム>
  </el-row>
</テンプレート>
<スクリプト>
「@/assets/js/eventBus.js」からEventBusをインポートします。
InputForm をインポートします "@/components/dataForm/InputForm"
エクスポートデフォルト{
  コンポーネント:
    入力フォーム、
  },
  小道具: {
    /**
     * フォーム構成項目 * @param {Object} オプション 構成パラメータは次のとおりです。
     * タイプ: フォーム項目タイプ、文字列、オプションの値入力
     */
    オプション:
      タイプ: 配列、
      デフォルト() {
        戻る [];
      },
    },
  },
  データ() {
   戻る {}
  },
  作成された() {
   // これは主にドロップダウンボックス内の他のサブコンポーネントの表示と非表示を実現するためです。EventBus.$on("refreshDataForm", e => {
      this.refreshDataForm(e);
    });
  },
  // ページ破棄イベントの破棄 beforeDestroy() {
    EventBus.$off("refreshDataForm")
    EventBus.$off("handleClick")
  },
  メソッド: {
   // フォームデータを更新する refreshDataForm(item) {
      データ = this.options とします
      データ.forEach((e, i) => {
        if (item.type == e.type && item.name == e.name) {
          this.options[i] = アイテム
        }
      })
    },
    // 子コンポーネントのクリックイベントが親コンポーネントに応答し、データが転送されます handleClick(data) {
     EventBus.$emit("handleClick",データ)
    },
    //フォームデータをフォーマットします(必須項目が必須かどうかを確認できます)
    getDataForm() {
     データ = this.options とします
     formObj = {} とします。
     エラー = ''
     試す {
      データ.forEach(e => {
       if (e.type === ''入力) {
        if (e.require && !e.content) {
         error = '入力してください' + e.label
         エラーをスローする
        }
        formObj[e.name] = e.content
       } そうでない場合 (e.type === 'select' || e.type === 'dataSelect') {
        if (e.require && !e.content) {
         エラー = '選択してください' + e.label
         エラーをスローする
        }
        formObj[e.name] = e.content
       } そうでない場合 (e.type === 'date' || e.type === 'dataRadio') {
        if (e.require && !e.content) {
         エラー = '選択してください' + e.label
         エラーをスローする
        }
        フォームオブジェクト[e.beginName] = e.beginRegTime
        フォームオブジェクト[e.endName] = e.endRegTime
       } そうでない場合 (e.type === 'image') {
        formObj[e.name] = e.file || e.content
       } そうでない場合 (e.type === 'アップロード') {
        formObj[e.name] = e.file || e.content
        if (e.delFileName) { // 添付ファイルのコレクションとカスタム名およびデフォルト名を削除します formObj[e.delFileName] = e.delFileIds.join(',')
        } それ以外 {
         formObj['delFileName'] = e.delFileIds.join(',')
        }
       }
      })
      返品フォームObj
     } キャッチ(エラー){
      this.$message({ message:error, type: 'error'})
     }
    }
  }
}

1.2 サブグループ inputForm.vue

注: ここで参照されているコンポーネントは、ページから個別に参照することもできます。

<テンプレート>
  <エル-コル>
    <el-col :span="data.boxSpan?data.boxSpan:boxSpan" v-if="!data.isHide">
     <el-col :span="data.infoSpan?data.infoSpan:infoSpan">
      <el-col :span="data.infoSpan?data.infoSpan:infoSpan" v-if="data.labelSpan!=0">
       <label class="el-form-item_label" :class="{'require': data.require}" v-html="data.label"></label>
      </el-col>
      <el-col :span="data.contentSpan?data.contentSpan:contentSpan" v-if="data.contentSpan!=0">
       <el-input :class="{'base_textarea': data.textarea}" v-modle.trim="data.content" :type="data.textarea?'textarea':''" :disable="data.readOnly" :placeholder="setPlaceholder" maxlength="200"></el-input>
      </el-col>
     </el-col>
      <span v-text="タイトル"></span>
    </div>
  </el-col>
</テンプレート>
<スクリプト>
エクスポートデフォルト{
 小道具: {
  // 入力ボックスタイプを入力します: {
   タイプ: 文字列、
   デフォルト: 'input'
  },
  //デフォルトのフェンスレイアウト 8/24
  ボックススパン: {
   タイプ: 数値、
   デフォルト: 8
  },
  // デフォルトのフェンスレイアウト 24/24
  情報範囲: {
   タイプ: 数値、
   デフォルト: 24
  },
  //デフォルトのフェンスレイアウト 8/24
  スパン: {
   タイプ: 数値、
   デフォルト: 8
  },
  //デフォルトのフェンスレイアウト 16/24
  コンテンツスパン: {
   タイプ: 数値、
   デフォルト: 16
  },
  /**
  * name キーワード * type フォームタイプ * label フォームタイトル * content フォームコンテンツ * readOnly 読み取り専用 デフォルト いいえ * isHide 非表示 デフォルト いいえ * textarea テキストタイプ デフォルト いいえ **/
  データ: {
   タイプ: オブジェクト、
   デフォルト() {
    戻る []
   }
  }
 },
 計算: {
  プレースホルダーを設定する() {
   if(this.data.readOnly && !this.data.content) {
    戻る ''
   } 
   「入力してください」を返す
  }
 }
}
</スクリプト>
<スタイルスコープ>
 // 必須 style.require::after {
  コンテンツ: '*';
  色:赤;
 }
 // フレックスレイアウトのタイトルを垂直に中央揃えします。el-form-item__label {
  フロート:右;
  マージンボトム:0;
  行の高さ: 20px;
  ディスプレイ: フレックス;
  アイテムの位置を中央揃えにします。
  最小高さ: 40px;
 }
</スタイル>

1.3 親ページの参照と使用

<テンプレート>
  <el-行>
    <データフォーム:options='searchArray' ref='searchArray'></入力フォーム>
  </el-row>
</テンプレート>

<スクリプト>
 「@/assets/js/eventBus.js」からEventBusをインポートします。
 DataForm をインポートします "@/components/dataForm/dataForm"
 エクスポートデフォルト{
  コンポーネント:
   データフォーム
  },
  データ() {
   戻る {
    // クエリメニュー構成 searchArray: [
     {
      名前: 'personName',
      タイプ: '入力'、
      ラベル: 'ユーザー名',
      コンテンツ: ''
     },
     {
      名前: 'personName2',
      タイプ: '入力'、
      ラベル: 'ユーザー名 2',
      コンテンツ: ''
     }
    ]
   }
  },
  作成された() {
   // 子コンポーネントのパラメータをリッスンする EventBus.$on('refreshDataForm', e => {
    this.refreshDataForm(e)
   })
  },
  破壊された() {
   // サブコンポーネントパラメータを破棄します。EventBus.$off('refreshDataForm')
  },
  メソッド: {
   // サブコンポーネント操作をリッスンする refreshDataForm(e) {
    //ロジックコード this.$forceUpdate()
   },
   //データクエリ handleQuery() {
     // コンポーネントパラメータを取得し、json 形式で返します。let searchArray = this.$refs.searchArray.getDataForm()
    // 必須項目がある場合、戻り値は null となり、ポップアップウィンドウが表示されます if (!searchArray) {
     戻る 
    }
    //クエリインターフェースロジック}
  }
 }
</スクリプト>

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

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

<<:  MySQL 8.0 パスワード有効期限ポリシーの詳細な説明

>>:  HBuilderX で Tomcat 外部サーバーを設定して、JSP インターフェイスを表示および編集する方法の詳細な説明

推薦する

SpringBoot プロジェクトの Docker 環境を実行するときに発生する無限再起動問題の詳細な説明

もしかしたら私の考え方が間違っていたのかもしれないし、問題の説明が少し乱雑だったのかもしれないが、こ...

Reactフック入門チュートリアル

ステートフック例: 'react' から useState をインポートします。 関...

ブリージングカルーセルを実装するネイティブJS

今日は、ネイティブ JS で実装されたブリージング カルーセルを紹介します。効果は次のとおりです。 ...

MySQL 5.7.20 共通ダウンロード、インストール、設定方法と簡単な操作スキル(解凍版無料インストール)

早朝に MySQL 5.7.19 のインストールを終えたばかりですが、午前中に MySQL が最新バ...

Dockerfileを使用してApacheイメージを作成する方法

目次1. Dockerイメージ2. 既存のイメージに基づいてインスタンスを作成する3. ローカルテン...

Linux suse11でルートパスワードを忘れた場合に変更する方法の簡単な分析

SUSE Linuxでルートパスワードを忘れた場合の解決方法SUSE (Linux オペレーティング...

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

この記事は、参考のためにMySQL 8.0.12のインストールグラフィックチュートリアルを記録してい...

Linux で複数の mysql5.7.19 (tar.gz) ファイルをインストールする方法

LinuxでのMySQL-5.7.19バージョンの初心者向けの最初のインストールについては、前の記事...

MySQL PXC クラスターの構築方法

目次1. PXCの紹介1.1 PXC の紹介1.2 PXC の特徴と利点1.3 PXCの限界と欠点1...

MySQL SQL文の特殊処理文のまとめ(必読)

1.テーブル全体を更新します。データ行の列の値が空の場合は、別の列フィールドの値と同じにします。 ...

MySQL の計画タスクとイベント スケジュール例の分析

この記事では、例を使用して、MySQL の計画されたタスクとイベントのスケジュールについて説明します...

LNMP と phpMyAdmin を Docker にデプロイする方法

環境準備:複数のコンテナに基づいてホストに lnmp をデプロイします。 nginx サービス: 1...

MySQL 8.0 のインデックス スキップ スキャン

序文MySQL 8.0.13 では、インデックス スキップ スキャン (インデックス ジャンプ スキ...

MYSQLストアドプロシージャコメントの詳細な説明

目次1. 使用方法2. 準備3. 文法3.1 変数と代入3.2 入力および出力パラメータ3.3 プロ...