1-1.一开始无数据(相当于新增):
1-2:一开始有数据(相当于编辑):
借助element组件的table表格的selection-change方法(ps:element组件的table表格)结合分页组件,自行定义一个用于存储当前页的已勾选数据,一个用于存储所勾选的所有数据(也就是右侧展示已勾选数据),及一个标志位来实现。
3-1:HTML结构:
A:图示:
B:主要代码:
文章
视频
文档
系列课
3-2:JS逻辑:
A:图示:
B.主要代码实现:
import * as API from 'api/safety_learning/learn_management/train_plan';
export default {
mixins: [tableMixin, permissionsMixin],
props: {
value: {
type: Boolean,
default: false
},
selectedEditData: {
type: Array,
default () {
return []
}
}
},
data() {
return {
isShow: false, //对话框显隐
table_loading: false, //表格loading
data: null, //列表数据
multipleSelection: [], // 当前页选中的数据
idKey: "id", // 标识列表数据中每一行的唯一键的名称(需要按自己的数据改一下)
selectedData: [], //右侧已选课程的数据(也就是所勾选的所有数据)
params: {
rows: 20,
page: 1,
name: "", //课程
type: '', //类型
},
}
},
watch: {
value(bool) {
this.isShow = bool
if (bool) {
if (this.selectedEditData && this.selectedEditData.length) {
this.selectedData = this.selectedEditData;
} else {
this.selectedData = [];
}
this.curToken = '?access_token=' + getToken();
this.getMinioBucketName().then(res => {
this.index(1);
})
}
}
},
methods: {
// 设置选中的方法
setSelectRow() {
if (!this.selectedData || this.selectedData.length <= 0) {
return;
}
// 标识当前行的唯一键的名称
let idKey = this.idKey;
let selectAllIds = [];
let that = this;
this.selectedData.forEach(row => {
selectAllIds.push(row[idKey]);
});
this.$refs.table.clearSelection();
for (var i = 0; i < this.data.rows.length; i++) {
if (selectAllIds.indexOf(this.data.rows[i][idKey]) >= 0) {
// 设置选中,记住table组件需要使用ref="table"
this.$refs.table.toggleRowSelection(this.data.rows[i], true);
}
}
},
// 记忆选择核心方法
changePageCoreRecordData() {
// 标识当前行的唯一键的名称
let idKey = this.idKey;
let that = this;
// 如果总记忆中还没有选择的数据,那么就直接取当前页选中的数据,不需要后面一系列计算
if (this.selectedData.length <= 0) {
this.selectedData = this.multipleSelection;
return;
}
// 总选择里面的key集合
let selectAllIds = [];
this.selectedData.forEach(row => {
selectAllIds.push(row[idKey]);
});
let selectIds = [];
// 获取当前页选中的id
this.multipleSelection.forEach(row => {
selectIds.push(row[idKey]);
// 如果总选择里面不包含当前页选中的数据,那么就加入到总选择集合里
if (selectAllIds.indexOf(row[idKey]) < 0) {
that.selectedData.push(row);
}
});
let noSelectIds = [];
// 得到当前页没有选中的id
this.data.rows.forEach(row => {
if (selectIds.indexOf(row[idKey]) < 0) {
noSelectIds.push(row[idKey]);
}
});
noSelectIds.forEach(id => {
if (selectAllIds.indexOf(id) >= 0) {
for (let i = 0; i < that.selectedData.length; i++) {
if (that.selectedData[i][idKey] == id) {
// 如果总选择中有未被选中的,那么就删除这条
that.selectedData.splice(i, 1);
break;
}
}
}
});
},
currentChange(val) {
// 改变页的时候调用一次
this.changePageCoreRecordData();
this.params.page = val;
this.index();
},
sizeChange(val) {
// 改变每页显示条数的时候调用一次
this.changePageCoreRecordData();
this.params.rows = val;
this.index();
},
//获取桶名
getMinioBucketName() {
return new Promise((resolve, reject) => {
this.isGetTm = false;
API.getMinioBucketName().then((res) => {
if (res.code !== 10000) return;
this.isGetTm = true;
this.downloadDir = res.data + '/';
resolve(res);
}).catch((err) => {
this.isGetTm = true;
reject(err)
});
})
},
//表格多选框选中改变事件
handleSelectionChange(val) {
this.multipleSelection = val;
setTimeout(() => {
this.getRight();
}, 50)
},
//必须在此多封装一层调用changePageCoreRecordData,然后给handleSelectionChange中调用,不然有bug
getRight() {
this.changePageCoreRecordData();
},
//删除已选(右侧已选区域的点X删除事件)
delSelectedItem(id) {
let row = this.data.rows.filter(i => {
return i.id === id;
});
if (row && row.length) {
this.$refs.table.toggleRowSelection(row[0]);
}
this.selectedData = this.selectedData.filter(i => {
return i.id !== id;
});
},
index(page) {
$('#elTable .el-table__body-wrapper').scrollTop(0);
if (page) {
this.params.page = page;
}
let data = {
org: this.analyseId,
page: this.params.page,
rows: this.params.rows,
name: this.params.name,
type: this.params.type,
}
this.table_loading = true;
API.getclassesList(data).then(res => {
this.table_loading = false;
if (res.code === 10000) {
this.data = {
total: res.total,
rows: res.rows
};
setTimeout(() => {
this.setSelectRow();
}, 20);
}
}).catch(err => {
this.table_loading = false;
});
},
/**
* 重置搜索
*/
resetSearch() {
for (let k of Object.keys(this.params)) {
if (['page', 'rows'].includes(k)) {
continue;
}
this.params[k] = '';
}
this.index(1);
},
//关闭
cancel() {
this.clear();
this.$emit('cancelData');
},
//确定
ok() {
this.clear();
this.$emit('getSelectedData', this.selectedData)
},
clear() {
this.$emit('input', false);
}
},
};
4-1.主要代码实现:
A.图示: