校验el-form输入的内容是否符合规则
需求:
校验el-form输入的内容是否符合规则
实现过程:
1.创建表单。包括两个input输入框和一个select下拉框。
<el-form
:inline="true"
:model="searchList"
ref="search"
:label-position="labelPosition"
label-width="70px"
:rules="rules"
>
<el-form-item label="姓名" prop="name" label-width="70px">
<el-input v-model="searchList.name" :clearable="true" style="width:150px"></el-input>
</el-form-item>
<el-form-item label="年龄" prop="age" label-width="70px">
<el-input v-model.number="searchList.age" :clearable="true" style="width:150px"></el-input>
</el-form-item>
<el-form-item label="性别" prop="gender" label-width="70px">
<!-- filterable 是否可搜索
clearable 是否可清空
default-first-option 在输入框按下回车,选择第一个匹配项。需配合 filterable 或 remote 使用-->
<el-select
v-model="searchList.gender"
filterable
clearable
default-first-option
placeholder="请选择性别"
style="width:150px"
>
<el-option
v-for="item in genderList"
:key="item.id"
:label="item.value"
:value="item.id"
></el-option>
</el-select>
</el-form-item>
</el-form>
使用的el-form各属性含义如下:
inline 属性可以让表单域变为行内的表单域
model 表单域model字段,在使用 validate、resetFields 方法的情况下,该属性是必填的
label-position 表单域标签的位置,如果值为 left 或者 right 时,则需要设置 label-width
label-width 标签宽度
rules 表单验证规则
2.定义验证规则。姓名和性别不能为空。年龄不能为非负数值。
<script>
export default {
data() {
return {
searchList: {
name: "",
age: "",
gender: ""
}, // 传入Form组件的model中的字段
genderList: [
{ id: 1, value: "女" },
{ id: 2, value: "男" }
],
rules: {
// el-form验证规则
name: [{ required: true, message: "姓名不能为空" }],
age: [
{ type: "number", message: "年龄必须为数字值" },
{
//验证为非负数
validator: (rule, value, callback) => {
if (value < 0) {
callback(new Error("年龄不能为负数"));
} else {
callback();
}
}
}
],
gender: [{ required: true, message: "性别不能为空" }]
}
};
},
};
</script>
3.页面添加一个保存按钮,绑定save()方法对验证的数据进行处理。如果符合验证规则,关闭界面。如果不符合验证规则,进行提示。
<el-button @click="save()">确定</el-button>
save(){
// 验证el-form是否符合验证规则
this.$refs.search.validate(vaild=>{
if(vaild){
this.isShow = false;
} else {
this.$message.error({showClose: true,message: '请按规范填写数据', type: 'error'})
return
}
})
},
效果:
输入的内容不符合规则时,展示效果如下
点击确定弹出的提示框展示效果如下
实现关闭页面清空el-form所有搜索项
需求:
实现关闭页面清空el-form所有搜索项
实现过程:
给想要清空搜索项的el-form绑定一个ref,然后使用this.$refs.XXX.resetFields()即可。
this.$refs.search.resetFields()
resetFields:对整个表单进行重置,将所有字段值重置为初始值并移除校验结果。
关闭弹窗时清空表格所有勾选项
需求:
关闭弹窗时清空表格所有勾选项
实现过程:
1.创建表格
<el-table :data="tableList" ref="table" @selection-change="orderSelectionChange">
<el-table-column align="center" type="selection" width="60px"></el-table-column>
<el-table-column align="center" type="index" label="序号" width="60px"></el-table-column>
<el-table-column align="center" prop="tableName" label="姓名" min-width="80"></el-table-column>
<el-table-column align="center" prop="tableAge" label="年龄" min-width="80"></el-table-column>
</el-table>
tableList: [
{ tableName: "李四", tableAge: "18" },
{ tableName: "张三", tableAge: "20" }
] // 弹窗内列表数据
2.关闭时添加取消所有勾选项
this.$refs.table.clearSelection(); //取消所有勾选项
动态显示勾选条数
需求:
动态显示勾选条数
实现过程:
1.创建一个div,el-table使用@selection-change
<div style="background:rgba(98, 194, 208,0.5);padding:10px 0px;">勾选条数:{{selectedList.length}}条</div>
<el-table :data="tableList" ref="table" @selection-change="orderSelectionChange">
<el-table-column align="center" type="selection" width="60px"></el-table-column>
<el-table-column align="center" type="index" label="序号" width="60px"></el-table-column>
<el-table-column align="center" prop="tableName" label="姓名" min-width="80"></el-table-column>
<el-table-column align="center" prop="tableAge" label="年龄" min-width="80"></el-table-column>
</el-table>
2.orderSelectionChange方法内容如下
// 统计勾选个数
orderSelectionChange(selection) {
// 更新勾选状态
this.tableList.forEach(val => {
val.checked = selection.includes(val);
});
// 统计勾选的行数
this.selectedList = this.tableList.filter(val => val.checked);
},
效果:
完整代码如下:
<template>
<div class="el_form">
<h1 class="info_title"></h1>
<el-button type="primary" @click="showDialog()">点击此按钮打开弹窗</el-button>
<!--title:标题
visible:是否显示弹窗
width:弹窗页面宽度
before-close:关闭前的回调, function(done),done 用于关闭 Dialog-->
<el-dialog :title="title" :visible.sync="isShow" width="60%" :before-close="close">
<!-- inline 属性可以让表单域变为行内的表单域
model 表单域model字段,在使用 validate、resetFields 方法的情况下,该属性是必填的
label-position 表单域标签的位置,如果值为 left 或者 right 时,则需要设置 label-width
label-width 标签宽度
rules 表单验证规则-->
<el-form
:inline="true"
:model="searchList"
ref="search"
:label-position="labelPosition"
label-width="70px"
:rules="rules"
>
<el-form-item label="姓名" prop="name" label-width="70px">
<el-input v-model="searchList.name" :clearable="true" style="width:150px"></el-input>
</el-form-item>
<el-form-item label="年龄" prop="age" label-width="70px">
<el-input v-model.number="searchList.age" :clearable="true" style="width:150px"></el-input>
</el-form-item>
<el-form-item label="性别" prop="gender" label-width="70px">
<!-- filterable 是否可搜索
clearable 是否可清空
default-first-option 在输入框按下回车,选择第一个匹配项。需配合 filterable 或 remote 使用-->
<el-select
v-model="searchList.gender"
filterable
clearable
default-first-option
placeholder="请选择性别"
style="width:150px"
>
<el-option
v-for="item in genderList"
:key="item.id"
:label="item.value"
:value="item.id"
></el-option>
</el-select>
</el-form-item>
</el-form>
<div style="background:rgba(98, 194, 208,0.5);margin:10px 0px;">勾选条数:{{selectedList.length}}条</div>
<el-table :data="tableList" ref="table" @selection-change="orderSelectionChange">
<el-table-column align="center" type="selection" width="60px"></el-table-column>
<el-table-column align="center" type="index" label="序号" width="60px"></el-table-column>
<el-table-column align="center" prop="tableName" label="姓名" min-width="80"></el-table-column>
<el-table-column align="center" prop="tableAge" label="年龄" min-width="80"></el-table-column>
</el-table>
<el-button @click="save()">确定</el-button>
<el-button @click="close()" type="primary">关闭</el-button>
</el-dialog>
</div>
</template>
<script>
export default {
data() {
return {
isShow: false, // 弹窗是否显示
title: "", // 弹窗标题
labelPosition: "right", // form表单的标签的对齐方式
searchList: {
name: "",
age: "",
gender: ""
}, // 传入Form组件的model中的字段
genderList: [
{ id: 1, value: "女" },
{ id: 2, value: "男" }
],
rules: {
// el-form验证规则
name: [{ required: true, message: "姓名不能为空" }],
age: [
{ type: "number", message: "年龄必须为数字值" },
{
//验证为非负数
validator: (rule, value, callback) => {
if (value < 0) {
callback(new Error("年龄不能为负数"));
} else {
callback();
}
}
}
],
gender: [{ required: true, message: "性别不能为空" }]
},
tableList: [
{ tableName: "李四", tableAge: "18" },
{ tableName: "张三", tableAge: "20" }
], // 弹窗内列表数据
selectedList: [] // 弹窗内列表勾选的数据
};
},
methods: {
// 打开弹窗
showDialog() {
this.isShow = true;
this.title = "标题";
},
// 统计勾选个数
orderSelectionChange(selection) {
// 更新勾选状态
this.tableList.forEach(val => {
val.checked = selection.includes(val);
});
// 统计勾选的行数
this.selectedList = this.tableList.filter(val => val.checked);
},
// 保存
save() {
// 验证el-form是否符合验证规则
this.$refs.search.validate(vaild => {
if (vaild) {
this.$refs.search.resetFields(); // 清空所有搜索框的数据
this.isShow = false;
} else {
this.$message.error({
showClose: true,
message: "请按规范填写数据",
type: "error"
});
return;
}
});
},
// 关闭弹窗
close() {
//显示确定关闭的弹窗
this.$confirm("确认关闭?")
.then(_ => {
this.isShow = false;
this.$refs.search.resetFields(); // 清空所有搜索框的数据
this.$refs.table.clearSelection(); //取消所有勾选项
done();
})
.catch(_ => {});
}
}
};
</script>
<style lang="scss" scoped>
.info_title {
text-align: center;
margin: 20px 0px;
}
</style>