# el-form-render 该文档用于教会 cursor 如何使用 el-form-render ## 介绍 el-form-render 基于 `vue3 + element-plus`。在完全继承 el-form 组件的基础上进行扩展,用户可以使用一段 json 来呈现完整的表单。 ## 安装 ```shell pnpm add el-form-render ``` > 请确保已安装 element-plus ## 基础表单 ```vue <template> <Form ref="form" :model="model" label-width="auto" :items="[ { lp: ['文本', 'text'] }, { lp: ['数字', 'number'], type: 'input-number' }, { lp: ['开关', 'onoff'], type: 'switch' }, { is: 'el-divider', children: '分割线' }, { lp: ['备注', 'remark'], el: { type: 'textarea', autosize: { minRows: 2, maxRows: 4 } } } ]" @submit.prevent="$refs.form.validate()" @reset="$refs.form.resetFields()" > <el-form-item label=" "> <el-button type="primary" native-type="submit">提交</el-button> <el-button native-type="reset">重置</el-button> </el-form-item> </Form> </template> <script setup> import { ref } from 'vue' import Form from 'el-form-render' const model = ref({}) </script> ``` ## 多列布局 多列布局表单,使用原子化 css `grid grid-cols-2 gap-x-4` 实现多列布局 ```vue <template> <Form ref="form" :model="model" label-width="auto" :items="[ // 将 is 属性设置为 div 元素 { is: 'div', class: 'grid grid-cols-2 gap-x-4', children: [ { lp: ['文本', 'text'] }, { lp: ['数字', 'number'], type: 'input-number' }, { lp: ['开关', 'onoff'], type: 'switch' }, { lp: ['日期', 'date'], type: 'date-picker' } ] }, // 将 is 属性设置为 分割线组件 { is: 'el-divider' }, // 将 is 属性设置为 div 元素 { is: 'div', class: 'grid grid-cols-2 gap-x-4', children: [ { lp: ['标签', 'tags'], type: 'input-tag' }, { lp: ['评分', 'rate'], type: 'rate' }, { lp: ['滑块', 'number'], type: 'slider' }, { lp: ['颜色', 'color'], type: 'color-picker' } ] }, { is: 'el-divider' }, { lp: ['备注', 'remark'], el: { type: 'textarea', autosize: { minRows: 2, maxRows: 4 } } } ]" @submit.prevent="$refs.form.validate()" @reset="$refs.form.resetFields()" > <el-form-item label="ㅤ"> <el-button type="primary" native-type="submit">提交</el-button> <el-button native-type="reset">重置</el-button> </el-form-item> </Form> </template> <script setup> import { ref } from 'vue' import Form from 'el-form-render' const model = ref({}) </script> ``` ## 自定义组件 设置 `el.is` 属性自定义表单输入组件 自定义组件接入的关键是在组件内部实现 `v-model` - `props` 需要接收 `modelValue` - 对外触发 `update:modelValue` 事件 ```vue <template> <Form :model="model" :items="[ { is: 'el-divider', children: '自定义组件' }, { lp: ['姓名', 'name'], el: { is: MyInput, placeholder: '这是一个原生输入框' } }, { lp: ['年龄', 'age'], el: { is: MyRange } }, { lp: ['是否', 'is'], el: { is: MyCheckbox } }, { lp: ['日期', 'date'], el: { is: MyDate } }, { is: 'el-divider', children: 'element-plus' }, { lp: ['姓名', 'name'] }, { lp: ['年龄', 'age'], type: 'slider' }, { lp: ['是否', 'is'], type: 'checkbox' }, { lp: ['日期', 'date'], type: 'date-picker', el: { valueFormat: 'YYYY-MM-DD' } }, { is: 'el-divider' }, ]" /> </template> <script setup> import { h, ref } from 'vue' import Form from 'el-form-render' const model = ref({ age: 26 }) // 自定义 input const MyInput = ({ modelValue, ...attrs }, { emit }) => ( h('input', { type: 'text', value: modelValue, onInput: e => emit('update:modelValue', e.target.value), ...attrs }) ) // 自定义 sider const MyRange = ({ modelValue, ...attrs }, { emit }) => ( h('input', { type: 'range', value: modelValue, onInput: e => emit('update:modelValue', +e.target.value), ...attrs }) ) // 自定义 checkbox const MyCheckbox = ({ modelValue, ...attrs }, { emit }) => ( h('input', { type: 'checkbox', checked: modelValue, onInput: e => emit('update:modelValue', e.target.checked), ...attrs }) ) // 自定义 date const MyDate = ({ modelValue, ...attrs }, { emit }) => ( h('input', { type: 'date', value: modelValue, onInput: e => emit('update:modelValue', e.target.value), ...attrs }) ) </script> ``` ## Item 属性 | 属性名 | 类型 | 默认值 | 描述 | | ------------ | ------------- | ------------------ | ---------------------------------------------------------------------------------------------------------- | | lp | string[] | | `label` `prop` 的缩写 | | type | string | `'input'` | 可选值 `input` `select` `switch` `radio-group`……<br />默认 `input`,如果传入 `options` 属性则默认 `select` | | options | any[] | | | | get | (v, o) => any | | 对组件接收的值进行格式化 | | set | (v, o) => any | | 对组件输出的值进行格式化 | | el | object | | 输入组件的属性 | | defaultValue | any | | 默认值 | | is | string | `ElFormItemRender` | 渲染的组件,可以是任何组件 | | vIf | () => boolean | `true` | 控制组件是否渲染 | > 其他属性与 `el-form-item` 完全一致