ホームページ ウェブフロントエンド jsチュートリアル Vue+ElementUI はフォームの動的なレンダリングと視覚的な構成を実装します

Vue+ElementUI はフォームの動的なレンダリングと視覚的な構成を実装します

May 31, 2018 pm 05:53 PM
動的 レンダリング

この記事では、動的レンダリングとフォームの視覚的な構成を実現するための Vue+ElementUI の方法を主に紹介します。必要な友人はそれを参照してください。

動的レンダリングとは、おそらく次のような非同期データを持つことを意味します。この json を配置するには、次のようにレンダリングされます:

最後に送信されたフォーム データは次のようになります:

{
 "inline": true,
 "labelPosition": "right",
 "labelWidth": "",
 "size": "small",
 "statusIcon": true,
 "formItemList": [
 {
 "type": "input",
 "label": "姓名",
 "disable": false,
 "readonly": false,
 "value": "",
 "placeholder": "请输入姓名",
 "rules": [],
 "key": "name",
 "subtype": "text"
 },
 {
 "type": "radio",
 "label": "性别",
 "value": "",
 "button": false,
 "border": true,
 "rules": [],
 "key": "gender",
 "options": [
 {
  "value": "1",
  "label": "男",
  "disabled": false
 },
 {
  "value": "0",
  "label": "女",
  "disabled": false
 }
 ]
 }
 ]
}
ログイン後にコピー

そして、私たちの目標は、そのようなコンポーネントをカプセル化することです:

{
 "name": "Genji",
 "gender": "1"
}
ログイン後にコピー

実装 始める前に、 v-model 原則の仕組みを知る必要があります:

<dynamic-form :config="someConfig" v-model="someData" />
ログイン後にコピー

これは、次の例の糖衣構文にすぎません:

<input v-model="something">
ログイン後にコピー

これを理解した後、このコンポーネントを段階的に実装しましょう。

まず、設定を el-form に転送します:

<input
 :value="something"
 @input="something = $event.target.value">
ログイン後にコピー

次に、デフォルト値を設定します。

form-item には v-model が必要なので、レンダリングする前に、各フィールドに値があることを確認してください。ここで注意すべき点の 1 つは、コンポーネントは親コンポーネントによって渡された prop を直接変更してはいけないということです。そのため、 {...this.value} を使用してそれをここにすばやくコピーし、最後に変更しません。親コンポーネントへの通知を忘れないでください。コードは次のとおりです:

<template>
 <el-form 
 class="dynamic-form" 
 :inline="formConfig.inline" 
 :model="value" 
 :label-position="formConfig.labelPosition" 
 :label-width="formConfig.labelWidth" 
 :size=&#39;formConfig.size&#39; 
 :status-icon="formConfig.statusIcon">
 <slot/>
 </el-form>
</template>
<script>
export default {
 props: {
 formConfig: {
 type: Object,
 required: true
 },
 value: {
 type: Object,
 required: true
 }
 },
}
</script>
ログイン後にコピー

3 番目のステップは、フォーム項目をレンダリングすることです。 form-item 都会需要一个 v-model ,所以在渲染之前,保证每个字段都有值。这里需要注意一点,组件内不要直接修改父组件传入的 prop ,所以我们在这里用 {...this.value} 快速拷贝一份,最后别忘了通知父组件。代码如下:

