最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue3通過(guò)JSON渲染ElementPlus表單的流程步驟

 更新時(shí)間:2024年10月12日 08:57:13   作者:凱瑞不Carrey  
這篇文章主要介紹了Vue3通過(guò)JSON渲染ElementPlus表單的流程步驟,文中通過(guò)代碼示例和圖文給大家講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下

1、引言

在公司里遇到這樣一個(gè)需求:要做產(chǎn)品管理模塊,內(nèi)容不復(fù)雜,只是用Vue+Element寫(xiě)表單,但是,這個(gè)功能里的屬性非常多,可能還涉及很多復(fù)雜且重復(fù)的業(yè)務(wù)。

按照常規(guī)開(kāi)發(fā)經(jīng)驗(yàn),很簡(jiǎn)單,寫(xiě)好一個(gè)item,剩下一路Ctrl+C ...

但作為一個(gè)優(yōu)秀的牛碼人,總有更高級(jí)的辦法實(shí)現(xiàn): 使用JSON渲染Element表單元素

技術(shù)棧:Vue3、ElementPlus

2、建立環(huán)境

首先,要有一個(gè)vue3項(xiàng)目,包含element-plus庫(kù)

這里我使用了vite官網(wǎng)提供的vue項(xiàng)目創(chuàng)建方式:開(kāi)始 | Vite 官方中文文檔 (vitejs.cn)

創(chuàng)建完成后,用yarn添加了element-plus

修改src/main.js,引入element-plus庫(kù)

// main.js

import { createApp } from 'vue'
import './style.css'
import App from './App.vue'

const app = createApp(App)

// 引入element-plus
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
app.use(ElementPlus)

app.mount('#app')

3、創(chuàng)建組件

src/components目錄下,無(wú)用組件HelloWorld.vue可以刪除,新建目錄ConfigForm,包含一個(gè)index.vue文件

4、構(gòu)建基本功能

給組件<ConfigForm />寫(xiě)入內(nèi)容

<!-- components/ConfigForm/index.vue -->

<script setup>

defineProps({
  modelValue: Object, // 綁定對(duì)象
  config: Object // 組件配置 config內(nèi)columns是需要渲染的表單元素
})

</script>

<template>
  <h3>配置式表單</h3>
  <!-- 表單框架 -->
  <el-form :model="modelValue" label-width="auto" style="max-width: 600px">
    <!-- 循環(huán)config.columns,使用 <el-form-item /> 渲染表單元素 -->
    <template v-for="(item, index) in config.columns" :key="item.prop">
      <el-form-item :label="item.label" :prop="item.prop">

        <!-- 通過(guò)type判斷是哪一種表單元素,v-bind繼承表單元素參數(shù) -->
        <el-input v-if="item.type === 'input'" v-model="modelValue[item.prop]" v-bind="item.props" />

        <el-select v-else-if="item.type === 'select'" v-model="modelValue[item.prop]" v-bind="item.props">
          <el-option v-for="o in item.options" :key="o.value" :label="o.label" :value="o.value" />
        </el-select>

      </el-form-item>
    </template>
  </el-form>
</template>

找一個(gè)頁(yè)面使用它

為了方便演示,我使用了APP.vue

<!-- APP.vue -->

<script setup>
import { ref } from 'vue'
import ConfigForm from './components/ConfigForm/index.vue' // 引入組件

/**ConfigForm綁定對(duì)象 */
const formData = ref({})
/**ConfigForm配置 */
const config = ref({
  columns: [
    {
      prop: 'name',
      label: '姓名',
      type: 'input',
      props: { clearable: true, placeholder: '請(qǐng)輸入姓名' }, // 繼承到 <el-input /> 的props
    },
    {
      prop: 'sex',
      label: '性別',
      value: '1',
      type: 'select',
      options: [{ label: '男', value: 'man' }, { label: '女', value: 'woman' }],
    },
  ]
})

</script>

<template>
  <!-- 使用 <ConfigForm /> -->
  <ConfigForm v-model="formData" :config="config" />
  <div>
    <b>綁定數(shù)據(jù):</b>
    <div v-for="(value, key) in formData" style="display: grid; grid-template-columns: 100px 1fr 200px;">
      <b>{{ key }}</b>
      <b>:</b>
      <span>{{ value }}</span>
    </div>
  </div>
