公司产品需求 要求一个考勤表能使用键盘方向键控制当前选中Cell,回车触发弹窗显示和修改app
首选给须要获取键盘事件的元素添加tabIndex="0"
属性,注意div这种元素默认没有focus
属性,而且没有keyup
这种事件this
<div class="attend-container" ref="attendContainer" @keyup.right="changeCellSelect('right')" @keyup.left="changeCellSelect('left')" @keyup.up="changeCellSelect('up')" @keyup.down="changeCellSelect('down')" @keyup.enter="changeUserData(callbackdata.data[selectedCell.row][selectedCell.col],selectedCell.row,selectedCell.col)" tabindex="0" >
而后咱们定义一个选中的模型spa
selectedCell: { // 当前table中选择的cell row: '', col: '' },
在el-table
中去实现cell的选择效果,这里要利用cell-class-name
属性去实现,code
<el-table :data="data" stripe border size='mini' v-loading="loading" :cell-class-name="activeCell" >
// 点击cell的时候激活状态 activeCell({ row, column, rowIndex, columnIndex }) { if (rowIndex === this.selectedCell.row && columnIndex === this.selectedCell.col) { return 'selected-cell' } return '' },
.selected-cell { border: 2px solid #67C23A; background-color: #f0f9eb; }
当你点击Cell的时候触发的事件中传入对应的rowIndex和columnIndex存到this.selectedCell中,这样就是实现了点击Cell加上一个类.selected-cell从而实现高亮。blog
接下来咱们须要实现键盘方向键控制高亮的显示,注意处理index超出或者小于0的状况事件
// 键盘触发修改 changeCellSelect(direction) { let { row, col } = this.selectedCell switch (direction) { case 'right': col === this.callbackdata.data[0].length - 1 ? col = 0 : col++ break case 'left': col === 0 ? col = this.callbackdata.data[0].length - 1 : col-- break case 'up': row === 0 ? row = this.callbackdata.data.length - 1 : row-- break case 'down': row === this.callbackdata.data.length - 1 ? row = 0 : row++ break } this.selectedCell = { row, col } },
当在点击cell触发dialog去修改内容,关闭dialog后,键盘方向键不能触发cell的移动,缘由是因为dialog是appendToBody,因此须要给div手动从新获取焦点,使用dialog的close方法调用focusip
<el-dialog @close="attendContainerfocus">
// 关闭修改的dialog时候 让最外层div.attend-container 重获焦点 attendContainerfocus() { this.$refs.attendContainer.focus() },