<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>Title</title>
<!--1.引入elementUI的样式文件-->
<link rel="stylesheet" href="css/index.css">
<!--2.引入vue-->
<script src="js/vuejs-2.5.16.js"></script>
<!--3.引入elementUI组件库-->
<script src="js/index.js"></script>
<!--引入删除js数组中某一项的js方法-->
<script src="js/arrayRemove.js"></script>
</head>
<body>
<div id="app">
<template>
<el-table
ref="multipleTable"
:data="tableData"
tooltip-effect="dark"
style="width: 100%"
@selection-change="handleSelectionChange">
<el-table-column
type="selection"
width="55">
</el-table-column>
<el-table-column type="index" align="center" label="序号"></el-table-column>
<el-table-column
label="日期"
width="120">
<template slot-scope="scope">{{ scope.row.date }}</template>
</el-table-column>
<el-table-column
prop="name"
label="姓名"
width="120">
</el-table-column>
<el-table-column
prop="address"
label="地址"
show-overflow-tooltip>
</el-table-column>
</el-table>
<div style="margin-top: 20px">
<el-button type="danger" v-if="multipleSelectionFlag" @click="deleteSelect()">批量删除</el-button>
<el-button type="primary" v-if="multipleSelectionFlag" @click="toggleSelection()">取消选择</el-button>
<el-button type="primary" @click="invertSelect()">反选</el-button>
</div>
</template>
</div>
<script>
new Vue({
el: "#app",
data: {
//模拟数据
tableData: [{
id: 1,
date: '2016-05-01',
name: '王小虎',
address: '上海市普陀区金沙江路 1518 弄'
}, {
id: 2,
date: '2016-05-02',
name: '王小虎',
address: '上海市普陀区金沙江路 1518 弄'
}, {
id: 3,
date: '2016-05-03',
name: '王小虎',
address: '上海市普陀区金沙江路 1518 弄'
}, {
id: 4,
date: '2016-05-04',
name: '王小虎',
address: '上海市普陀区金沙江路 1518 弄'
}, {
id: 5,
date: '2016-05-05',
name: '王小虎',
address: '上海市普陀区金沙江路 1518 弄'
}, {
id: 6,
date: '2016-05-06',
name: '王小虎',
address: '上海市普陀区金沙江路 1518 弄'
}, {
id: 7,
date: '2016-05-07',
name: '王小虎',
address: '上海市普陀区金沙江路 1518 弄'
}],
//专门用于存放需要被删除的项目的id
multipleSelection: [],
//用于控制删除选中和取消选中的按钮是否可见(其实就是一个小优化,因为删除功能比较危险,只有多选框有被选中的才会显示出来)
multipleSelectionFlag: false
},
methods: {
//选中多选框实现自动加入待删除行对象的数组
handleSelectionChange(val) {
//下面这个表示选择的多选框都会被加到存放待删除行的行对象!
this.multipleSelection = val;
//当用户只要选择了任意个多选框,删除选中和取消选中按钮就会出现
this.multipleSelectionFlag = true;
if (this.multipleSelection.length === 0) {
//如不进行判断则勾选完毕后批量删除按钮还是会在
this.multipleSelectionFlag = false;
}
},
//切换选中状态
toggleSelection(rows) {
if (rows) {
rows.forEach(row => {
this.$refs.multipleTable.toggleRowSelection(row);
});
} else {
this.$refs.multipleTable.clearSelection();
}
},
//删除选中
deleteSelect() {
//首先弹出确定删除的对话框
this.$confirm('你确定要删除选中吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
//遍历需要删除的数组
this.multipleSelection.forEach((item) => {
this.tableData.remove(item);
});
}).catch(() => {
this.$message("已取消");
});
},
//反选
/*
原理:
之前选中的现在取消选中,之前没有选中的现在选中
将选中和没有选中的均放在各自的数组里面,利用elementUI内置的toggleSelection方法
实现这样的效果!
关于a.filter(key => !b.includes(key)),这个是es6的语法,比较超前,笔者在此不做说明,请自行查阅资料
*/
invertSelect() {
var a = this.tableData;//这个是模型数据
var b = this.multipleSelection;//存放待删除行对象的数组
//获取差集
var diff = a.filter(key => !b.includes(key));
//调用elementUI内置的方法实现反转
this.toggleSelection(this.multipleSelection);
this.toggleSelection(diff);
}
}
});
</script>
</body>
</html>
//自定义一个获取数组中某一项所在索引的方法
Array.prototype.indexOf = function(val) {
for (var i = 0; i < this.length; i++) {
if (this[i] == val) return i;
}
return -1;
};
//自定义删除数组中某一项的方法
Array.prototype.remove = function(val) {
var index = this.indexOf(val);
if (index > -1) {
//关于splice的用法请参考:https://www.w3school.com.cn/jsref/jsref_splice.asp
this.splice(index, 1);
}
};
a.filter(key => !b.includes(key));//获取a和b的差集(a的长度要大于b)
a.filter(key => b.includes(key));//获取a和b的交集
以上代码笔者已上传至git:https://gitee.com/pkya/elementUIDemo.git