vue和iview结合动态生成表单实例

目录
  • 一、构建myform组建
  • 二、构建myFormItem组建
  • 三、构建函数式组件mycontrl组件
  • 四、用户输入的时候需要对表单项中进行各种验证或者逻辑
  • 五、表单输入完成获取表单中的值
  • 六、在要用到表单的页面使用

在项目中,表单作为用户输入占用很重要的一部分,目前的前端框架,基本对表单进行了一些简单的封装,如果输入项很多,以iview为例,会有一大堆的类似:

<FormItem label="Input">
            <Input v-model="formItem.input" placeholder="Enter something..."></Input></FormItem>

这样的标签,现在将用

{//input输入框
            type:'InputNumber',
            placeholder:"请数量",
            label:'数量',
            value:1,
            props:'num',
            isRequire:true,
            emptyTip:'数量不能为空'
          },

这样的输入来简化,配置表单的生成。

一、构建myform组建

新建myForm.vue文件

1、结合vue和iveiw的框架,根据需求,对表单分一列,两列,多列展示,需要设置变量cols,表单项前面的文字宽度也不一样,因此还需设置变量labelWidth,渲染表单(展示你想展示的内容),需设置变量formDatas,最后,用户完成输入后还需获取表单数据,需要设置变了formDataModel。到此,配置表单大致需要的变量已基本设置完成。

大致代码如下:

<Form ref="formValidate" :label-width="labelWidth" :model="formDataModel" class="leftLabel">
    <Row :gutter="32">
      <Col :span="cols" v-for="(item,index) in formDatas" :key="index">
        <myFormItem  :schema = "item" :key="index" :formObj="formDatas"></myFormItem>
      </Col>
    </Row>
</Form>

2、一般情况下每个表单的下面都会有操作,比如确定,取消等,这样我们可以用slot插入来实现不同引用页面的功能

<section>
      <slot name="btnCancel" :cancelFormBtn="cancelForm"><Button type="default">取消</Button></slot>
      <slot name="btnSave" :saveFormBtn="saveForm"><Button type="primary">确定</Button></slot>
</section>

这样myform组件就大致完成,在上面的myform组建中,有一个myFormItem 的组建,下面我们就来实现myFormItem。

二、构建myFormItem组建

新建myFormItem.vue文件

myFormItem中,由于表单项有很多种,包括input,select,checkBox等,如果在这个组建中用v-if来控制显示,这样这个页面很臃肿,因此,采用函数式组建来和render函数来动态构建不同类型的表单

因此myFormItem组建代码大致如下:

<my-contrl :schema="schema" :formObj="formObj"></my-contrl>

三、构建函数式组件mycontrl组件

新建myContrl.js文件

函数式组件的大致结构如下,首先根据context中的类型进行分发,然后再用渲染函数渲染出来

function getControl(context){
    let {type,label,placeholder,value} = context.props.shema;
    return {type,label,placeholder,value}
}
export default{
    functional:true,
    props:{
    schema:Object
    },
    render(h,context){
        let {type,label,placeholder,value} = getControl(context);
        return h('FormItem',{
                 props:{
                    label:label,
                      },
           },[
            h(type,{
            placeholder:placeholder,
             value:value,
            })
        ])
    }
}

中间需注意的小细节:

1、由于一般设置必填项和非必填项的样式不一致,如果要用到iview里面的样式,需要在formItem下加class:‘ivu-form-item-required’,代码如下:

class:{
        'ivu-form-item-required':isRequire,
      },

2、如果表单项是select,checkBox等,在select下面会有option属性,因为都是动态输入的值,所以,要用render函数动态生成数组

keyValue.map(item=>{
        return h(keyData,{
          props:{
           [keyData==='Option'?'value':keyData==='Button'?'icon':'label']:item.key,
          }
        },item.label)
      })

到此,静态页面的渲染也就完成了。

四、用户输入的时候需要对表单项中进行各种验证或者逻辑

为了实现此功能,一般我们用到vue中的混入,将公用的验证,逻辑写到同一个文件中,再将每个表单中单独的逻辑放到引用这个表单的vue中。

因此在mycontrl.js文件的render函数中,要为每个表单项注册一个on-change或on-blur事件,然后触发对应的函数,并且设置此表单的对象的值。

1、设置表单项的值

context.parent.setValue(context.data.attrs.formObj,props,val);

2、判断是否必填进行操作

if(val==='' || val===null || val.length===0){
    context.parent.Validate('rule-empty',`${label}id`,emptyTip);
     return;
   }else{
     context.parent.ValidateHide('rule-empty',`${label}id`)
}

3、规则验证判断

