经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » JavaScript » 查看文章
vue中怎么动态生成form表单
来源:cnblogs  作者:xaboy  时间:2021/2/18 15:32:28  对本文有异议

form-create 是一个可以通过 JSON 生成具有动态渲染、数据收集、验证和提交功能的表单生成组件。支持3个UI框架,并且支持生成任何 Vue 组件。内置20种常用表单组件和自定义组件,再复杂的表单都可以轻松搞定。

文档 | GitHub

支持 UI

  • element-ui
  • iview/view-design
  • ant-design-vue

新增功能

2.5版本主要更新了一下功能:

  • 重构内部核心代码
  • 优化内部渲染机制
  • 优化内部生命周期事件
  • 重构 TypeScript
  • 新增 nextTick方法,设置渲染后的回调
  • 新增 支持分页加载组件,加速首屏渲染
  • 新增 自定义配置项effect
  • 新增 支持修改type
  • 新增 control支持配置规则插入位置
  • 优化 control符合条件的都会生效,之前版本只能生效第一个
  • 新增 支持给组件配置前缀后缀 prefix, suffix
  • 新增 update配置,value发送变化后触发
  • 新增 支持 wrap 配置项,配置FormItem
  • 新增 object 组件
  • 新增 支持自定义title,info组件
  • 新增 富文本组件wangEditor
  • 新增 原生事件支持事件注入
  • 支持 value.sync 获取双向绑定的 formData
  • 优化 默认的表单提交按钮

安装

根据自己使用的 UI 安装对应的版本

element-ui 版本

  1. npm i @form-create/element-ui

iview@2.x|3.x 版本

  1. npm i @form-create/iview

iview/view-design@4.x 版本

  1. npm i @form-create/iview4

ant-design-vue@1.5+ 版本

  1. npm i @form-create/ant-design-vue

快速上手

本文以element-ui为例

  1. 在 main.js 中写入以下内容:
  1. import Vue from 'vue'
  2. import ELEMENT from 'element-ui'
  3. import 'element-ui/lib/theme-chalk/index.css'
  4. import formCreate from '@form-create/element-ui'
  5. Vue.use(ELEMENT)
  6. Vue.use(formCreate)
  1. 生成表单

在线示例

  1. <template>
  2. <div id="app1">
  3. <form-create v-model="fApi" :rule="rule" :option="option" :value.sync="value"></form-create>
  4. </div>
  5. </template>
  1. export default {
  2. data() {
  3. return {
  4. //实例对象
  5. fApi: {},
  6. //表单数据
  7. value: {},
  8. //表单生成规则
  9. rule: [
  10. {
  11. type: 'input',
  12. field: 'goods_name',
  13. title: '商品名称'
  14. },
  15. {
  16. type: 'datePicker',
  17. field: 'created_at',
  18. title: '创建时间'
  19. }
  20. ],
  21. //组件参数配置
  22. option: {
  23. //表单提交事件
  24. onSubmit: function (formData) {
  25. alert(JSON.stringify(formData))
  26. }
  27. }
  28. }
  29. }
  30. }

功能介绍

1. 自定义组件

form-create 支持的在表单内部生成任何 vue 组件

在线示例

例如生成一个el-button组件:

  1. {
  2. //type 可以是内置组件名称,也可以是vue组件名称或者 html 标签
  3. type: 'el-button',
  4. //...
  5. children: ['按钮内容']
  6. }

生成一个 html 标签

  1. {
  2. //type 可以是内置组件名称,也可以是vue组件名称或者 html 标签
  3. type: 'span',
  4. //...
  5. children: ['span内容']
  6. }

注意! 生成的组件必须挂载到全局或者通过 form-create 挂载

通过 Vue 挂载

  1. Vue.component(component.name, component);

通过 form-create 挂载

  1. formCreate.component(component.name, component);

2. 自定义布局

通过设置配置项col或者栅格组件可以实现对组件的布局

在线示例

通过配置项col设置组件布局,设置一行显示两个组件

  1. [
  2. {
  3. type:'input',
  4. field:'input1',
  5. title:'input1',
  6. col:{span:12}
  7. },{
  8. type:'input',
  9. field:'input2',
  10. title:'input2',
  11. col:{span:12}
  12. },
  13. ]