</template>

這樣就達(dá)成了template式轉(zhuǎn)JSON式的目的

效果圖:

5、必要擴(kuò)展:校驗(yàn)

既然是表單,那么肯定少不了驗(yàn)證

這里很簡(jiǎn)單,只需要在<el-form-item />標(biāo)簽上綁定rules就可以生效

<!-- components/ConfigForm/index.vue -->

<script setup>
+ import { ref } from 'vue'

... 其他代碼

+ const mainRef = ref(null)
+ defineExpose({ mainRef }) // 暴露mainRef給父組件使用
</script>

<template>
  <h3>配置式表單</h3>
  <!-- 表單框架 -->
- <el-form :model="modelValue" label-width="auto" style="max-width: 600px">
+ <el-form :model="modelValue" label-width="auto" style="max-width: 600px" ref="mainRef">
    <!-- 循環(huán)config.columns,使用 <el-form-item /> 渲染表單元素 -->
    <template v-for="(item, index) in config.columns" :key="item.prop">
-     <el-form-item :label="item.label" :prop="item.prop">
+     <el-form-item :label="item.label" :prop="item.prop" :rules="item.rules">

        ... 其他代碼

      </el-form-item>
    </template>
  </el-form>
</template>

然后再APP.vue中,給config.columns的項(xiàng)增加rules屬性

<!-- APP.vue -->

<script setup>
+ import { ElMessage } from 'element-plus'

... 其他代碼

/**ConfigForm配置 */
const config = ref({
  columns: [
    {
      prop: 'name',
      label: '姓名',
      type: 'input',
      props: { clearable: true, placeholder: '請(qǐng)輸入姓名' }, // 繼承到 <el-input /> 的props
+     rules: [{ required: true, message: '請(qǐng)輸入姓名', trigger: 'blur' }], // 此元素的校驗(yàn)規(guī)則
    },

    ... 其他代碼

  ]
})

+ const configFormRef = ref()
+ /**提交表單 */
+ const onSubmit = async () => {
+   let submitFlag = true

+   // 校驗(yàn)
+   const valid = await configFormRef.value.mainRef.validate().catch((err) => err)
+   if (valid !== true) {
+     submitFlag = false
+   }

+   if (submitFlag) {
+     ElMessage.success('校驗(yàn)成功')
+   } else {
+     ElMessage.error('校驗(yàn)失敗')
+   }
+ }
</script>

<template>
  <!-- 使用 <ConfigForm /> -->
- <ConfigForm v-model="formData" :config="config" />
+ <ConfigForm v-model="formData" :config="config" ref="configFormRef" />
+ <el-button type="primary" @click="onSubmit()">校驗(yàn)并提交</el-button>

... 其他代碼

</template>

這樣設(shè)定的rules就生效了,而且可以使用onSubmit方法驗(yàn)證整個(gè)表單

6、技術(shù)點(diǎn)

  • 父子傳參(defineProps)
  • 數(shù)據(jù)綁定(v-model、v-bind)
  • 循環(huán)處理(v-for、v-if、v-else)

詳細(xì)功能可以在網(wǎng)上查閱

以上就是Vue3通過(guò)JSON渲染ElementPlus表單的流程步驟的詳細(xì)內(nèi)容,更多關(guān)于Vue3 JSON渲染ElementPlus的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評(píng)論

高台县| 凌源市| 枝江市| 崇信县| 宾阳县| 金塔县| 普兰县| 五家渠市| 五原县| 读书| 双柏县| 松潘县| 巩义市| 盐亭县| 龙山县| 隆子县| 应用必备| 周至县| 上杭县| 灌云县| 塔河县| 林口县| 山东| 湘潭市| 敦化市| 娱乐| 临澧县| 鄂伦春自治旗| 龙山县| 阜新| 清新县| 江源县| 贵州省| 安达市| 荥经县| 丹东市| 稻城县| 当涂县| 榕江县| 宁河县| 泌阳县|