使用element的table组件,如果还想要实现上下键选中行效果的话,可以试试以下方法,主要是通过监听键盘事件实现的
如果还需要表格上下键时保持被选中行一直在视野中的话,可以在监听事件中根据当前行的位置动态设置表格的滚动距离实现,现在先不加了,等有时间再完善
1、首先定义一个变量,来确定当前被点击行的index,再根据监听到的是上键或者下键,递减或递增此变量,通过element table的toggleRowSelection方法实现对当前行的勾选选中,具体代码作用已在备注中
代码如下:
keyUp(e) {
// 表格为空,不执行下方
if (this.tableData.length == 0) return
if (e.keyCode == 40) { // 下键
let refsElTable = this.$refs.singleTable
this.$nextTick(() => {
if (this.selectedRow.length == 0) { // 如果当前没有选中行,则直接选中第一个
this.selectedIndex = 0
} else if (this.selectedIndex == this.tableData.length - 1) { // 如果选中的是最后一行了,那么下一行选中的是第一行
this.selectedIndex = 0
} else { // 正常递增
this.selectedIndex++
}
if (!refsElTable) return
let findRow = this.selectedRow.find(c => c.rowIndex == this.selectedIndex); //找出当前选中行
//如果只有一行且点击的也是这一行则取消选择 否则清空再选中当前点击行
if (findRow && this.selectedRow.length === 1) {
refsElTable.toggleRowSelection(this.tableData[this.selectedIndex], false);
return;
}
refsElTable.clearSelection();
refsElTable.toggleRowSelection(this.tableData[this.selectedIndex]); // 把现在当前行勾选
})
} else if (e.keyCode == 38) { // 上键
let refsElTable = this.$refs.singleTableleft
this.$nextTick(() => {
if (this.selectedRow.length == 0) { // 当前没有选中行,则直接选中第一个
this.selectedIndex = 0
} else if (this.selectedIndex == 0) { // 如果选中的是第一行了,那么下一行选中的是最后一行
this.selectedIndex = this.tableData.length - 1
} else { // 正常递减
this.selectedIndex--
}
if (!refsElTable) return
let findRow = this.selectedRow.find(c => c.rowIndex == this.selectedIndex); //找出当前选中行
//如果只有一行且点击的也是这一行则取消选择 否则清空再选中当前点击行
if (findRow && this.selectedRow.length === 1) {
refsElTable.toggleRowSelection(this.tableData[this.selectedIndex], false);
return;
}
refsElTable.clearSelection();
refsElTable.toggleRowSelection(this.tableData[this.selectedIndex]); // 把现在当前行勾选
})
}
},
2、增加表格相应的方法,分别为针对于选中行的样式改变、给每行数据添加不可枚举属性、单击选中行以及选项改变之后对已选行的保存
// 表格方法
rowClassName({ row, rowIndex }) {
let rowName = "",
findRow = this.selectedRow.find(c => c.rowIndex === row.rowIndex);
if (findRow) {
rowName = "rowStyle "; // 可以通过此处给选中行一个class,根据自己需求更改样式
}
return rowName; //也可以再加上其他类名 如果有需求的话
},
rowStyle({ row, rowIndex }) {
Object.defineProperty(row, "rowIndex", { // 给每行添加不可枚举属性rowIndex来标识当前行
value: rowIndex,
writable: true,
enumerable: false
});
},
clickEvent(row, column, event, params) {
let refsElTable = this.$refs.singleTable; // 获取表格对象
let findRow = {}
findRow = this.selectedRow.find(c => c.rowIndex == row.rowIndex); //找出当前选中行
//如果只有一行且点击的也是这一行则取消选择 否则清空再选中当前点击行
if (findRow && this.selectedRow.length === 1) {
refsElTable.toggleRowSelection(row, false);
return;
}
refsElTable.clearSelection();
refsElTable.toggleRowSelection(row);
},
handleSelectionChange(rows) {
this.selectedRow = rows; // 保存已选择行
},
3、加上其他内容,完整代码
<template>
<div>
<el-table
ref="singleTable"
class="table"
:data="tableData"
:row-class-name="rowClassName"
:row-style="rowStyle"
@row-click="clickEvent"
@selection-change="handleSelectionChange"
>
<el-table-column
v-for="(item, index) in tableColumn"
:key="index"
:property="item.englishName"
:label="item.columnName"
:min-width="item.width"
>
<template slot-scope="scope">
{{scope.row[item.englishName] ? scope.row[item.englishName] : '-'}}
</template>
</el-table-column>
</el-table>
</div>
</template>
<script>
export default {
data() {
return {
tableData: [
{
'code': '100001',
'name': '张一',
'age': 11,
'grade': '高一'
},
{
'code': '100002',
'name': '张二',
'age': 12,
'grade': '高二'
},
{
'code': '100003',
'name': '张三',
'age': 13,
'grade': '高三'
},
],
tableColumn: [ // 表格显示的都是哪些列
{englishName: 'code', columnName: '编号', width: '70'},
{englishName: 'name', columnName: '姓名', width: '70'},
{englishName: 'age', columnName: '年龄', width: '70'},
{englishName: 'grade', columnName: '年级', width: '70'},
],
selectedRow: [], // 当前已选择行
selectedIndex: 0, // 当前选择行的index
}
},
mounted() {
addEventListener('keyup', this.keyUp)
},
beforeDestroy() {
removeEventListener('keyup', this.keyUp)
},
methods: {
keyUp(e) {
// 表格为空,不执行下方
if (this.tableData.length == 0) return
if (e.keyCode == 40) { // 下键
let refsElTable = this.$refs.singleTable
this.$nextTick(() => {
if (this.selectedRow.length == 0) { // 如果当前没有选中行,则直接选中第一个
this.selectedIndex = 0
} else if (this.selectedIndex == this.tableData.length - 1) { // 如果选中的是最后一行了,那么下一行选中的是第一行
this.selectedIndex = 0
} else { // 正常递增
this.selectedIndex++
}
if (!refsElTable) return
let findRow = this.selectedRow.find(c => c.rowIndex == this.selectedIndex); //找出当前选中行
//如果只有一行且点击的也是这一行则取消选择 否则清空再选中当前点击行
if (findRow && this.selectedRow.length === 1) {
refsElTable.toggleRowSelection(this.tableData[this.selectedIndex], false);
return;
}
refsElTable.clearSelection();
refsElTable.toggleRowSelection(this.tableData[this.selectedIndex]); // 把现在当前行勾选
})
} else if (e.keyCode == 38) { // 上键
let refsElTable = this.$refs.singleTableleft
this.$nextTick(() => {
if (this.selectedRow.length == 0) { // 当前没有选中行,则直接选中第一个
this.selectedIndex = 0
} else if (this.selectedIndex == 0) { // 如果选中的是第一行了,那么下一行选中的是最后一行
this.selectedIndex = this.tableData.length - 1
} else { // 正常递减
this.selectedIndex--
}
if (!refsElTable) return
let findRow = this.selectedRow.find(c => c.rowIndex == this.selectedIndex); //找出当前选中行
//如果只有一行且点击的也是这一行则取消选择 否则清空再选中当前点击行
if (findRow && this.selectedRow.length === 1) {
refsElTable.toggleRowSelection(this.tableData[this.selectedIndex], false);
return;
}
refsElTable.clearSelection();
refsElTable.toggleRowSelection(this.tableData[this.selectedIndex]); // 把现在当前行勾选
})
}
},
// 表格方法
rowClassName({ row, rowIndex }) {
let rowName = "",
findRow = this.selectedRow.find(c => c.rowIndex === row.rowIndex);
if (findRow) {
rowName = "rowStyle "; // 可以通过此处给选中行一个class,根据自己需求更改样式
}
return rowName; //也可以再加上其他类名 如果有需求的话
},
rowStyle({ row, rowIndex }) {
Object.defineProperty(row, "rowIndex", { // 给每行添加不可枚举属性rowIndex来标识当前行
value: rowIndex,
writable: true,
enumerable: false
});
},
clickEvent(row, column, event, params) {
let refsElTable = this.$refs.singleTable; // 获取表格对象
let findRow = {}
findRow = this.selectedRow.find(c => c.rowIndex == row.rowIndex); //找出当前选中行
//如果只有一行且点击的也是这一行则取消选择 否则清空再选中当前点击行
if (findRow && this.selectedRow.length === 1) {
refsElTable.toggleRowSelection(row, false);
return;
}
refsElTable.clearSelection();
refsElTable.toggleRowSelection(row);
},
handleSelectionChange(rows) {
this.selectedRow = rows; // 保存已选择行
},
}
}
</script>
<style>
</style>