当前位置: 首页 > news >正文

网站建设公司龙华/北京seo公司哪家好

网站建设公司龙华,北京seo公司哪家好,做视频播放网站 赚钱,网站开发面试问题以及回答实现 el-table 中键盘方向键导航功能vue2vue3(类似 Excel) 功能需求 在 Element UI 的 el-table 表格中实现以下功能: 使用键盘上下左右键在可编辑的 el-input/el-select 之间移动焦点焦点移动时自动定位到对应单元格支持光标位置自动调整…

实现 el-table 中键盘方向键导航功能vue2+vue3(类似 Excel)

功能需求

在 Element UI 的 el-table 表格中实现以下功能:

  • 使用键盘上下左右键在可编辑的 el-input/el-select 之间移动焦点
  • 焦点移动时自动定位到对应单元格
  • 支持光标位置自动调整,提升编辑体验
完整解决方案(vue2)
1. 表格结构修改

在 el-table 中添加键盘事件监听,并为可编辑元素添加定位标识:

<template><el-table :data="tableData" border style="width: 100%" size="small"><el-table-column prop="account_id" label="结算账户" width="180" align="center"><template slot-scope="scope"><el-select v-model="scope.row.account_id" placeholder="请选择账户" clearable filterable @keydown.native.stop="onKeyDown(scope.$index, 'account_id', $event)" :ref="getInputRef(scope.$index, 'account_id')"><el-option label="a" value="1" /><el-option label="b" value="2" /></el-select></template></el-table-column><el-table-column prop="money" label="结算金额" width="180" align="center"><template slot-scope="scope"><el-input v-model="scope.row.money" clearable @keydown.native.stop="onKeyDown(scope.$index, 'money', $event)" :ref="getInputRef(scope.$index, 'money')"/></template></el-table-column><el-table-column prop="remark" label="备注" align="center"><template slot-scope="scope"><el-input v-model="scope.row.remark" @keydown.native.stop="onKeyDown(scope.$index, 'remark', $event)" :ref="getInputRef(scope.$index, 'remark')"></el-input></template></el-table-column></el-table>
</template>
2. 核心 JavaScript 逻辑

在 Vue 组件的 methods 中添加焦点导航控制方法:

