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

推薦する

Windows Server 2008 R2 マルチユーザー リモート デスクトップ接続ライセンス

仕事ではリモート サーバーが必要になることが多く、次の 2 つの問題に遭遇することがよくあります。 ...

jsを使用して簡単な抽選機能を実現する

この記事では、参考までに、簡単な抽選機能を実装するためのjsの具体的なコードを共有します。具体的な内...

MySQL 8.0.11 圧縮版のインストールチュートリアル

この記事では、MySQL 8.0.11のインストールチュートリアルを参考までに紹介します。具体的な内...

アニメーション効果のようなVueトランジションの例

目次結果を一目で見るハート効果デジタルスクロールアニメーションアニメーションのように結果を一目で見る...

シームレスなカルーセルを実現するjQueryプラグイン

シームレス カルーセルは非常に一般的なエフェクトであり、ロジックを理解すれば非常に簡単です。効果は以...

docker公式mysqlイメージのカスタム構成の詳細な説明

インストール時間を節約するために、公式の mysql docker イメージを使用して mysql ...

IframeとFRAMEの違いの分析

1. Iframe タグの使用<br />Iframe については、「忘れられた隅」に放...

JConsoler を使って Tomcat の JVM メモリを監視する方法を説明します

目次1. Tomcatを監視する方法2. Java独自の監視コマンド3. Tomcatのトラブルシュ...

mysql8.0.11データディレクトリ移行の実装

mysql のデフォルトのストレージ ディレクトリは/var/lib/mysql/です。以下は、デフ...

CentOS 6.6 ソースコードのコンパイルと MySQL 5.7.18 のインストールチュートリアルの詳細な説明

1. ユーザーとグループを追加する1. mysqlユーザーグループを追加する # グループ追加mys...

SecureCRT に基づくリモート Linux ホストへのファイルのアップロードとダウンロードのグラフィカルな手順

wget や curl ツールを使用して、Linux サーバーで大規模なネットワーク ファイルを直接...

CSS フレキシブルレイアウト FLEX、メディアクエリ、モバイルクリックイベントの実装

フレックスレイアウト定義: Flexレイアウトの要素は、 Flex 、または略して「コンテナー」と呼...

無効な Nginx クロスドメイン設定 Access-Control-Allow-Origin の解決策

nginx バージョン 1.11.3次の構成を使用すると、検証は無効になり、クロスドメインの問題が依...

W3C標準に準拠したHTML標準で注意すべき点を詳細に解説

XML/HTML コードコンテンツをクリップボードにコピー<!DOCTYPE html PUB...

JSを使用して簡単な計算機を実装する

JSを使用して、参考用の簡単な計算機を完成させます。具体的な内容は次のとおりです。要件: 入力値は数...