通过栅格组件设置一行显示三个组件

  1. {
  2. type:'el-row',
  3. children: [
  4. {
  5. type:'el-col',
  6. props:{
  7. span:8
  8. },
  9. children: [{type:'input',field:'input1',title:'input1'}]
  10. },
  11. {
  12. type:'el-col',
  13. props:{
  14. span:8
  15. },
  16. children: [{type:'input',field:'input1',title:'input1'}]
  17. },
  18. {
  19. type:'el-col',
  20. props:{
  21. span:8
  22. },
  23. children: [{type:'input',field:'input1',title:'input1'}]
  24. }
  25. ]
  26. }

3. 组件前后缀

通过生成规则的prefix属性配置组件的前缀,suffix属性配置组件的后缀

在线示例

  1. {
  2. type:'input',
  3. field:'text',
  4. title:'text',
  5. prefix:'prefix',
  6. suffix:'suffix',
  7. }

设置前后缀为自定义组件

  1. {
  2. type:'input',
  3. field:'text',
  4. title:'text',
  5. value:'default',
  6. prefix:{
  7. type:'ElButton', children:['prefix']
  8. },
  9. suffix:{
  10. type:'ElButton', children:['suffix']
  11. },
  12. }

4.组件联动

可以通过control配置项实现通过组件的值控制其他组件是否显示

在线示例

例如当评价小于3星时输入差评原因

  1. {
  2. type:'rate',
  3. field: 'star',
  4. title:'评分',
  5. value:5,
  6. control:[
  7. {
  8. handle(val){
  9. return val < 3
  10. },
  11. rule:[
  12. {
  13. type:'input',
  14. field:'info',
  15. title:'差评原因',
  16. value:'default info',
  17. }
  18. ]
  19. }
  20. ]
  21. }
参数 说明 类型
value 当组件的值和value全等时显示rule中的组件 string|Number|Bool
handle handle方法返回true时显示rule中的组件 Function
rule 该组件控制显示的组件 Array
append 设置rule中的规则追加的位置 string
prepend 设置rule中的规则前置插入的位置 string
child 设置rule是否插入到指定位置的children中,默认添加到当前规则的 children 中 Boolean

注意! handle优先级大于value,所有符合条件的control都会生效

5. 表单验证

可以通过 validate 配置项设置组件的验证规则,自定义的表单组件也支持校验

在线示例

例如设置input 组件必填

  1. {
  2. type:'input',
  3. //...
  4. validate:[{required:true, type:'string', message:'请个输入内容'}]
  5. }
参数 说明 类型 默认值
enum 枚举类型 string -
len 字段长度 number -
max 最大长度 number -
message 校验文案 string -
min 最小长度 number -
pattern 正则表达式校验 RegExp -
required 是否必选 boolean false
transform 校验前转换字段值 function(value) => transformedValue:any -
type 内建校验类型,可选项 string 'string'
validator 自定义校验 function(rule, value, callback) -
whitespace 必选时,空格是否会被视为错误 boolean false

注意!type需要根据组件的value类型定义

APi 介绍

下列是常用的方法

完整的Api介绍

设置表单值

覆盖方式,未定义的字段会设置为 null

  1. type coverValue = (formData:{[field:string]:any}) => void
  • 用法:
  1. fApi.coverValue({goods_name:'HuaWei'})

合并方式,未定义的字段不做修改

  1. interface setValue {
  2. (formData:{[field:string]:any}): void
  3. (field:string, value:any): void
  4. }
  • 用法:
  1. fApi.setValue({goods_name:'HuaWei'})

别名方法changeValue, changeField

隐藏字段

  1. interface hidden {
  2. //隐藏全部组件
  3. (status:Boolean):void
  4. //隐藏指定组件
  5. (status:Boolean, field:string):void
  6. //隐藏部分组件
  7. (status:Boolean, field:string[]):void
  8. }
  • 用法:
  1. fApi.hidden(true, 'goods_name')

