【VUE】el-table表格内输入框或者其他控件规则校验实现

1、封装组件

1、规则校验一般基于form表单实现,因此需要给具体控件套一层form表单

新建组件input-required.vue,内容如下

html 复制代码
<template>
	  <div>
	    <el-form ref="formRef" :model="form" :rules="formRules" label-width="0px" style="font-size:0.6vw">
	      <el-form-item :prop="this.propValue">
	        <el-input
	          v-model="value"
	          :placeholder="`请输入${labelValue}`"
	          autocomplete="off"
	          :disabled="isDisalbed"
	          @change="isValid"
	        ></el-input>
	      </el-form-item>
	    </el-form>
	  </div>
</template>

<script>
	export default {
	  data() {
	    return {
	      value: "",
	      form: {},
	      formRules: {}
	    };
	  },
	  // 子组件使用props来接收父组件内传过来的数据
	  props: ["propValue", "labelValue", "isDisalbed", "indexValue"],
	  created() {
	   // 给子组件的对象动态添加属性并设置属性值
	    this.$set(this.form, this.propValue, "");
	    this.$set(this.formRules, this.propValue, [
	      { required: true, message: `${this.labelValue}不能为空`, trigger: "blur" }
	    ]);
	  },
	  methods: {
	    // el-input失去焦点后会校验数据,空的话会提示,符合校验规则会触发父组件内方法更新视图数据
		isValid() {
		    let flag = null;
            this.form[this.propValue] = this.value;
            this.$refs["formRef"].validate(valid => {
              if (valid) {
                flag = true;
                this.$emit("updateData", this.form, this.indexValue);
              } else {
                flag = false;
              }
            });
           // 把每次校验的结果返回给父组件
		   return flag;
		 }
	  },
	};
</script>

<style>
</style>

2、组件使用

组件引入

html 复制代码
import InputRequired from "/src/components/inputRequired/input-required.vue";
components: {InputRequired},

form表单里的table使用组件,isRequiredNumber(v-if="scope.row.isRequiredNumber == '0'")是否必填标识(看自己业务需求,这个必填在此处判断因为业务需求是可配置是否必填的,只做必填可以去掉该判断,正常使用input-required)

html 复制代码
.......
<el-col :span="21">
	<el-form-item label="资源" prop="resourcePrepare">
		<el-table :data="resourceResult" :header-cell-style="{ background: '#f0f2f5' }">
			<el-table-column align="center" prop="name" label="名称">
			</el-table-column>
			<el-table-column align="center" prop="num" label="数量">
				<template slot-scope="scope">
					<el-input v-if="scope.row.isRequiredNumber == '0'" v-model="scope.row.num"
						placeholder="请输入内容">
					</el-input>
					<input-required v-else :ref="`requiredNum${scope.$index}`"
						:propValue="'num'" :labelValue="'数量'" :isDisalbed="false"
						:indexValue="scope.$index" @updateData="updateData"></input-required>
				</template>
			</el-table-column>
			<el-table-column label="" width="90">
				<template slot-scope="scope">
					<span @click="delResourcePrepare(scope.row)"
						class="el-icon-close txtClose"></span>
				</template>
			</el-table-column>
		</el-table>
	</el-form-item>
</el-col>
..........

提交表单做必填校验

html 复制代码
submitForm() {
	this.$refs["form"].validate(valid => {
		let flag = true;
		//循环判断table里的所有数据
		for (let index = 0; index < this.resourceResult.length; index++) {
		    //资源数量是否必填(业务需要正常使用可去掉判断)
			if (this.resourceResult[index].isRequiredNumber == '1') {
				flag = flag && this.$refs[`requiredNum` + index].isValid();
			}
		}
		if (!flag) {
		    //必填校验未通过,结束方法
			return;
		}
       .....其他业务.....
	});
},

大概就是这样了。。。

相关推荐
涔溪几秒前
css3弹性布局
前端·css·css3
Array[赵]13 分钟前
npm 最新国内淘宝镜像地址源 (旧版已不能用)
前端·npm·node.js
于慨15 分钟前
pnpm报错如Runing this command will add the dependency to the workspace root所示
前端·npm
李豆豆喵41 分钟前
第29天:安全开发-JS应用&DOM树&加密编码库&断点调试&逆向分析&元素属性操作
开发语言·javascript·安全
神秘代码行者42 分钟前
Vue 3 监听属性教程
vue.js
田本初43 分钟前
【NodeJS】Express写接口的整体流程
前端·javascript·node.js·express
知野小兔1 小时前
【Vue】Keep alive详解
前端·javascript·vue.js
好奇的菜鸟1 小时前
TypeScript中的接口(Interface):定义对象结构的强类型方式
前端·javascript·typescript
小胖霞1 小时前
monorepo和pnpm
前端
橘子味的冰淇淋~1 小时前
全面解析 Map、WeakMap、Set、WeakSet
前端·javascript·vue.js