vue element table中自定义一些input的验证操作


Posted in Javascript onJuly 18, 2020

官网原话

Form 组件提供了表单验证的功能,只需要通过 rules 属性传入约定的验证规则,并将 Form-Item 的 prop 属性设置为需校验的字段名即可。

表单

el-form表单必备以下三个属性:

:model="ruleForm" 绑定的数据内容

:rules="rules" 动态绑定的rules,表单验证规则

ref="ruleForm" 绑定的对象

template模块

其实问题关键就在于如何给el-form-item动态绑定prop

:prop="'tableData.' + scope.$index + '.字段名'"

<template>
 <div class="TestWorld">
  <el-button @click="addLine">添加行数</el-button>
  <el-button @click="save('formDom')">baocun</el-button>
  <el-form :rules="formData.rules" :model="formData" ref="formDom" class="demo-ruleForm">
  <el-table
   :data="formData.tableData"
   style="width: 100%">
   <el-table-column prop="bookname" label="书名">
    <template slot-scope="scope">
    <el-form-item :prop="'tableData.' + scope.$index + '.bookname'" :rules='formData.rules.name'>
     <el-input v-model="scope.row.bookname" placeholder="书名" ></el-input>
    </el-form-item>
    </template>
   </el-table-column>
   <el-table-column prop="bookvolume" label="册数">
    <template slot-scope="scope">
     <el-form-item :prop="'tableData.' + scope.$index + '.bookvolume'" :rules="formData.rules.volume1">
     <el-input v-model.number="scope.row.bookvolume" placeholder="册数"></el-input>
     </el-form-item>
    </template>
   </el-table-column>
   <el-table-column prop="bookbuyer" label="购买者">
    <template slot-scope="scope">
     <el-form-item :prop="'tableData.' + scope.$index + '.bookbuyer'" :rules='formData.rules.name'>
     <el-input v-model="scope.row.bookbuyer" placeholder="购买者"></el-input>
     </el-form-item>
    </template>
   </el-table-column>
   <el-table-column prop="bookborrower" label="借阅者">
    <template slot-scope="scope">
    <el-form-item :prop="'tableData.' + scope.$index + '.bookborrower'" :rules='formData.rules.name'>
     <el-input v-model="scope.row.bookborrower" placeholder="借阅者"></el-input>
    </el-form-item>
    </template>
   </el-table-column>
   <el-table-column prop="bookbuytime" label="购买日期">
    <template slot-scope="scope">
    <el-form-item :prop="'tableData.' + scope.$index + '.bookbuytime'" :rules='formData.rules.data1'>
     <el-date-picker
     v-model="scope.row.bookbuytime"
     type="date"
     placeholder="购买日期">
     </el-date-picker>
    </el-form-item>
    </template>
   </el-table-column>
   <el-table-column label="操作">
    <template slot-scope="scope">
    <el-button
     size="mini"
     type="danger"
     v-if="!scope.row.editing"
     icon="el-icon-delete"
     @click="handleDelete(scope.$index, scope.row)">删除
    </el-button>
    </template>
   </el-table-column>
  </el-table>
  </el-form>
 </div>
</template>

vuejs 代码

export default {
 name:'TestWorld',
 data() {
  return {
    formData:{
     rules:{
     name:{ 
       type:"string",
       required:true,
       message:"必填字段",
       trigger:"blur"
       },
     volume1:{ 
        type:"number",
        required:true,
        message:"册数必须为数字值",
        trigger:"change"
       },
     data1:{ 
       type:"date",
       required:true,
       message:"请选择日期",
       trigger:"change"
       }
     },
     tableData:[{
     bookname: '',
     bookbuytime: '',
     bookbuyer: '',
     bookborrower: '',
     bookvolume:''
     }]
    }
  }
 },
 methods:{
  addLine(){ //添加行数
   var newValue = {
     bookname: '',
     bookbuytime: '',
     bookbuyer: '',
     bookborrower: '',
     bookvolume:''
    };
   //添加新的行数
   this.formData.tableData.push(newValue);
  },
  handleDelete(index){ //删除行数
   this.formData.tableData.splice(index, 1)
  },
  save(formName){ //保存
   this.$refs[formName].validate((valid,model) => {
    console.log(valid)
    console.log(JSON.stringify(model))
   if (valid) {
    alert('submit!');
   } else {
    console.log('error submit!!');
    return false;
   }
 
   });
  },
  handleDelete(index){ //删除行数
   console.log(index)
   this.formData.tableData.splice(index, 1)
  }
 }
 
}

补充知识:element-ui 跟form 和table 动态表单校验,数组的深层次校验

首先数据结构是这样的