获取组件隐藏状态

  1. type hiddenStatus = (field:string)=>Boolean
  • 用法:
  1. const status = fApi.hiddenStatus('goods_name')

获取规则

  1. interface getRule {
  2. (field:string):Rule
  3. (field:string, origin: true): FormRule
  4. }
  • 用法:
  1. const rule = fApi.getRule('goods_name')

插入规则

前置插入

  1. interface prepend {
  2. //插入到第一个
  3. (rule:FormRule):void
  4. //插入指定字段前面
  5. (rule:FormRule, field:string):void
  6. //插入到指定字段 children 中
  7. (rule:FormRule, field:string, child:true):void
  8. }
  • 用法:
  1. fApi.prepend({
  2. type:"input",
  3. title:"商品简介",
  4. field:"goods_info",
  5. value:"",
  6. props: {
  7. "type": "text",
  8. "placeholder": "请输入商品简介",
  9. },
  10. validate:[
  11. { required: true, message: '请输入商品简介', trigger: 'blur' },
  12. ],
  13. }, 'goods-name')

后置追加

  1. interface append {
  2. //插入到最后一个
  3. (rule:FormRule):void
  4. //插入指定字段后面
  5. (rule:FormRule, field:string):void
  6. //插入到指定字段 children 中
  7. (rule:FormRule, field:string, child:true):void
  8. }
  • 用法:
  1. fApi.append({
  2. type:"input",
  3. title:"商品简介",
  4. field:"goods_info",
  5. value:"",
  6. props: {
  7. "type": "text",
  8. "placeholder": "请输入商品简介",
  9. },
  10. validate:[
  11. { required: true, message: '请输入商品简介', trigger: 'blur' },
  12. ],
  13. }, 'goods-name')

删除指定规则

  1. type removeRule = (rule:FormRule) => FormRule
  • 用法:
  1. const rule = {type:'input', /** ... **/}
  2. fApi.removeRule(rule)

验证表单

  1. type validate = (callback:(...args:any[]) => void)=> void
  • 用法:
  1. fApi.validate((valid, fail) => {
  2. if(valid){
  3. //todo 表单验证通过
  4. }else{
  5. //todo 表单验证未通过
  6. }
  7. })

验证指定字段

  1. type validateField = (field, callback:(...args:any[]) => void)=> void
  • 用法:
  1. fApi.validateField('goods_name', (valid, fail) => {
  2. if(valid){
  3. //todo 字段验证通过
  4. }else{
  5. //todo 字段验证未通过
  6. }
  7. })

获取表单数据

  1. interface formData {
  2. //获取全部数据
  3. (): {[field:string]:any }
  4. //获取部分字段的数据
  5. (field:string[]): {[field:string]:any }
  6. }
  • 用法:
  1. const formData = fApi.formData()

修改提交按钮

  1. type submitBtnProps = (props:Object) => void
  • 用法:
  1. fApi.submitBtnProps({disabled:true})
  • 快捷操作:

    • fApi.btn.loading(true) 设置提交按钮进入loading状态
    • fApi.btn.disabled(true) 设置提交按钮禁用状态
    • fApi.btn.show(true) 设置提交按钮显示状态

修改重置按钮

  1. type resetBtnProps = ( props:Object) => void
  • 用法:
  1. fApi.resetBtnProps({disabled:true})
  • 快捷操作:

    • fApi.resetBtn.loading(true) 设置重置按钮进入loading状态
    • fApi.resetBtn.disabled(true) 设置重置按钮禁用状态
    • fApi.resetBtn.show(true) 设置重置按钮显示状态

隐藏表单

  1. type hideForm = (hide:Boolean)=>void
  • 用法:
  1. fApi.hideForm(true)

提交表单

  1. type submit = (success: (formData: FormData, $f: fApi) => void, fail: ($f: fApi) => void)=> void
  • 用法:
  1. fApi.submit((formData, fapi) => {
  2. //todo 提交表单
  3. },()=>{
  4. //todo 表单验证未通过
  5. })

如果对您有帮助,您可以在GitHub上点 'Star' 支持一下 谢谢!

原文链接:http://www.cnblogs.com/xaboy/p/14406908.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号