当前位置:   article > 正文

vxe-table 键盘上下左右控制选中区域移动[3]_vxe-table 选中输入框可键盘输入

vxe-table 选中输入框可键盘输入

前几天写了个vxe-table 鼠标滑动选择多行,鼠标区域选中批量操作[2]_wanghanlu_的博客-CSDN博客

鼠标滑动选择的博客。该博客是建立在上面那个博客的基础上

接下来来实现一下通过键盘的上下左右键来控制选择区域的移动。

demo 点击查看demo演示

先说下实现思路:

1.需要给表格添加键盘按键事件

2.根据具体按的哪个键的去改变存储区域框的位置的变量。

3.然后显示区域框.

直接上代码了.

首先需要在改一个配置:

因为我们需要获取当前行的位置。

1.给表格添加按键事件@keydown

  1. <vxe-grid ref='xGrid' v-bind="gridOptions" height="500px"
  2. @cell-click="tableCellClick"
  3. @toolbar-button-click="toolbarButtonClickEvent"
  4. @keydown="tableKeydown">
  5. <!-- 键盘按键事件 -->
  6. </vxe-grid>

2.添加两个方法tableKeydown,

  1. tableKeydown({$event}){
  2. let tablexgrid=this.getTablexGrid();
  3. let tableColumn=this.getTablexGrid().getTableColumn()["visibleColumn"];
  4. let tableData=this.getTablexGrid().getTableData()["visibleData"];
  5. let startRowIndex=this.selectionStart["rowIndex"];
  6. let endRowIndex=this.selectionEnd["rowIndex"];
  7. let startColumnIndex=this.selectionStart["cellIndex"];
  8. let endColumnIndex=this.selectionEnd["cellIndex"];
  9. var maxColumnIndex=tableColumn.length-1;
  10. var maxRowIndex=tableData.length-1;
  11. var minColumnIndex=0;
  12. var minRowIndex=0;
  13. if($event.keyCode===39){
  14. //右键 向右
  15. if(endColumnIndex+1<=maxColumnIndex){
  16. var currentRow=tablexgrid.getCurrentRecord();
  17. const rowIndex =tableData.findIndex((row)=>{
  18. return row._X_ROW_KEY==currentRow._X_ROW_KEY;
  19. })
  20. this.selectionStart={"cellIndex":endColumnIndex+1,"rowIndex":rowIndex};
  21. this.selectionEnd={"cellIndex":endColumnIndex+1,"rowIndex":rowIndex};
  22. }
  23. this.setselectedCellArea();
  24. this.tableScrollMove("right");
  25. event.preventDefault();
  26. }else if($event.keyCode===37){
  27. //左键 向左
  28. if(startColumnIndex-1>=minColumnIndex){
  29. var currentRow=tablexgrid.getCurrentRecord();
  30. const rowIndex =tableData.findIndex((row)=>{
  31. return row._X_ROW_KEY==currentRow._X_ROW_KEY;
  32. })
  33. this.selectionStart={"cellIndex":startColumnIndex-1,"rowIndex":rowIndex};
  34. this.selectionEnd={"cellIndex":startColumnIndex-1,"rowIndex":rowIndex};
  35. }
  36. this.setselectedCellArea();
  37. this.tableScrollMove("left");
  38. event.preventDefault();
  39. }else if($event.keyCode===38){
  40. //向上
  41. var currentRow=tablexgrid.getCurrentRecord();
  42. const rowIndex =tableData.findIndex((row)=>{
  43. return row._X_ROW_KEY==currentRow._X_ROW_KEY;
  44. })
  45. if(rowIndex-1>=minRowIndex){
  46. this.selectionStart={"cellIndex":startColumnIndex,"rowIndex":rowIndex-1};
  47. this.selectionEnd={"cellIndex":startColumnIndex,"rowIndex":rowIndex-1};
  48. }
  49. this.setselectedCellArea();
  50. //判断是否小于最小行的个数
  51. event.preventDefault();
  52. }else if($event.keyCode===40){
  53. //向下
  54. var currentRow=tablexgrid.getCurrentRecord();
  55. const rowIndex =tableData.findIndex((row)=>{
  56. return row._X_ROW_KEY==currentRow._X_ROW_KEY;
  57. })
  58. if(rowIndex+1<=maxRowIndex){
  59. this.selectionStart={"cellIndex":startColumnIndex,"rowIndex":rowIndex+1};
  60. this.selectionEnd={"cellIndex":startColumnIndex,"rowIndex":rowIndex+1};
  61. }
  62. this.setselectedCellArea();
  63. event.preventDefault();
  64. }
  65. },

tableScrollMove:

  1. //控制滚动条
  2. //move:快捷键左右时有效,其他无效
  3. tableScrollMove(move){
  4. let tableColumn=this.getTablexGrid().getTableColumn()["visibleColumn"];
  5. let tableData=this.getTablexGrid().getTableData()["visibleData"];
  6. let startRowIndex=this.selectionStart["rowIndex"];
  7. let endRowIndex=this.selectionEnd["rowIndex"];
  8. let startColumnIndex=this.selectionStart["cellIndex"];
  9. let endColumnIndex=this.selectionEnd["cellIndex"];
  10. let fixedWidth=0;
  11. //获取固定列宽度fixed--hidden
  12. let flexDiv=this.$refs.xGrid.$el.querySelector(".vxe-table--fixed-left-wrapper");
  13. if(flexDiv){
  14. fixedWidth=flexDiv.offsetWidth;
  15. }
  16. //获取td
  17. var td;
  18. var tbody=this.$refs.xGrid.$el.querySelector(".vxe-table--main-wrapper table tbody");
  19. if(tbody&&move=="left"){
  20. var column=tableColumn[startColumnIndex];
  21. td=tbody.querySelector(`td[colid="${column.id}"]`);
  22. }else if(tbody&&move=="right"){
  23. var column=tableColumn[endColumnIndex];
  24. td=tbody.querySelector(`td[colid="${column.id}"]`);
  25. }
  26. if(td){
  27. //判断是否隐藏
  28. var tdRect=td.getBoundingClientRect();
  29. var table=this.$refs.xGrid.$el.querySelector(".vxe-table--body-wrapper table");
  30. if(table){
  31. let tableRect=table.parentElement.getBoundingClientRect();
  32. //需要减去左边固定列的宽度
  33. if (tdRect.top < tableRect.top ||tdRect.bottom > tableRect.bottom ||
  34. tdRect.left < tableRect.left+fixedWidth ||tdRect.right > tableRect.right){
  35. if(move=="right"){
  36. table.parentElement.scrollLeft+=(tdRect.right-tableRect.right);
  37. }else if(move=="left"){
  38. table.parentElement.scrollLeft+=(tdRect.left-tableRect.left-fixedWidth);
  39. }
  40. } else {
  41. // console.log("该 td 元素未隐藏");
  42. }
  43. }
  44. }
  45. },

功能就完成了啊。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/114531
推荐阅读
相关标签
  

闽ICP备14008679号