JSON生成Form表单(一)

介绍

JSON表单是一个基于React的抽象组件,它能将JSON格式的配置渲染为一个Form表单,在实际项目中,通过它可以快速的搭建出一个表单页,这在B端项目中,有着很广泛的用途。

JSON表单的优点有以下几点:

  1. 可以快速的构建出一个表单
  2. 将表单的数据、逻辑、视图分离,结构简单,进一步抽象和维护也就比较容易
  3. 提供校验、自动缓存等额外功能,提升录入体验
  4. 可以跨项目共用复杂的表单组件

在一个前端团队中,组件共用显然是一件很有必要的事,但是对于表单组件来说,由于灵活度很高,如果没有约定俗成的一套规则,抽象出来的表单组件其实用价值不是很高,那么,JSON表单提供的也就是一套规则,能够使用JSON的数据格式去渲染抽象出来的表单组件。

原始表单

在这里,我暂且将不是通过JSON表单渲染出来的表单称为原始表单,以此来作为JSON表单的对比,在我开发过的大量的表单页里,我经常为以下的缺点所苦恼:

  1. 代码量庞大,开发效率低
  2. 数据、逻辑、视图杂糅,不便功能拆分和抽象
  3. 维护成本高
  4. 需要额外处理校验和缓存等功能
  5. 不同项目中很难共用表单组件

表单页的代码量是很庞大的,这是由于表单组件的重复编写和处理表单校验等非主线功能,导致开发表单页的效率很低下,并且由于表单页的数据、逻辑、视图杂糅在一起,后期需要拆分、抽象子功能模块或者维护表单页时,这将是一件很头疼的事,

在B端项

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用 Vue.js 的动态组件和渲染函数来实现动态生成表单。 首先定义一个 JSON 数据,表示表单的结构和字段信息,如下所示: ```json { "fields": [ { "type": "text", "label": "用户名", "name": "username", "value": "" }, { "type": "password", "label": "密码", "name": "password", "value": "" }, { "type": "select", "label": "性别", "name": "gender", "value": "", "options": [ { "label": "男", "value": "male" }, { "label": "女", "value": "female" } ] }, { "type": "checkbox", "label": "爱好", "name": "hobbies", "value": [], "options": [ { "label": "游泳", "value": "swimming" }, { "label": "跑步", "value": "running" }, { "label": "健身", "value": "fitness" } ] } ] } ``` 然后在 Vue.js 组件中,通过遍历 JSON 数据的 fields 属性来动态生成表单的每个字段,如下所示: ```html <template> <form> <div v-for="(field, index) in formData.fields" :key="index"> <component :is="getFieldComponent(field.type)" :label="field.label" :name="field.name" :value="field.value" :options="field.options" @input="onFieldInput(field.name, $event)"> </component> </div> <button type="submit">提交</button> </form> </template> <script> export default { data() { return { formData: { fields: [...] } }; }, methods: { getFieldComponent(type) { switch (type) { case 'text': case 'password': return 'input-field'; case 'select': return 'select-field'; case 'checkbox': return 'checkbox-field'; default: return null; } }, onFieldInput(name, value) { // 更新表单数据 this.formData.fields.find(field => field.name === name).value = value; } }, components: { 'input-field': { props: ['label', 'name', 'value'], render(h) { return h('div', [ h('label', this.label), h('input', { attrs: { type: 'text', name: this.name, value: this.value }, on: { input: event => { this.$emit('input', event.target.value); } } }) ]); } }, 'select-field': { props: ['label', 'name', 'value', 'options'], render(h) { const options = this.options.map(option => { return h('option', { attrs: { value: option.value } }, option.label); }); return h('div', [ h('label', this.label), h('select', { attrs: { name: this.name, value: this.value }, on: { input: event => { this.$emit('input', event.target.value); } } }, options) ]); } }, 'checkbox-field': { props: ['label', 'name', 'value', 'options'], render(h) { const checkboxes = this.options.map(option => { return h('label', [ h('input', { attrs: { type: 'checkbox', name: this.name, value: option.value, checked: this.value.includes(option.value) }, on: { input: event => { const values = this.value.slice(); if (event.target.checked) { values.push(event.target.value); } else { const index = values.indexOf(event.target.value); if (index >= 0) { values.splice(index, 1); } } this.$emit('input', values); } } }), option.label ]); }); return h('div', [ h('label', this.label), checkboxes ]); } } } }; </script> ``` 上面的代码中,getFieldComponent 方法根据字段类型返回对应的组件名,onFieldInput 方法用于更新表单数据,渲染函数中通过 component 标签动态渲染每个字段对应的组件。组件中的 input、select 和 checkbox 标签都绑定了 input 事件,当用户输入数据时会触发该事件,从而更新表单数据。 最后在父组件中引入动态生成表单的组件即可: ```html <template> <div> <dynamic-form></dynamic-form> </div> </template> <script> import DynamicForm from './DynamicForm.vue'; export default { components: { DynamicForm } }; </script> ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值