この記事では主に Vue プロジェクトを紹介します。要素の導入を前提として、コンポーネントを 2 回カプセル化し、設定項目を通じて直接レイアウトを実現します。 1. クエリ条件のコンポーネント化EventBus.jsの使用と組み合わせることで、イベント配信がより効率的になり、さまざまな複雑なライフサイクルの依存関係を回避できます。 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 を応援していただければ幸いです。 以下もご興味があるかもしれません:
|
<<: MySQL 8.0 パスワード有効期限ポリシーの詳細な説明
>>: HBuilderX で Tomcat 外部サーバーを設定して、JSP インターフェイスを表示および編集する方法の詳細な説明
仕事ではリモート サーバーが必要になることが多く、次の 2 つの問題に遭遇することがよくあります。 ...
この記事では、参考までに、簡単な抽選機能を実装するためのjsの具体的なコードを共有します。具体的な内...
この記事では、MySQL 8.0.11のインストールチュートリアルを参考までに紹介します。具体的な内...
目次結果を一目で見るハート効果デジタルスクロールアニメーションアニメーションのように結果を一目で見る...
シームレス カルーセルは非常に一般的なエフェクトであり、ロジックを理解すれば非常に簡単です。効果は以...
インストール時間を節約するために、公式の mysql docker イメージを使用して mysql ...
1. Iframe タグの使用<br />Iframe については、「忘れられた隅」に放...
目次1. Tomcatを監視する方法2. Java独自の監視コマンド3. Tomcatのトラブルシュ...
mysql のデフォルトのストレージ ディレクトリは/var/lib/mysql/です。以下は、デフ...
1. ユーザーとグループを追加する1. mysqlユーザーグループを追加する # グループ追加mys...
wget や curl ツールを使用して、Linux サーバーで大規模なネットワーク ファイルを直接...
フレックスレイアウト定義: Flexレイアウトの要素は、 Flex 、または略して「コンテナー」と呼...
nginx バージョン 1.11.3次の構成を使用すると、検証は無効になり、クロスドメインの問題が依...
XML/HTML コードコンテンツをクリップボードにコピー<!DOCTYPE html PUB...
JSを使用して、参考用の簡単な計算機を完成させます。具体的な内容は次のとおりです。要件: 入力値は数...