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 インターフェイスを表示および編集する方法の詳細な説明

推薦する

純粋なHTML+CSSでタイピング効果を実現

この記事は主に、一定の参考値を持つ純粋な HTML + CSS によって実現されるタイピング効果を紹...

MySQL無料インストール版のパスワードの設定と変更に関するチュートリアル

ステップ 1: 環境変数を構成する (解凍パス: G:\mysql\mysql-5.7.21-win...

Vue カードスタイルのクリックして切り替える画像コンポーネントの使用方法の詳細な説明

この記事では、vueカードスタイルのクリックして切り替える画像コンポーネントを参考までに紹介します。...

ウィンドウとLinuxプロジェクトを展開する際のLinuxファイルパスに問題はありません

長い間ブログを書いていませんでした。先週、プロジェクトをテストしたところ、いくつかのバグが見つかりま...

MySQL マスタースレーブレプリケーション構成プロセス

メインライブラリの構成1. MySQLを設定する vim /etc/my.cn # ファイルに次の内...

Vue.js ドラッグ可能なテキストボックスコンポーネントの使用方法の詳細な説明

目次コンポーネントの登録コンポーネントの追加ソースコードドラッグ可能なテキスト ボックスでは、ユーザ...

W3C チュートリアル (4): W3C XHTML アクティビティ

HTML は、World Wide Web 上で公開するために使用されるハイブリッド言語です。 XH...

HTML Webページの例を使用してヘッドエリアコードの意味を説明する

例を使って、Webページのヘッダー情報の意味を理解しましょう。 <!DOCTYPE HTML ...

Vue 仮想 DOM クイックスタート

目次仮想DOM仮想DOMとは何か仮想DOMの役割Vue の仮想 DOM vノードvNodeとはvNo...

Tomcat マルチインスタンスの展開と構成の原則

1. ファイアウォールをオフにし、Tomcatのインストールに必要なソフトウェアパッケージを/opt...

Nginxは特定のページへのIPアクセスを制限します

1.すべてのIPアドレスが3つのページa1.htm、a2.htm、a3.htmにアクセスするのを禁止...

MySQL セレクトキャッシュメカニズムの使用に関する詳細な説明

MySQL クエリ キャッシュはデフォルトでオンになっています。ある程度、クエリの効果は向上しますが...

Dockerのローカルイメージ作成方法の分析

コンテナと呼ばれるものは、実際には親イメージに基づいて読み取りおよび書き込み可能なファイル階層を作成...

Docker に MySQL と MariaDB をインストールする方法

MySQLとMariaDBの関係MariaDB データベース管理システムは MySQL のブランチで...

Mac 向け MySQL 5.7.17 のインストールと設定のチュートリアル

1. MySQLをダウンロードする公式サイトのダウンロードページをクリックすると次のページに入ります...