for(let r = 0;r<rules.length;r++){
 let flag = rules[r].valide(val);
  if(flag){
   context.parent.ValidateHide(`rule-${rules[r].name}`,`${label}id`)
    }else{
    context.parent.Validate(`rule-${rules[r].name}`,`${label}id`,rules[r].tip);
     break;
   }
  }
 return;

4、逻辑判断

logicRelation(val)

像类似前面的Validate,ValidateHide,setValue这些函数,都放在混入的js函数中,作为公共函数,而逻辑,规则下的验证函数就放在了每个配置表单的配置项里面了。以上所有的判断都写作on-blur或on-change中

五、表单输入完成获取表单中的值

这个写在myForm.vue中

1、在计算属性中,取得这个表单的项和值

computed:{
    formDataModel:function(){
    return this.getValue(this.formDatas);
      }
   }

2、点击确定按钮的时候,将这个值返回到传入确定按钮的这个函数中

    saveForm(fn,errFn){
        let _this = this;
        if(_this.isValidData(_this.formDatas,_this.formDataModel)){
          fn(_this.formDataModel)
        }else{
          _this.$Message.error('表单输入有误!请按页面提示输入')
          if(errFn){
            errFn()
          }
        }
      }

3、取消按钮,将值还原,或者是别的需要的操作

cancelForm(type,fn){
  if(type==='modify'){
    fn()
 }else if(type==='close'){
 this.$emit('closeModel')
  }else{
   this.backDefault(this.defaultValCopy,this.formDatas);
  }
}

六、在要用到表单的页面使用

        <my-form :formData="formDatas" :cols="12" :labelWidth="100">
            <template v-slot:btnCancel ="{cancelFormBtn}">
              <Button type="default" @click="cancelFormBtn('modify',getlist)">取消</Button>
            </template>
            <template v-slot:btnSave ="{saveFormBtn}" >
              <Button type="primary" @click="saveFormBtn(save)">保存</Button>
            </template>
         </my-form>

配置项中的formData格式

       [ {
            type:'InputNumber',
            placeholder:"Web",
            label:'Web',
            value:1,
            props:'web',
            isRequire:true,
            emptyTip:'Web不为空'
          },
          {//select选择框
            type:'Select',
            placeholder:"请选择要输入内容",
            label:'记录',
            data:{
              Option:[
              {key:'1',label:'记录'},
              {key:'0',label:'不记录'},
            ]
            },
            value:'1',
            props:'record',
            isRequire:true,
            emptyTip:'请选择',
            logicRelation:this.isHideKafka
          }]

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • vue+iview框架实现左侧动态菜单功能的示例代码

    最近在使用vue-cli3配合iview框架搭建新的项目中用到了iview中的menu菜单,按照官网写法固定不太好,因为一般项目都是从后端动态获取菜单列表,所以我们需要将官网代码稍作修改,代码如下: 注意事项: [1]菜单高亮部分动态绑定路由跳转的页面 Menu组件中有一个active-name反映的是当前高亮区域,因此可以动态的绑定active-name来实现高亮显示.前提是需要将MenuItem绑定的name也设置成页面路由的name [2]动态获取菜单数据,需要更新菜单 this.$nex

  • vue+iview动态渲染表格详解

    本文实例为大家分享了vue+iview 动态渲染表格(iview插件table),供大家参考,具体内容如下 效果图 (表格头部和表格主体都是动态渲染) 重要代码 <template> <Table ref="selection" v-for="(item) in entities" :columns="item.columns" :data="item.data" :border="false&qu

  • 使用Vue动态生成form表单的实例代码

    具有数据收集.校验和提交功能的表单生成器,包含复选框.单选框.输入框.下拉选择框等元素以及,省市区三级联动,时间选择,日期选择,颜色选择,文件/图片上传功能,支持事件扩展. 欢迎大家star学习交流:github地址 示例 https://raw.githubusercontent.com/xaboy/form-create/dev/images/sample110.jpg 安装 npm install form-create OR git clone https://github.com/xa

  • vue和iview结合动态生成表单实例

    目录 一.构建myform组建 二.构建myFormItem组建 三.构建函数式组件mycontrl组件 四.用户输入的时候需要对表单项中进行各种验证或者逻辑 五.表单输入完成获取表单中的值 六.在要用到表单的页面使用 在项目中,表单作为用户输入占用很重要的一部分,目前的前端框架,基本对表单进行了一些简单的封装,如果输入项很多,以iview为例,会有一大堆的类似: <FormItem label="Input">             <Input v-model=

  • 详解Vue返回值动态生成表单及提交数据的办法

    目录 主要解决的问题 一.后端返回的数据,提交到后端的数据格式如下: 二.vue前端代码如下: 总结 主要解决的问题 1.vue在循环的时候需要动态绑定不同的v-model:vue动态的表单,数据怎么绑定呢? 2.动态表单上所有name属性对应的键值对的形式提交到后端 一.后端返回的数据,提交到后端的数据格式如下: // 后端返回的数据,根据返回类型用对应的组件 [ { "componentType": "input", "componentName&qu

  • Angular 4.x 动态创建表单实例

    本文将介绍如何动态创建表单组件,我们最终实现的效果如下: 在阅读本文之前,请确保你已经掌握 Angular 响应式表单和动态创建组件的相关知识,如果对相关知识还不了解,推荐先阅读一下 Angular 4.x Reactive Forms和 Angular 4.x 动态创建组件 这两篇文章.对于已掌握的读者,我们直接进入主题. 创建动态表单 创建 DynamicFormModule 在当前目录先创建 dynamic-form 目录,然后在该目录下创建 dynamic-form.module.ts

  • vue自动化表单实例分析

    背景 B端系统表单较多,且表单可能含有较多字段 字段较多的表单带来了大片HTML代码 在大片HTML中,混杂着参数绑定.事件处理等逻辑,不利于维护 技术栈 Vue,Element(默认表单布局)适合中后台项目快速开发 目标 通过json配置快速生成表单的vue plugin. 设计目标 减少html 重复片段 表单字段组件可扩展 事件.联动通过eventbus 解耦 校验可扩展 表单布局可自定义 可视化配置 大概方案设计 使用 安装 npm install charlie-autoform ch

  • Vue2 Element Schema Form 配置式生成表单的实现

    目录 前置知识点 Component $attrs $listeners 表单的结构是什么样的 配置数组数据结构 结语 前置知识点 为了实现一个Schema Form配置式表单的生成,需要了解一部分前置知识点. Component vue 提供了一个内置组件 Component,用来动态渲染组件,举个例子,本篇文章以Element UI 为例,假设我们全局注册了Element UI的组件,那么下面一段代码 <Component is="el-input"></Comp

  • angular学习之动态创建表单的方法

    准备工作 使用ng new async-form创建一个新工程,在app.module.ts中引入ReactiveFormsModule模块并在根模块中导入 import { ReactiveFormsModule } from '@angular/forms'; @NgModule({ imports: [ ReactiveFormsModule ] }) 构建表单元素的基类 export class QuestionBase<T> { value: T;//表单元素的值 key: stri

  • 使用vue中的混入mixin优化表单验证插件问题

    这段时间开发的时候使用到了这个表单校验插件,用起来比较麻烦就不说了,还有较严重的缺陷.自己最终还是抽空把这个插件进行了一些优化,虽然优化的方式和当初自己定下的方向不怎么相同,但是就使用体验上来说还是提高了很多. 1. 实际开发中遇到的问题 在上面的文章中提及了一些表单插件的问题,主要针对的是插件开发本身存在的问题.下面我总结下使用中存在的问题: 每个使用表单校验的元素都需要添加 v-check 类名,比较麻烦. 必须在提交表单按钮上使用 v-checkSubmit 指令进行表单校验,提交函数必须

  • vue element-ui table组件动态生成表头和数据并修改单元格格式 父子组件通信

    父组件 定义表头和表内容 data(){ return{ // 表格数据 tableColumns: [], // 表头数据 titleData:[], } } 引入并注册子组件 import TableComponents from "../../components/table/table"; //注册子组件table components: { tableC: TableComponents }, 获取表头和表内容数据.(真实数据应该是从接口获取的,由于是测试数据这里我先写死)

  • react antd实现动态增减表单

    之前写动态表单遇到过坑,就是用index下标做key会导致bug,而且很严重! 今天有空写下文章记录下:怎么处理和逻辑 我用的是antd3的版本,3和4的表单有点不一样,不过差别应该不大. 需求: 1.选择类型切换展示固定的模板 2.通过新增字段可以动态增减表单里面的每一行 3.控制每一行的字段是否需要必填 4.编辑时候回填参数 效果图: 部分关键代码: import React, { Component } from 'react'; import styles from './index.l

  • vue开发中后台系统复杂表单优化技巧

    目录 引言 表单校验 使用computed进行表单校验优化 表单拆分 表单兄弟组件的数据通信问题 引言 在中后台系统的日常开发中,表单必不可少,当表单内容比较多,例如有上百个字段(这一点都不夸张,血淋淋的现实)时,代码往往也变得复杂且难以维护,加上各种动态联动的表单校验,无疑让我们的页面开发过程雪上加霜,本文将结合自己平时的开发习惯,分享一下在大表单开发中如何处理复杂的表单校验,以及如何对表单进行拆分,减少单个文件堆积过多的代码内容. 表单校验 <template> <el-form r

随机推荐