<script>
export default {data() {return {tableData: [{},{},{},{}],columns: [{prop: 'account_id'},{prop: 'money'},{prop: 'remark'}],refList: {}}},methods: {getInputRef(rowIndex, columnProp) {return `input-${rowIndex}-${columnProp}`},onKeyDown(rowIndex, columnProp, event) {// 当前列在columns数组中的索引const columnIndex = this.columns.findIndex((c) => c.prop === columnProp)// 计算下一个输入框的位置,如果是当前行的最后一个输入框则移到下一行的第一个输入框let nextColumnIndex = (columnIndex + 1) % this.columns.length;let nextRowIndex;switch(event.keyCode) {case 38:nextRowIndex = rowIndex - 1;nextColumnIndex = columnIndex;break;case 40:nextRowIndex = rowIndex + 1;nextColumnIndex = columnIndex;break;case 37:nextRowIndex = columnIndex === 0 ? rowIndex - 1 : rowIndexnextColumnIndex = columnIndex === 0 ? this.columns.length - 1 : columnIndex - 1break;case 39:nextRowIndex = columnIndex === this.columns.length - 1 ? rowIndex + 1 : rowIndexbreak;}const nextInputRef = `input-${nextRowIndex}-${this.columns[nextColumnIndex].prop}`const currentInputRef = `input-${rowIndex}-${this.columns[columnIndex].prop}`this.$nextTick(() => {if (this.$refs[nextInputRef]) {this.$refs[nextInputRef].focus()if (this.$refs[currentInputRef]) {this.$refs[currentInputRef].blur()}}})}}
}
</script>
完整解决方案(vue3)
 <template><el-table :data="tableData" border style="width: 100%" size="small"><el-table-column prop="account_id" label="结算账户" width="180" align="center"><template #default="{ row, $index,column }"><el-select v-model="row.account_id" placeholder="请选择账户" clearable filterable @keydown="onKeyDown($index,column.property,$event)" :ref="(el)=>setRef(el,`input-${$index}-${column.property}`)"><el-option label="a" value="1" /><el-option label="b" value="2" /></el-select></template></el-table-column><el-table-column prop="money" label="结算金额" width="180" align="center"><template #default="{ row, $index,column }"><el-input v-model="row.money" clearable @keydown="onKeyDown($index,column.property,$event)" :ref="(el)=>setRef(el,`input-${$index}-${column.property}`)"/></template></el-table-column><el-table-column prop="remark" label="备注" align="center"><template #default="{ row,$index,column }"><el-input v-model="row.remark" @keydown="onKeyDown($index,column.property,$event)" :ref="(el)=>setRef(el,`input-${$index}-${column.property}`)"></el-input></template></el-table-column></el-table>
</template>
<script setup>
import { nextTick, ref } from 'vue'const tableData = [{},{},{},{}
]const columns = [{prop:'account_id'},{prop:'money'},{prop:'remark'}
]
const refList = ref({})
const setRef = (el,key)=>{refList.value[key] = el
}
function onKeyDown(rowIndex,columnProp,event){// 当前列在columns数组中的索引const columnIndex = columns.findIndex((c) => c.prop === columnProp)// 计算下一个输入框的位置,如果是当前行的最后一个输入框则移到下一行的第一个输入框let nextColumnIndex = (columnIndex + 1) % columns.length;let nextRowIndex;switch(event.keyCode){case 38:nextRowIndex = rowIndex - 1 ;nextColumnIndex = columnIndex;break;case 40:nextRowIndex = rowIndex + 1 ;nextColumnIndex = columnIndex;break;case 37:nextRowIndex = columnIndex === 0 ? rowIndex - 1 : rowIndexnextColumnIndex = columnIndex === 0 ? columns.length - 1 : columnIndex - 1break;case 39:nextRowIndex = columnIndex === columns.length - 1 ? rowIndex + 1 : rowIndexbreak;}const nextInputRef = `input-${nextRowIndex}-${columns[nextColumnIndex].prop}`const currentInputRef = `input-${rowIndex}-${columns[columnIndex].prop}`nextTick(() => {if (refList.value[nextInputRef]) {refList.value[nextInputRef].focus()refList.value[currentInputRef].blur()}})}
</script>
http://www.jmfq.cn/news/5315995.html

相关文章:

  • 十度网站建设/semir是什么意思
  • 网站建设公开课/seo关键词排行优化教程
  • 网站正在建设中提示页面/优化关键词是什么意思
  • 衡阳县党风廉政建设网站/网络营销的特点有哪些特点
  • 山西太原建设银行招聘网站/seo排名哪家有名
  • 上海杨浦区网站建设/优化seo是什么
  • 青岛做网站建设哪家好/杭州seo推广排名稳定
  • 知识付费网站建设/类似58的推广平台有哪些平台
  • wamp网站建设/南京seo网络优化公司
  • 郑州高端定制网站建设公司/软文写作技巧有哪些
  • 河南省建设工程质量安全监督网站/优化是什么意思?
  • 成都网站建设优秀公司/2022年seo最新优化策略
  • 创意家居网站建设与管理/武汉大学人民医院精神科
  • 许昌网站建设汉狮套餐/百度文库首页
  • 加拿大28网站建设/鼓楼网页seo搜索引擎优化
  • 购物手机网站建设/优化营商环境发言材料
  • 龙岩建设局网站罗小波/网站建设对企业品牌价值提升的影响
  • b2b网站建设规则/seo顾问服务四川
  • 徐州市城乡和住房建设局网站/服务器域名怎么注册
  • 住房和城乡规划建设局网站/口碑营销的成功案例
  • 天河微网站建设/推广游戏怎么拉人最快
  • 网站建设优化推广西藏/免费精准客源
  • 网页制作与网站建设试卷及答案/公众号开发
  • 珠海高端网站建设公司/seo是指搜索引擎营销
  • 芜湖网站建设海长卷发背影图/优化网络软件
  • 临汾花果街网站建设/专门做网站的公司
  • 营销型门户网站建设/百度怎么免费推广自己的产品
  • 贵安新区城乡住房建设厅网站/百度客服电话号码
  • 网站建设实训经验总结/宁波seo快速优化平台
  • 有口碑的南昌网站建设/百度关键词查询工具免费