zoukankan      html  css  js  c++  java
  • Vue表单那些事

           关于表单那些事,学校念书那会老师都有讲过,实际项目开发也会经常用到,表单提交的前提是先验证,只有验证通过,才能允许将数据传到后台,Jquery 自带的验证用够了,这里记录下 vue 的验证,官网已经说了很明白了,form 的model 赋值 表单值,里面的input之类的元素 prop 值,结合rules 来进行验证,如下 Html 部分

            <el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm">
                <el-form-item label="标题" prop="Title">
                    <el-col :span="4"><el-input v-model="ruleForm.Title" :disabled="diabol"></el-input></el-col>
                </el-form-item>
             </el-form>

     js 部分如下 ( ps:pattern: '[^ x22]+'  过滤空格)

        var vm = new Vue({
            el: "#app",
            data: {
                ruleForm: {
                    Title: '',
                },
                rules: {
                    Title: [
                        { required: true, message: '请输入评比标题', trigger: 'blur', pattern: '[^ x22]+' },
                        { min: 1, max: 20, message: '长度在 1 到 20 个字符', trigger: 'blur' }
                       ]
                 }
    } })

    依次类推进行操作即可,实际上除了本身一些失去焦点的验证,还有一些其他情形需要验证,如包括时间在内的验证, 如验证开始时间大于当前时间,开始时间不能大于结束时间之类的,需要通过赋值 validator  属性来进行进一步的补充验证

      StartTime: [
           { type: 'string', required: true, message: '请选择日期', trigger: 'change' },
           { validator: validateTime }
       ],
      EndTime: [
           { type: 'string', required: true, message: '请选择日期', trigger: 'change' },
       ],
        var validateTime = (rule, value, callback) => {
            var time = vm.ruleForm.EndTime;
            if (time != "" && new Date(value) > new Date(time)) {
                callback(new Error('开始时间不能大于结束时间'));
            }
            if ((new Date() - new Date(value)) / (24 * 60 * 60 * 1000) >= 1) {
                callback(new Error('开始时间不能小于当前时间'));
            }
            else {
                callback();
            }
        };

    这里只验证了开始时间和结束时间的比较,若要初始化时可选时间为当前时间之后,则需在加载 vue 时,在data 下便给开始,结束时间赋初始值,如下

                startTimeOptions: {
                    disabledDate(time) {
                        //8.64e7  代表一天 24*60*60*1000 = 8.64*10^7 科学计数表示法
                        return time.getTime() < Date.now() - 8.64e7; 
                    }
                },
                endTimeOptions: {
                    disabledDate: time => {
                        //拿到开始时间
                        var beginDateVal = vm.ruleForm.StartTime;
                        if (beginDateVal) {
                            return time.getTime() < new Date(beginDateVal).getTime() - 8.64e7;
                        }
                        else {
                            return time.getTime() < Date.now() - 8.64e7;
                        }
                    }
                }

    其余的验证大多如此,不外乎data下初始值,rules下的规则,以及vue之外做回调拓展赋值验证 ,这里不一一列举,如此验证过后,便是提交

                    //提交表单 formName 表单所在的model值
                    this.$refs[formName].validate((valid) => {
                        if (valid) {
                          //验证通过
                           ....
    
                        } else {
                            return false;
                        }
                    });

    form表单提交到后台是根据键值对来进行提交[ Name:‘’,Value:''] ,对于小小的若干个字段,选择 $.post() 提交很适合,构造一下需要传递的参数即可,不过在实际应用中可能会稍微麻烦一些,一般是提交多个字段,表格,以及表格+若干字段混合的形式。其实大部分而言,都是若干个字段,这种情况,在后台用一个包含这些字段的实体统一接收,采用传统的序列化表单的形式($("#form1").serialize()),前端采用 ajax 方式提交

           $.ajax({
               type: "POST",
               url: tempurl,
               data: $("#form").serialize(),
               datatype: 'json',
               success: function (msg) {
               vm.loading = false;
               if (msg.Code == 0) {
                    this.$message("操作成功");
                    location.href = oldUrl;
                    return;
                  }
               return this.$message("操作失败:" + msg.Desc);
                }
           })

    对于vue 提交简单表单对象来说,无须序列化表单,先将表单内待提交元素的prop 值(和Name一一对应) 写入表单对象名(ruleForm)下,

            <el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm">
    
                <el-form-item label="评比标题" prop="Title">
                    <el-col :span="4"><el-input v-model="ruleForm.Title" :disabled="diabol"></el-input></el-col>
                </el-form-item>
    
                <el-form-item label="评比时间" required :inline="true">
                    <el-col :span="4">
                        <el-form-item prop="StartTime">
                            <el-date-picker type="date" :disabled="diabol" placeholder="选择开始日期" :picker-options="startTimeOptions" 
    value-format
    ="yyyy-MM-dd" format="yyyy-MM-dd" v-model="ruleForm.StartTime" style=" 100%;"></el-date-picker> </el-form-item> </el-col> <el-col :span="1" style="text-align:center"> -</el-col> <el-col :span="4"> <el-form-item prop="EndTime"> <el-date-picker type="date" :disabled="diabol" placeholder="选择结束日期" :picker-options="endTimeOptions"
    value-format
    ="yyyy-MM-dd" format="yyyy-MM-dd" v-model="ruleForm.EndTime" style=" 100%;"></el-date-picker> </el-form-item> </el-col> </el-form-item> </el-form>
        var vm = new Vue({
            el: "#app",
            data: {
                ruleForm: {
                    Title: '',
                    StartTime:'',
                    EndTime:''
                    Name:'',
                    ....
                },
             }
         })

     然后 ajax提交的时候,仅需稍微变成数据为,data: vm.ruleForm 即可,当然这都是很基础的,有时候我们既要提交表单,又要提交表格数据,我目前的处理方式为 将表格数据的name 构造成带索引的形式 如  StuList [i].Name ,看起来很土,也曾做过多次验证,暂未找到更合适的处理方法,这里的 StuList为 后台接收实体中 对应表格数据的集合字段 名,如 List<Student> StuList , 接收实体中其余的字段,如标题Title,StartTime,EndTime 等,需要构造成 数组对象里面的值,如

        //构造表单数据(不包含表格)                     
         var formdata = [];
         $.each(vm.ruleForm, function (i, v) {
              var temp = { name: i, value: v };
                formdata.push(temp);
         });
          //构造表格数据
          $.each(rows, function (i, v) {
             var tempName=  { name: "StuList[" + i + "].Name", value: v.Name};
             var tempClass= { name: "StuList[" + i + "].ClassName", value: v.ClassName};
             formdata.push(tempName);
             formdata.push(tempClass);
          });

    这里表格仅需要获取Name 和ClassName 两个字段,所以each 一次就好,如果字段过多,在加一个each ,自动获取 其 name 和 value 即可,这里需要注意的是,要拿到所有表格的数据,而不是当前页显示的表格数据,如我这里用的是JqGrid,就有一个坑

              //获取表格              
    var o = jQuery("#grid-table"); //获取表格当前页显示的数据(如表格2页,当前页是第一页,则取第一页数据) //var rows = o.jqGrid('getRowData'); var total = o.jqGrid('getGridParam', 'records'); //获取查询得到的总记录数量(所有页) o.jqGrid('setGridParam', { rowNum: total }).trigger('reloadGrid'); //设置rowNum为总记录数量并且刷新jqGrid,使所有记录现出来调用getRowData方法才能获取到所有数据 var rows = o.jqGrid('getRowData'); //输出所有匹配的(所有页数据)
  • 相关阅读:
    synchronized (lock) 买票demo 线程安全
    springboot项目搭建
    Maven命令
    Mybatis的mapper文件中$和#的用法及区别详解
    mybatis映射文件mapper.xml的写法(collections...)
    MyBatis-动态SQL的if、choose、when、otherwise、trim、where、set、foreach使用(各种标签详解), 以及实体间关系配置
    024 搭建前台系统-----乐优商城工程启动步骤教程
    023 商品管理功能03-----商品修改
    023 商品管理功能02-----商品新增
    022 商品管理功能01-----商品查询
  • 原文地址:https://www.cnblogs.com/Sientuo/p/13404905.html
Copyright © 2011-2022 走看看