<template>
<div>
<el-table
:data="tableData"
v-loading="loading"
:row-key="rowKey"
@select="handleSelect"
@select-all="handleSelectAll"
@selection-change="handleSelectionChange"
ref="$table">
<el-table-column
type="selection"
width="50">
</el-table-column>
<el-table-column
prop="id"
label="ID">
</el-table-column>
<el-table-column
prop="name"
label="姓名">
</el-table-column>
<el-table-column
prop="age"
label="年龄">
</el-table-column>
</el-table>
<el-pagination
:total="total"
:current-page.sync="currentPage"
:page-size="pageSize"
@current-change="handleCurrentChange">
</el-pagination>
</div>
</template>
<script>
import {
// isEqual as _isEqual,
unionBy as _unionBy,
intersectionBy as _intersectionBy,
// cloneDeep as _cloneDeep,
findIndex as _findIndex,
remove as _remove,
fill as _fill
} from 'lodash';
export default {
props: {
// 已选的list
value: {
type: Array,
default: () => []
}
},
data() {
return {
tableData: [],
tableAllData: [],
// 数据唯一性key
rowKey: 'id',
// 多选-已选list
selList: [],
loading: false,
selected: [],
currentPage: 1,
pageSize: 10,
total: 0,
// 用于保存所有选中的数据
selectedRows: [],
selectAllList: {}
}
},
created() {
this.getAllTableData()
},
computed: {
_disabledSubmit() {
return !this.selList.length;
},
_selListLength() {
return this.selList.length;
}
},
methods: {
getAllTableData() {
const data = []
for (let i = 0; i <= 1000; i++) {
data.push({
id: i + 1,
name: `姓名${i}`,
age: parseInt(Math.random() * 20 + 20)
})
}
this.tableAllData = data;
this.tableData = data.slice(0,10)
this.total = data.length;
},
/** 设置表格选中的 */
setTableSelected() {
if (!this.tableData || !this.tableData.length) return;
this.$nextTick(() => {
this.tableData.forEach(row => {
const flag =
_findIndex(this.selList, [this.rowKey, row[this.rowKey]]) >= 0;
this.$refs['$table'].toggleRowSelection(row, flag);
});
});
},
/** 多选-选择 */
handleSelect(selection,val) {
console.log(selection,val)
this.setSelList(selection);
},
/** 多选-全选 */
handleSelectAll(selection) {
this.setSelList(selection);
},
/** 多选-设置已选list */
setSelList(selection) {
// 1.合并this.selList,并根据this.rowKey去重
const tempList = _unionBy(this.selList, selection, this.rowKey);
// 2.得到this.selList和this.list的交集
const intersectionList = _intersectionBy(
this.selList,
this.tableData,
this.rowKey
);
// 3. 找到selection中不存在于intersectionList的子项,并在this.selList中删除该子项
intersectionList.forEach(row => {
const flag = _findIndex(selection, [this.rowKey, row[this.rowKey]]) < 0;
if (flag) {
_remove(tempList, e => e[this.rowKey] === row[this.rowKey]);
}
});
// 4. 将tempList和this.value比较,优先保留初始选择数据
this.value.forEach(row => {
const index = _findIndex(tempList, [this.rowKey, row[this.rowKey]]);
if (index) {
// lodash.fill 替换方法
_fill(tempList, row, index, index + 1);
}
});
// 5. 赋值
this.selList = tempList;
},
handleSelectionChange(val) {
console.log(val)
this.selectedRows = val
},
handleCurrentChange(val) {
this.currentPage = val
this.tableData = this.tableAllData.slice((val - 1) * this.pageSize,(val * this.pageSize))
this.setTableSelected();
}
},
}
</script>