let cchiCombineBill = [
   {
    infoId: '1716',
    clinicCchiCombineName: '星期四',
    clinicCchiCombineId: '3',
    serviceCount: '1',
    cchis: [
     {
      cchiCode: 'CAAJ1000'
     },
     {
      cchiCode: 'CAAJ1400'
     }
    ]
   },
   {
    infoId: '1816',
    clinicCchiCombineName: '星期五',
    clinicCchiCombineId: '3',
    serviceCount: '1',
    cchis: [
     {
      cchiCode: 'CAAJ1000'
     },
     {
      cchiCode: 'CAAJ1400'
     }
    ]
   }
  ]

vue element table中自定义一些input的验证操作

vue element table中自定义一些input的验证操作

<template>
 <div class="bill-wrapper">
  <p class="title-p">费用调整</p>
  <el-divider />
  <el-form ref="mainForm" :model="fromData" class="form-new">
   <section class="pay-section">
    <p class="pay-p">
     <span class="pay-span">医疗服务操作</span>
    </p>
    <div>
     <section v-for="(item ,index) in fromData.cchiCombineBill" :key="index">
      <p class="tip-p">
       {{ item.clinicCchiCombineName }}
       <span class="tip-span">(服务数量:{{ item.serviceCount }})</span>
      </p>
      <el-table :data="item.cchis" border style="width: 100%;">
       <el-table-column prop="cchiCode" label="CCHI 编码" min-width="100" />
       <el-table-column label="调整后支付价格" min-width="160">
        <template slot-scope="scope">
         <el-form-item
          :prop="`cchiCombineBill.${index}.cchis.${scope.$index}.adjustPaymentPrice`"
          :rules="fromData.fromaDataRules.adjustPaymentPrice"
         >
          <el-input v-model="scope.row.adjustPaymentPrice" placeholder="请输入" />
         </el-form-item>
        </template>
       </el-table-column>
      </el-table>
     </section>
    </div>
   </section>
  </el-form>
  <p class="new-p">
   <!-- <el-button type="primary" class="btn" @click="returnFn">返回</el-button> -->
   <el-button type="primary" class="btn" @click="sureFn">保存</el-button>
  </p>
 </div>
</template>
<script>
import { numFixTwo } from '@/utils/tool/regExp'
export default {
 data() {
  const validateNumFixTwo = (rule, value, callback) => {
   if (numFixTwo(value)) {
    callback()
   } else {
    callback(new Error('数字,保留小数点后两位'))
   }
  }
  return {
   fromData: {
    cchiCombineBill: [],
    fromaDataRules: {
     adjustPaymentPrice: [
      { required: true, message: '请输入调整后价格', trigger: 'change' },
      { required: true, trigger: 'change', validator: validateNumFixTwo }
     ]
    }
   }
  }
 },
 created() {
  let cchiCombineBill = [
   {
    infoId: '1716',
    clinicCchiCombineName: '星期四',
    clinicCchiCombineId: '3',
    serviceCount: '1',
    cchis: [
     {
      cchiCode: 'CAAJ1000'
     },
     {
      cchiCode: 'CAAJ1400'
     }
    ]
   },
   {
    infoId: '1816',
    clinicCchiCombineName: '星期五',
    clinicCchiCombineId: '3',
    serviceCount: '1',
    cchis: [
     {
      cchiCode: 'CAAJ1000'
     },
     {
      cchiCode: 'CAAJ1400'
     }
    ]
   }
  ]
  cchiCombineBill.map(item => {
   let cchis = []
   item.cchis.map(item2 => {
    this.$set(item2, 'adjustPaymentPrice', '')
    cchis.push(item2)
   })
   item.cchis = cchis
   this.fromData.cchiCombineBill.push(item)
  })
 },
 methods: {
  getFormPromise(form) {
   return new Promise(resolve => {
    form.validate(res => {
     resolve(res)
    })
   })
  },
  sureFn() {
   const mainForm = this.$refs.mainForm // 用户信息
   Promise.all(
    [mainForm].map(this.getFormPromise) // 校验各个表单是否合格
   ).then(res => {
    const validateResult = res.every(item => !!item)
    if (validateResult) {
     console.log('表单都校验通过')
    } else {
     this.$message({
      message: `填写有误,请检查`,
      type: 'warning'
     })
    }
   })
  }
 }
}
</script>
<style lang="scss" scoped>
.bill-wrapper {
 min-width: 1110px;
 margin: 0 auto;
 padding: 20px;
 /deep/ .el-divider--horizontal {
  margin-top: 8px;
 }
 // /deep/ .el-form-item {
 //  margin-bottom: 30px;
 // }
 .return-p {
  margin-bottom: 20px;
 }
 .new-p {
  margin-top: 40px;
  text-align: center;
  .btn:first-child {
   margin-right: 30px;
  }
 }
 .pay-section {
  margin-top: 50px;
  .pay-p {
   padding-left: 10px;
   // border: 1px solid #e8e8e8;
   height: 30px;
   line-height: 30px;
   font-size: 14px;
   margin-top: 20px;
   background: #409eff;
   color: white;
  }
 }
 .sub-title {
  color: #444;
  margin-top: 30px;
 }
 .tip-p {
  margin-top: 15px;
  color: #409eff;
  font-size: 14px;
  margin-bottom: 5px;
  .tip-span {
   font-size: 12;
  }
 }
}
</style>

之前一直是数组结合table 一层的校验,琢磨了很久才终于领悟 element-ui 的 form表单校验的精髓所在,

那就是 :prop 一定是遍历的数组'cchiCombineBill.' 加上(cchiCombineBill,index)中 的index,再加上具体要校验的字段。

以上这篇vue element table中自定义一些input的验证操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript 密码强度判断代码
Sep 05 Javascript
JavaScript 精粹读书笔记(1,2)
Feb 07 Javascript
JavaScript将数组转换成CSV格式的方法
Mar 19 Javascript
jquery+CSS3实现淘宝移动网页菜单效果
Aug 31 Javascript
jquery仅用6行代码实现滑动门效果
Sep 07 Javascript
JavaScript截取、切割字符串的技巧
Jan 07 Javascript
Node.js如何自动审核团队的代码
Jul 20 Javascript
JS实现的RGB网页颜色在线取色器完整实例
Dec 21 Javascript
Vue常用指令V-model用法
Mar 08 Javascript
详解基于angular-cli配置代理解决跨域请求问题
Jul 05 Javascript
Nginx 配置多站点vhost 的方法
Jan 07 Javascript
select获取下拉框的值 下拉框默认选中方法
Feb 28 Javascript
vue cli4.0项目引入typescript的方法
Jul 17 #Javascript
js实现省级联动(数据结构优化)
Jul 17 #Javascript
Vue如何基于vue-i18n实现多国语言兼容
Jul 17 #Javascript
jquery实现有过渡效果的tab切换
Jul 17 #jQuery
使用Vue-cli 中为单独页面设置背景图片铺满全屏
Jul 17 #Javascript
vue 点击其他区域关闭自定义div操作
Jul 17 #Javascript
vue v-for出来的列表,点击某个li使得当前被点击的li字体变红操作
Jul 17 #Javascript
You might like
高分R级DC动画剧《哈莉·奎茵》第二季正式预告首发
2020/04/09 欧美动漫
phpQuery占用内存过多的处理方法
2013/11/13 PHP
Yii2.0 模态弹出框+ajax提交表单
2016/05/22 PHP
php实现socket推送技术的示例
2017/12/20 PHP
JavaScript 读取元素的CSS信息的代码
2010/02/07 Javascript
AJAX分页的代码(后台asp.net)
2011/02/14 Javascript
分享8款优秀的 jQuery 加载动画和进度条插件
2012/10/24 Javascript
javascript 用函数语句和表达式定义函数的区别详解
2014/01/06 Javascript
javascript常用的正则表达式实例
2014/05/15 Javascript
jQuery实现复选框成对选择及对应取消的方法
2015/03/03 Javascript
基于JavaScript实现网页倒计时自动跳转代码
2015/12/28 Javascript
JavaScript记录光标在编辑器中位置的实现方法
2016/04/22 Javascript
JavaScript中的ParseInt(&quot;08&quot;)和“09”返回0的原因分析及解决办法
2016/05/19 Javascript
AngularJs bootstrap搭载前台框架——js控制部分
2016/09/01 Javascript
使用vue-infinite-scroll实现无限滚动效果
2018/06/22 Javascript
vue-cli3.0配置及使用注意事项详解
2018/09/05 Javascript
微信小程序tabBar设置实例解析
2019/11/14 Javascript
Vue优化:常见会导致内存泄漏问题及优化详解
2020/08/04 Javascript
Vue使用路由钩子拦截器beforeEach和afterEach监听路由
2020/11/16 Javascript
[56:20]LGD vs VP Supermajor 败者组决赛 BO3 第三场 6.10
2018/07/04 DOTA
python获取外网ip地址的方法总结
2015/07/02 Python
Ubuntu下使用python读取doc和docx文档的内容方法
2018/05/08 Python
python抓取网页内容并进行语音播报的方法
2018/12/24 Python
全球摩托车装备领导者:RevZilla
2017/09/04 全球购物
Glamest意大利:女性在线奢侈品零售店
2019/04/28 全球购物
Vans(范斯)新西兰官方网站:美国原创极限运动品牌
2020/09/19 全球购物
路德维希•贝克(LUDWIG BECK)中文官网:德国大型美妆百货
2020/09/19 全球购物
中西医结合临床医学专业大学生自荐信
2013/09/28 职场文书
大学团支书的自我评价分享
2013/12/14 职场文书
工程造价专业大学生职业生涯规划书
2014/01/18 职场文书
大学班级干部的自我评价分享
2014/02/10 职场文书
给校长的一封建议书
2014/03/12 职场文书
助学贷款贫困证明
2014/09/23 职场文书
学校2016年全国助残日活动总结
2016/04/01 职场文书
生鲜超市—未来中国最具有潜力零售业态
2019/08/02 职场文书
golang中的并发和并行
2021/05/08 Golang