目录1、引言在公司里遇到如许一个需求:要做产品管理模块,内容不复杂,只是用Vue+Element写表单,但是,这个功能里的属性非常多,大概还涉及很多复杂且重复的业务。 按照通例开发经验,很简单,写好一个item,剩下一起Ctrl+C ... 但作为一个优秀的牛码人,总有更高级的办法实现: 使用[code]JSON[/code]渲染[code]Element[/code]表单元素 技能栈:[code]Vue3[/code]、[code]ElementPlus[/code] 2、创建情况起首,要有一个[code]vue3[/code]项目,包含[code]element-plus[/code]库 这里我使用了[code]vite[/code]官网提供的[code]vue[/code]项目创建方式:开始 | Vite 官方中文文档 (vitejs.cn) 创建完成后,用[code]yarn[/code]添加了[code]element-plus[/code]包 修改[code]src/main.js[/code],引入[code]element-plus[/code]库 [code]// 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') [/code]3、创建组件在[code]src/components[/code]目录下,无用组件[code]HelloWorld.vue[/code]可以删除,新建目录[code]ConfigForm[/code],包含一个[code]index.vue[/code]文件 4、构建基本功能给组件[code]<ConfigForm />[/code]写入内容 [code]<!-- 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> [/code]找一个页面使用它 为了方便演示,我使用了[code]APP.vue[/code] [code]<!-- 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> [/code]如许就达成了[code]template[/code]式转[code]JSON[/code]式的目的 结果图: 5、须要扩展:校验既然是表单,那么肯定少不了验证 这里很简单,只必要在[code]<el-form-item />[/code]标签上绑定[code]rules[/code]就可以见效 [code]<!-- 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> [/code]然后再[code]APP.vue[/code]中,给[code]config.columns[/code]的项增长[code]rules[/code]属性 [code]<!-- 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> [/code]如许设定的[code]rules[/code]就见效了,而且可以使用[code]onSubmit[/code]方法验证整个表单 6、技能点
详细功能可以在网上查阅 以上就是Vue3通过JSON渲染ElementPlus表单的流程步调的详细内容,更多关于Vue3 JSON渲染ElementPlus的资料请关注脚本之家别的干系文章! 来源:https://www.jb51.net/javascript/3286225f9.htm 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |
|手机版|小黑屋|梦想之都-俊月星空
( 粤ICP备18056059号 )|网站地图
GMT+8, 2025-7-2 09:22 , Processed in 0.044538 second(s), 18 queries .
Powered by Mxzdjyxk! X3.5
© 2001-2025 Discuz! Team.