1、引言
在公司里遇到这样一个需求:要做产品管理模块,内容不复杂,只是用vue+element写表单,但是,这个功能里的属性非常多,可能还涉及很多复杂且重复的业务。
按照常规开发经验,很简单,写好一个item,剩下一路ctrl+c ...
但作为一个优秀的牛码人,总有更高级的办法实现: 使用json
渲染element
表单元素
技术栈:vue3
、elementplus
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的资料请关注代码网其它相关文章!
发表评论