当前位置: 代码网 > it编程>前端脚本>Vue.js > Vue3通过JSON渲染ElementPlus表单的流程步骤

Vue3通过JSON渲染ElementPlus表单的流程步骤

2024年10月27日 Vue.js 我要评论
1、引言在公司里遇到这样一个需求:要做产品管理模块,内容不复杂,只是用vue+element写表单,但是,这个功能里的属性非常多,可能还涉及很多复杂且重复的业务。按照常规开发经验,很简单,写好一个it

1、引言

在公司里遇到这样一个需求:要做产品管理模块,内容不复杂,只是用vue+element写表单,但是,这个功能里的属性非常多,可能还涉及很多复杂且重复的业务。

按照常规开发经验,很简单,写好一个item,剩下一路ctrl+c ...

但作为一个优秀的牛码人,总有更高级的办法实现: 使用json渲染element表单元素

技术栈:vue3elementplus

2、建立环境

首先,要有一个vue3项目,包含element-plus

这里我使用了vite官网提供的vue项目创建方式:开始 | vite 官方中文文档 (vitejs.cn)

创建完成后,用yarn添加了element-plus

修改src/main.js,引入element-plus

// 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、创建组件

src/components目录下,无用组件helloworld.vue可以删除,新建目录configform,包含一个index.vue文件

4、构建基本功能

给组件<configform />写入内容

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

<script setup>

defineprops({
  modelvalue: object, // 绑定对象
  config: object // 组件配置 config内columns是需要渲染的表单元素
})

</script>

<template>
  <h3>配置式表单</h3>
  <!-- 表单框架 -->
  <el-form :model="modelvalue" label-width="auto" style="max-width: 600px">
    <!-- 循环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">

        <!-- 通过type判断是哪一种表单元素,v-bind继承表单元素参数 -->
        <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>

找一个页面使用它

为了方便演示,我使用了app.vue

<!-- app.vue -->

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

/**configform绑定对象 */
const formdata = ref({})
/**configform配置 */
const config = ref({
  columns: [
    {
      prop: 'name',
      label: '姓名',
      type: 'input',
      props: { clearable: true, placeholder: '请输入姓名' }, // 继承到 <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>绑定数据:</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>

这样就达成了template式转json式的目的

效果图:

5、必要扩展:校验

既然是表单,那么肯定少不了验证

这里很简单,只需要在<el-form-item />标签上绑定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">
    <!-- 循环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的项增加rules属性

<!-- app.vue -->

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

... 其他代码

/**configform配置 */
const config = ref({
  columns: [
    {
      prop: 'name',
      label: '姓名',
      type: 'input',
      props: { clearable: true, placeholder: '请输入姓名' }, // 继承到 <el-input /> 的props
+     rules: [{ required: true, message: '请输入姓名', trigger: 'blur' }], // 此元素的校验规则
    },

    ... 其他代码

  ]
})

+ const configformref = ref()
+ /**提交表单 */
+ const onsubmit = async () => {
+   let submitflag = true

+   // 校验
+   const valid = await configformref.value.mainref.validate().catch((err) => err)
+   if (valid !== true) {
+     submitflag = false
+   }

+   if (submitflag) {
+     elmessage.success('校验成功')
+   } else {
+     elmessage.error('校验失败')
+   }
+ }
</script>

<template>
  <!-- 使用 <configform /> -->
- <configform v-model="formdata" :config="config" />
+ <configform v-model="formdata" :config="config" ref="configformref" />
+ <el-button type="primary" @click="onsubmit()">校验并提交</el-button>

... 其他代码

</template>

这样设定的rules就生效了,而且可以使用onsubmit方法验证整个表单

6、技术点

  • 父子传参(defineprops)
  • 数据绑定(v-model、v-bind)
  • 循环处理(v-for、v-if、v-else)

详细功能可以在网上查阅

以上就是vue3通过json渲染elementplus表单的流程步骤的详细内容,更多关于vue3 json渲染elementplus的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com