export default {
 props: {
 formConfig: {...},
 value: {...},
 },
 methods: {
 setDefaultValue() {
 const formData = { ...this.value }
 // 设置默认值
 this.formConfig.formItemList.forEach(({ key, value }) => {
 if (formData[key] === undefined || formData[key] === null) {
  formData[key] = value
 }
 })
 this.$emit(&#39;input&#39;, formData)
 }
 },
 mounted() {
 this.setDefaultValue()
 },
}
ログイン後にコピー

第三步,渲染 form-item 。

如何把下面的数据渲染为我们熟悉的 el-form-item ?

{
 "type": "input",
 "label": "姓名",
 "disable": false,
 "readonly": false,
 "value": "",
 "placeholder": "请输入姓名",
 "rules": [],
 "key": "name",
 "subtype": "text"
}
ログイン後にコピー

第一种,利用 vue 内置的 component 组件,写起来可能像这样:

<el-form-item>
 <component :is="`el-${item.type}`" />
</el-form-item>
ログイン後にコピー

第二种,使用 v-if 逐个判断:

<el-form-item>
 <el-input v-if="item.type === &#39;input&#39;" />
 <span v-else>未知控件类型</span>
</el-form-item>
ログイン後にコピー

考虑到每种表单控件的处理逻辑千差万别,楼主采用了第二种方式。

根据这个思路,我们来封装一个 dynamic-form-item ,接收一个 item ,渲染一个 el-form-item :

<template>
 <el-form-item :rules="item.Rules" :label="item.label" :prop="item.key">
 <el-input 
 v-if="item.type===&#39;input&#39;" 
 v-bind="$attrs" v-on="$listeners" 
 :type="item.subtype" 
 :placeholder="item.placeholder" 
 :disabled="item.disable" 
 :readonly="item.readonly" 
 :autosize="item.autosize"></el-input>
 <el-select 
 v-else-if="item.type===&#39;select&#39;" 
 v-bind="$attrs" v-on="$listeners"
 :multiple="item.multiple" 
 :disabled="item.disabled" 
 :multiple-limit="item.multipleLimit">
  <el-option 
  v-for="o in item.options" 
  :key="o.value" 
  :label="o.label" 
  :value="o.value" 
  :disabled="o.disabled">
  </el-option>
 </el-select>
 <!--突然有点想念JSX-->
 ...
 <span v-else>未知控件类型</span>
 </el-form-item>
</template>
<script>
export default {
 props: {
 item: {
 type: Object,
 required: true
 }
 }
}
</script>
ログイン後にコピー

tips: 使用 v-bind="$attrs" v-on="$listeners" 可以方便地转发父组件的 v-model 指令,详见vue高阶组件。

最后,我们就可以循环输出一个完整的表单了:

<dynamic-form-item
 v-for="item in formConfig.formItemList"
 :key="item.key"
 v-if="value[item.key]!==undefined"
 :item="item"
 :value="value[item.key]"
 @input="handleInput($event, item.key)" />
ログイン後にコピー

这里不能用 v-model="value[item.key]" ,上文说了,组件内不能直接修改props,所以这里我们还是转发一下。

methods: {
 handleInput(val, key) {
 // 这里element-ui没有上报event,直接就是value了
 this.$emit(&#39;input&#39;, { ...this.value, [key]: val })
 },
 setDefaultValue() {...}
},
ログイン後にコピー

完整代码地址: src/components/dynamic-form/form.vue

扩展功能

1.数字显示单位,限制小数位数

element-ui 没有做这个功能,不过我觉得还是挺常见的,所以使用 el-input 手动封装了一个 input-number :

<!--普通使用-->
<input-number 
 v-model="someNumber"
 :min="1" 
 :max="99" 
 :decimal1="2" 
 append="元"></input-number>
<!--在dynamic-form-item中的应用-->
<input-number 
 v-else-if="item.type===&#39;number&#39;" 
 v-bind="$attrs" v-on="$listeners" 
 :min="item.min" 
 :max="item.max" 
 :decimal1="item.decimal1" 
 :append="item.append" 
 :prepend="item.prepend" 
 :disabled="item.disabled"></input-number>
ログイン後にコピー

完整代码: src/components/dynamic-form/input-number.vue

2.异步验证

得益于 async-validator ,我们可以很方便地自定义验证规则。

在配置中

{
 "type": "input",
 ...
 "rules":[
  {
   "sql": "SELECT {key} FROM balabala",
   "message": "xx已被占用",
   "trigger": "blur"
  }
 ]
}
ログイン後にコピー

dynamic-form-item

次のデータを使い慣れた el-form-item にレンダリングするにはどうすればよいですか?

<template>
 <el-form-item :rules="Rules" >
  ...
 </el-form-item>
</template>
<script>
import request from &#39;@/utils/request&#39;
export default {
 props: {
 item: {...}
 },
 computed: {
 Rules() {
  const rules = this.item.rules
  if (rules === undefined) return undefined
  const R = []
  rules.forEach(rule => {
  if (rule.sql) {
   const validator = (rule2, value, callback) => {
   // 根据项目自行修改
   request(&#39;/api/validate&#39;, &#39;POST&#39;, {
    key: rule2.field,
    value,
    sql: rule.sql.replace(/{key}/ig, rule2.field)
   })
    .then(res => {
    callback(!res || undefined)
    })
    .catch(err => {
    this.$message.error(err.message)
    callback(false)
    })
   }
   R.push({ validator, message: rule.message, trigger: &#39;blur&#39; })
  } else {
   R.push(rule)
  }
  })
  return R
 }
 },
}
</script>
ログイン後にコピー

1 つ目の方法は、Vue の組み込みコンポーネント コンポーネントを使用することです。これは次のように記述できます:

{
 "type": "cascader",
 ...
 "areaShortcut": "provinceAndCityData"
}
ログイン後にコピー

2 つ目の方法は、v-if を使用して 1 つずつ判断することです:

<template>
 <el-form-item>
  ...
  <el-cascader 
   :options="item.options || require(&#39;element-china-area-data&#39;)[item.areaShortcut]"
   ></el-cascader>
 </el-form-item>
</template>
ログイン後にコピー

各フォーム コントロールは大きく異なるため、著者は 2 番目の方法を採用しています。

このアイデアに従って、dynamic-form-item をカプセル化し、項目を受け取り、el-form-item をレンダリングします。

{
 "type": "checkbox",
 ...
 "optionsUrl": "/api/some/options"
}
ログイン後にコピー

ヒント: v-bind=" を使用します。 $ attrs" v-on="$listeners" は、親コンポーネントの v-model ディレクティブを簡単に転送できます。詳細については、vue の上位コンポーネントを参照してください。

最後に、完全なフォームをループアウトできます:

<template>
 <el-form-item>
  ...
  <el-select>
   <el-option 
    v-for="o in item.options || ajaxOptions"
    ></el-option>
  </el-select>
 </el-form-item>
</template>
<script>
import request from &#39;@/utils/request&#39;
export default {
 props: {
 item: {...}
 },
 computed: {...},
 data() {
 return {
  ajaxOptions: []
 }
 },
 created() {
 const { optionsUrl, key, type } = this.item
 if (optionsUrl) {
  // 根据项目自行修改
  request(`${optionsUrl}?key=${key}`, &#39;GET&#39;)
  .then(res => {
   this.ajaxOptions = res
  })
  .catch(err => { this.$message.error(err.message) })
 }
 }
}
</script>
ログイン後にコピー
v-model="value[item.key]" はここでは使用できません 前述したように、コンポーネントを直接使用することはできません props を変更します。 、ここに転送します。

rrreee

完全なコードアドレス: src/components/dynamic-form/form.vue

拡張機能

1. 数値表示単位、小数点以下の桁数が制限されています

element -ui にはこの機能はありませんが、非常に一般的だと思うので、el-input を使用して input-number を手動でカプセル化しました:

rrreee

完全なコード: src/components/dynamic-form/input-number.vue🎜🎜🎜🎜 2. 非同期検証🎜🎜🎜🎜 async-validator のおかげで、検証ルールを簡単にカスタマイズできます。 🎜🎜 🎜🎜設定内🎜rrreee🎜in Dynamic-form-item コンポーネントで、item.rules をトラバースし、SQL 検証をカスタム バリデーター関数に変換します: 🎜rrreee🎜3. 省と都市のクイック構成🎜🎜 element-china-area- の作者に感謝します。データ 。 🎜🎜設定内:🎜rrreee🎜 動的フォーム項目コンポーネント内:🎜rrreee🎜4. リモートからのオプションのロード🎜🎜ラジオ、チェックボックス、カスケード、選択が含まれますが、これらに限定されません🎜🎜設定内:🎜rrreee🎜In Dynamic-form-item コンポーネント: 🎜rrreee🎜 以上は皆さんのためにまとめたもので、今後皆さんのお役に立てれば幸いです。 🎜🎜関連記事: 🎜🎜🎜mongodbデータベースに接続するnodejsメソッドの例🎜🎜🎜🎜iviewでのセレクタの複数選択検証方法🎜🎜🎜🎜Axios要素を使用してグローバルリクエストロードメソッドを実装する🎜🎜

以上がVue+ElementUI はフォームの動的なレンダリングと視覚的な構成を実装しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

修正: Windows 11 の動的リフレッシュ レートが機能しない 修正: Windows 11 の動的リフレッシュ レートが機能しない Apr 13, 2023 pm 08:52 PM

1 秒あたりの画像の更新回数をカウントすることで、画面のリフレッシュ レートを測定できます。 DRR は Windows 11 に含まれる新機能で、スムーズな表示を提供しながらバッテリー寿命を節約するのに役立ちますが、適切に動作しないことがあっても不思議ではありません。より多くのメーカーが 60Hz モニターの生産を中止する計画を発表するため、より高いリフレッシュ レートの画面がより一般的になることが予想されます。これにより、スクロールがスムーズになり、ゲームの質も向上しますが、その代償としてバッテリー寿命が短くなります。ただし、この OS の動的リフレッシュ レート機能は、全体的なエクスペリエンスに大きな影響を与える可能性がある気の利いた追加機能です。 Windows 11 の動的リフレッシュ レートが機能しない場合の対処法について説明しますので、読み続けてください。

iPhone画面録画でダイナミックアイランドと赤いインジケーターを非表示にする方法 iPhone画面録画でダイナミックアイランドと赤いインジケーターを非表示にする方法 Apr 13, 2023 am 09:13 AM

iPhone では、Apple の画面録画機能が画面上で行っていることのビデオを録画します。これは、ゲームプレイをキャプチャしたり、アプリのチュートリアルを誰かに説明したり、バグをデモしたりする場合に便利です。ディスプレイの上部にノッチのある古い iPhone では、画面録画ではノッチが表示されるはずですが、表示されません。ただし、「iPhone 14 Pro」や「iPhone 14 Pro」Max など、「ダイナミック アイランド」のカットアウトを備えた新しい iPhone では、「ダイナミック アイランド」のアニメーションに赤い録画インジケーターが表示され、キャプチャされたビデオにカットアウトが表示されます。これはもしかしたら

VirtualBox 固定ディスクをダイナミック ディスクに、またはその逆に変換します VirtualBox 固定ディスクをダイナミック ディスクに、またはその逆に変換します Mar 25, 2024 am 09:36 AM

仮想マシンを作成するときに、ディスクの種類を選択するように求められます。固定ディスクまたはダイナミック ディスクを選択できます。固定ディスクを選択した後でダイナミック ディスクが必要であることに気付いた場合、またはその逆の場合はどうすればよいでしょうか? いいですね!一方をもう一方に変換できます。この記事では、VirtualBox 固定ディスクをダイナミック ディスクに、またはその逆に変換する方法を説明します。ダイナミック ディスクは、最初は小さいサイズですが、仮想マシンにデータを保存するにつれてサイズが大きくなる仮想ハード ディスクです。ダイナミック ディスクは、必要なだけのホスト ストレージ スペースのみを使用するため、ストレージ スペースを節約するのに非常に効率的です。ただし、ディスク容量が増加すると、コンピュータのパフォーマンスがわずかに影響を受ける可能性があります。仮想マシンでは固定ディスクとダイナミック ディスクが一般的に使用されます

Windows 11でダイナミックディスクをベーシックディスクに変換する方法 Windows 11でダイナミックディスクをベーシックディスクに変換する方法 Sep 23, 2023 pm 11:33 PM

Windows 11 でダイナミック ディスクをベーシック ディスクに変換する場合は、プロセスによってその中のすべてのデータが消去されるため、最初にバックアップを作成する必要があります。 Windows 11 でダイナミック ディスクをベーシック ディスクに変換する必要があるのはなぜですか? Microsoft によると、ダイナミック ディスクは Windows から廃止され、その使用は推奨されなくなりました。さらに、Windows Home Edition はダイナミック ディスクをサポートしていないため、これらの論理ドライブにアクセスできません。より多くのディスクを結合してより大きなボリュームを作成する場合は、ベーシック ディスクまたは記憶域スペースを使用することをお勧めします。この記事では、Windows 11 でダイナミック ディスクをベーシック ディスクに変換する方法を説明します。 Windows 11 でダイナミック ディスクをベーシック ディスクに変換するにはどうすればよいですか?初めに

Windows 11のデスクトップとスタートメニューにライブタイルを表示する方法 Windows 11のデスクトップとスタートメニューにライブタイルを表示する方法 Apr 14, 2023 pm 05:07 PM

システム上で何かを探しているが、どのアプリケーションを開いて選択すればよいかわからないと想像してください。ここでライブ タイル機能が役に立ちます。サポートされているアプリケーションのライブ タイルをデスクトップまたは Windows システムの [スタート] メニューに追加でき、そのタイルは頻繁に変更されます。 LiveTiles は、アプリケーション ウィジェットを非常に快適な方法で生き生きとさせます。見た目だけでなく、利便性にも優れています。システムで whatsapp または Facebook アプリケーションを使用しているとします。通知の数がアプリケーションのアイコンに表示されたら便利だと思いませんか?これは、サポートされているアプリがライブ タイルとして追加されている場合に可能です。 Windows でそれを行う方法を見てみましょう

Kujiale で直交上面ビューをレンダリングする方法_Kijiale で直交上面ビューをレンダリングするチュートリアル Kujiale で直交上面ビューをレンダリングする方法_Kijiale で直交上面ビューをレンダリングするチュートリアル Apr 02, 2024 pm 01:10 PM

1. まず、Kijiale でレンダリングするデザインプランを開きます。 2. 次に、レンダリング メニューでトップ ビュー レンダリングを開きます。 3. 次に、トップ ビュー レンダリング インターフェイスのパラメーター設定で [直交] をクリックします。 4. 最後に、モデルの角度を調整した後、[今すぐレンダリング]をクリックして直交上面ビューをレンダリングします。

Windows 10 および 11 でのフォルダーとファイルの動的表示を無効にして、クイック アクセスを防止するにはどうすればよいですか? Windows 10 および 11 でのフォルダーとファイルの動的表示を無効にして、クイック アクセスを防止するにはどうすればよいですか? May 06, 2023 pm 04:58 PM

Microsoft は Windows 10 でクイック アクセスを導入し、最近リリースされた Windows 11 オペレーティング システムでもその機能を維持しました。クイック アクセスは、ファイル エクスプローラーのお気に入りシステムを置き換えます。 2 つの機能の主な違いの 1 つは、クイック アクセスがリストに動的コンポーネントを追加することです。永続的に表示されるフォルダーもあれば、使用状況に基づいて表示されるフォルダーもあります。固定フォルダーにはピン アイコンが表示されますが、動的フォルダーにはそのようなアイコンがありません。詳細については、ここで「お気に入り」と「クイック アクセス」の比較をご覧ください。クイック アクセスはお気に入りよりも強力ですが、動的なフォルダー リストにより乱雑な要素が追加されます。役に立たないファイル、またはエクスプローラーで強調表示すべきでないファイルが表示される場合がある

Windows 11で動的ロックを使用する方法 Windows 11で動的ロックを使用する方法 Apr 13, 2023 pm 08:31 PM

Windows 11 の動的ロックとは何ですか?ダイナミック ロックは、接続されている Bluetooth デバイス (携帯電話またはウェアラブル) が通信範囲外になったときにコンピューターをロックする Windows 11 の機能です。ダイナミック ロック機能は、立ち去るときに Windows キー + L ショートカットを使用するのを忘れた場合でも、PC を自動的にロックします。ダイナミック ロックは、Bluetooth を備えたあらゆる接続デバイスで動作しますが、携帯電話など、十分なバッテリー電力と通信範囲を備えたデバイスを使用するのが最善です。デバイスが 30 秒間アクセスできなくなると、Windows は自動的に画面をロックします。 Bluetooth デバイスを Windows 11 とペアリングする すべてが正しく動作するには、まず次のことを行う必要があります。

See all articles