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

官网原话

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'

}

]

}

]

<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的验证操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。

以上是 vue element table中自定义一些input的验证操作 的全部内容, 来源链接: utcz.com/p/237505.html

回到顶部