基于VUE2.0的动态表单

直接上干活

1、自定义的字段属性,可通过json、表结构来实现,我比较懒直接新增了字段表,主要是方便开发过程中及时调整设置。json的话对历史数据修改比较麻烦。
在这里插入图片描述
自定义的一些关键字段属性,包括校验一类的我直接上rule规则代码了,如果有其他要求可按照rule新增,其中col_value_type是我自定义的表单类别,目前完成的有 文本、富文本、人员选择器、日期狂等等。

  • 组件部分代码
  • 1、文本
<template> 
 <el-input 
      ref="input"
     :value="value"
     :placeholder="'请输入'+item.colName" 
     @input="$emit('input', $event)"
       />
    
</template>

<script> 
 
    export default {
        name:"textview", 
        props: ['value','item'],
        data() {
            return { 
            }
        } 
    }
</script> 
  • 2、选择框
<template> 
   <el-select
   :value="value"  clearable
   @input="$emit('input', $event)"
  >
    <el-option
    v-for="dict in dictText"
    :key="dict"
    :label="dict"
    :value="dict"
    ></el-option>
</el-select> 
</template>

<script>  
    export default {
        name:"dictview", 
        props: ['item','value' ], 
        mounted(){
           this.dictText=this.item.dictValue.split(",");   //前端对象里面封装的选择字段,可根据需求自定义扩展
        },
        data() {
            return {
                 dictText:[]
            }
        } 
    }
</script>  
  • 3、人员选择器
<template>
 <div>
    <el-input v-model="userName"  :disabled="true" >
      <el-button  slot="append" 
       
         ref="inputUser"
         :value="value"
         @click="selectUser"
         @input="$emit('input', $event)"
        
         >选择人员
        </el-button> 
    </el-input>
      <user-org ref="userOrg" :callBackSelectUser="callBackSelectUser" />
    
    </div>
</template>

<script> 
 
import userOrg from "@/views/components/MesUserOrg/index";

    export default {
        name:"mesuserview", 
        props: ['item','value'],
        components:{userOrg},
        data() {
            return {
                    userName:null,
                    userId:null
            }
        },created(){
            if(this.value!=null){
 
                let userKey= this.value["userId"];
                let userVal= this.value["userName"];
 
                this.userName=userVal;
                this.$emit('input', this.value );

            }
        },methods:{
            selectUser(){
                this.$refs.userOrg.openSelect(false);
            },callBackSelectUser(userList){
              //返回的用户处理逻辑
                this.$emit('input', userObj);
          } 
        } 
    }
</script> 

其他的根据实际情况扩展

  • 页面加载
    在这里插入图片描述
    所有组件统一加载,
import * as formview  from '@/views/***/index' ; 

export default {
  name: "Flow",
  dicts: ['lims_camunda_state'],
    components:formview,

主表调用加载

<el-row  >
                       <el-col  v-for="formCol in formType.formColList"  :span="formCol.colNum" > 
                         <el-form-item 
                         v-if="formCol.colSubMain=='main'" 
                         :key="formCol.formColId" 
                         :label="formCol.colName" 
                         :prop="formCol.colNameCode"  
                         :rules="formCol.colRuleObj"
                         >
                            <component 
                            v-model="form[formCol.colNameCode]"
                            :is="formCol.colValueType" 
                            :item="formCol"
                            @extendFun="changeComponentHandle"
                            ></component>
                        </el-form-item>
                        </el-col>
                   </el-row>

子表调用加载

 <el-table  v-if="formType.hasSubDataList"  :data="subDataList" 
       @selection-change="handleSelectionChange"
       ref="subDataList"  :row-class-name="rowQcMainBatchIndex"  >
          <el-table-column type="selection" width="50" align="center" />
          <el-table-column label="序号" align="center" prop="index" width="50"/>
          <el-table-column v-for="formCol in formType.formColList"   :label="formCol.colName" :prop="formCol.colNameCode"
          v-if="formCol.colSubMain=='sub'"
          width="150">
            <template slot-scope="scope">
                <el-form-item  label-width="0"
                :prop="'subDataList.' + scope.$index + '.'+formCol.colNameCode"
                :rules="formCol.colRuleObj"
                 > 
                 
                 <component 
                    :item="formCol" 
                    :is="formCol.colValueType" 
                    v-model="subDataList[scope.$index][formCol.colNameCode]"
         
                    ></component>
                </el-form-item>
            </template>
          </el-table-column>
          
 
        </el-table>

如此即可实现动态表单加载了。

市面上的如Form Generator 一类的表单设计器如果对于简单的功能页面没有问题,但是我涉及的业务比较复杂,这种表单设计器和业务关联存在一定问题,所以我采用了这种原始办法,好处就是可已根据业务复杂度及时调整,并且支持主子表扩展。
一句话,适合自己的就是最好的。

第一次写技术总结,估计排版有点乱,大家将就下,如果有什么好的改进建议,欢迎大家留言。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值