iview的表格行内编辑,input和select组件使用方向键切换输入

news2024/9/23 17:25:43

如果表格中的输入框和下拉框需要实现方向键切换选择,效果如图:
请添加图片描述
使用的是IView的UI框架和Vue2,核心是在输入框和下拉框上添加按键监听事件,监听按键对应方向应该要完成的操作,比如当前在Name列的第一行,按【向左键】的话,需要鼠标光标在第一行的Addressfocus()

核心代码讲解

keyup按下键盘执行的方法

handleKeyDown(event, row, key, name) {
  // ↑
  if (event.keyCode === 38) {
    // 按向上键需要执行的操作
  }
  // ↓
  if (event.keyCode === 40) {
    // 按向下键需要执行的操作
  }
  // ->
  if (event.keyCode === 39) {
    // 按向右键需要执行的操作
  }
  // <-
  if (event.keyCode === 37) {
    // 按向左键需要执行的操作
  }
},

针对上下方向键,其实就是更改数组的索引值

changeCurrentRow(row, key, type, name) {
  let curIndex = row._index;
  if (type === "+") {
    curIndex = row._index + 1;
  } else {
    curIndex = row._index - 1;
  }
  let changeRow = this.data[curIndex];
  this.$nextTick(() => {
    let e = document.querySelectorAll(`.${key}`)[curIndex];
    e.querySelector(name).focus();
  });
},

完整代码

template模板部分

<template>
  <Table :columns="columns" :data="data">
    <template #input="{ row, column }">
      <div
        :class="column.key"
      >
        <Input
          v-model="row[column.key]"
          @on-keyup="handleKeyDown($event, row, column.key, 'input')"
          @on-blur="changeValue(column, row[column.key], row._index)"
        />
      </div>
    </template>
    <template #select="{ row, column }">
      <Select
        :class="column.key"
        filterable
        @keyup="handleKeyDown($event, row, column.key, '.ivu-select-input')"
        @on-change="changeSelect(column, row[column.key], row._index, row)"
        clearable
        v-model="row[column.key]"
        :placeholder="`请选择${column.title}`"
      >
        <Option
          v-for="item in selectOption"
          :key="item.value"
          :value="item.value"
          :label="item.label"
        />
      </Select>
    </template>
  </Table>
</template>

javascript部分

<script>
export default {
  data() {
    return {
      selectOption: [
        {
          value: "1",
          label: "四川省",
        },
        {
          value: "2",
          label: "广东省",
        },
      ],
      columns: [
        {
          title: "Name",
          key: "name",
          slot: "input",
        },
        {
          title: "Age",
          key: "age",
        },
        {
          title: "Address",
          key: "address",
          slot: "select",
        },
        {
          title: "Remark",
          key: "remark",
          slot: "input",
        },
      ],
      data: [
        {
          name: "John Brown",
          age: 18,
          address: "1",
          remark: "",
        },
        {
          name: "Jim Green",
          age: 24,
          address: "2",
          remark: "",
        },
        {
          name: "Joe Black",
          age: 30,
          address: "1",
          remark: "",
        },
        {
          name: "Jon Snow",
          age: 26,
          address: "1",
          remark: "1",
        },
      ],
    };
  },
  methods: {
    changeValue(column, val, index) {
      this.data[index][column.key] = val;
    },
    changeSelect(column, val, index) {
      this.data[index][column.key] = val;
    },
    handleKeyDown(event, row, key, name) {
      // ↑
      if (event.keyCode === 38) {
        if (row._index > 0) {
          this.changeCurrentRow(row, key, "-", name);
        }
      }
      // ↓
      if (event.keyCode === 40) {
        if (row._index + 2 <= this.data?.length) {
          this.changeCurrentRow(row, key, "+", name);
        }
      }
      // ->
      if (event.keyCode === 39) {
        if (key === "name") {
          this.$nextTick(() => {
            let e = document.querySelectorAll(".address")[row._index];
            e.querySelector(".ivu-select-input").focus();
          });
        } else if (key === "address") {
          this.$nextTick(() => {
            let e = document.querySelectorAll(".remark")[row._index];
            e.querySelector("input").focus();
          });
        }
      }
      // <-
      if (event.keyCode === 37) {
        if (key === "remark") {
          this.$nextTick(() => {
            let e = document.querySelectorAll(".address")[row._index];
            e.querySelector(".ivu-select-input").focus();
          });
        } else if (key === "address") {
          this.$nextTick(() => {
            let e = document.querySelectorAll(".name")[row._index];
            e.querySelector("input").focus();
          });
        }
      }
    },
    changeCurrentRow(row, key, type, name) {
      let curIndex = row._index;
      if (type === "+") {
        curIndex = row._index + 1;
      } else {
        curIndex = row._index - 1;
      }
      let changeRow = this.data[curIndex];
      this.$nextTick(() => {
        let e = document.querySelectorAll(`.${key}`)[curIndex];
        e.querySelector(name).focus();
      });
    },
  },
};
</script>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/739449.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++之非const转const类型(一百五十五)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

QT-qcustomplot应用示例

QT-qcustomplot应用示例 前言一、演示效果二、关键程序三、资源链接 前言 提供曲线显示示例过程 一、演示效果 二、关键程序 // 生成曲线图 void QtWidgetsApplication1::setupQuadratic() {if (m_strViewMachineIndexList.size() < 0)return;// 进度条默认0ui.progressB…

能源在线监测管理系统平台

能源在线监测管理系统平台是一种集能源数据采集、处理、分析、展示和管理于一体的综合性平台。该平台通过现代信息技术手段&#xff0c;对企业、机构或个人的能源消耗、能源质量、能源成本等方面进行实时监测和管理&#xff0c;为企业和政府部门的能源管理和决策提供有力支持。…

【语音处理】基于加权压力匹配方法(WPMM)的私人声音系统研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

lammps教程:ovito转换data文件格式的方法

我是小马老师&#xff0c;本文与你分享一些关于lammps data文件格式转换的技巧和经验。 lammps是一个高度可定制的分子动力学模拟软件&#xff0c;它提供了丰富的功能和灵活的输入文件格式。其中&#xff0c;data文件是lammps中最常用的输入文件之一&#xff0c;用于描述模拟系…

Epoll 到底是什么?“不” 简单的网络I/O模型?

1 简介 Epoll 是个很老的知识点&#xff0c;是后端工程师的经典必修课。这种知识具备的特点就是研究的人多&#xff0c;所以研究的趋势就会越来越深。当然分享的人也多&#xff0c;由于分享者水平参差不齐&#xff0c;也产生的大量错误理解。 今天我再次分享 epoll&#xff0…

USB转GSM模块发送中英文测试

目录 使用模块前注意事项模块测试发送英文短信发送中文短信手机收到短信页面常见问题 总结 使用模块前注意事项 使用USB转GSM模块要 注意 两点: 1.所在地要有2G基站,因为这是2G信号产品。 2.最好使用移动卡&#xff0c;有些地方电信和联通卡无法使用。 模块测试 这里介绍模块…

在安卓手机搭建kali环境,手机变成便携式渗透神器

简介 kali是著名的黑客专用系统&#xff0c;一般都是直接装在物理机或者虚拟机上&#xff0c;我们可以尝试把kali安装在手机上&#xff0c;把手机打造成一个便携式渗透神器。 我们需要下载以下3款软件&#xff1a; (1).Termux(终端模拟器) (2).AnLinux(里边有各种安装liunx…

GPT时代,寻找讯飞星火大模型的算力支点

作者 | 辰纹 来源 | 洞见新研社 大模型的“涌现”还在持续。 5月底举行的中关村论坛上&#xff0c;有专家披露&#xff0c;中国10亿级参数规模以上的大模型已经发布了79个&#xff0c;刚刚结束的世界人工智能大会上&#xff0c;又有一批大模型批量发布。 大模型的热度居高不…

华大HC32F460 TCP Server实验

目录 1.实验目标 2.实验准备 3.主流程图 4.驱动代码 5.实验步骤 1.实验目标 本实验使用W5500服务器功能&#xff0c;通过串口实现与本地客户端透传数据。 2.实验准备 硬件搭建&#xff1a;ZW-HC32F460-BZ标准版开发板1套 软件搭建&#xff1a;MDK5.22 3.主流程图 4.驱动…

css实现按钮圆角渐变样式

最终成果图&#xff1a; 背景&#xff1a; 最近项目数据大屏这个样式给我卡住了&#xff0c;起因是UI设计想要按钮边框渐圆角背景透明渐变&#xff0c;我查找了好多资料也在问答里提问&#xff0c;都没有实现初始样式。原因是如果想用渐变边框就会使用到属性border-image&#…

在Microsoft Excel中带单位的数字如何求和

使用 Excel 中的 SUM 函数对一系列单元格、整列或非连续单元格求和。要创建出色的 SUM 公式&#xff0c;请将 SUM 函数与其他 Excel 函数结合使用&#xff0c;然而 SUM 函数不能直接对带单位的数字进行求和。 当直接相加带单位的几个数字会出现如下错误&#xff1a; 错误的原因…

811. 交换数值

链接&#xff1a; https://www.acwing.com/problem/content/813/ 题目&#xff1a; 输入两个整数 xx 和 yy&#xff0c;请你编写一个函数, 交换两个整数的数值并输出交换后的 xx 和 yy。 C中的格式为&#xff1a;void swap(int &x, int &y)。 Java中的格式为&#xff1…

【软件测试】Git 将项目本地推送至GitHub与Gitee(详细)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 Gitee拉取Github仓…

KeyShot 2023 Pro 对 Mac 和 Windows 系统的要求

KeyShot 2023 Pro 是一款功能强大的计算机辅助设计&#xff08;CAD&#xff09;渲染软件&#xff0c;它为用户提供了高质量的视觉效果和逼真渲染。 KeyShot 2023 Pro for Mac可以与各种主流 CAD 软件进行集成&#xff0c;包括 SolidWorks、AutoCAD、Rhinoceros、Fusion 360 等…

simulink matlab function

目录 改形参类型​编辑 多输出值 排序 peisistent 关键字&#xff0c;静态相当于static function添加trigger 输出调用function call() 改形参类型 多输出值 function [y1,y2] myfcn(u1,u2)y1 u1u2; y2 u1-u2; 排序 peisistent 关键字&#xff0c;静态相当于static func…

MIT 6.S081 -- Virtual memory for applications

MIT 6.S081 -- Virtual memory for applications 引言应用程序使用虚拟内存所需要的特性支持应用程序使用虚拟内存的系统调用虚拟内存系统如何支持用户应用程序构建大的缓存表Bakers Real-Time Copying Garbage Collector使用虚拟内存特性的GC使用虚拟内存特性的GC代码展示 引言…

【Linux后端服务器开发】基础IO与文件系统

目录 一、基础IO 1. C语言文件读写 2. 标志位传参 3. C语言与系统调用关系 二、文件系统 1. 文件描述符 2. 输入输出重定向 一、基础IO 文件调用 库函数接口&#xff1a; fopen、fclose、fwrite、fread、fseek系统调用接口&#xff1a;open、close、write、read、lsee…

利用 kube-vip 实现 K3s 高可用部署

作者简介 王海龙&#xff0c;Rancher 中国社区技术经理&#xff0c;Linux Foundation APAC Evangelist&#xff0c;负责 Rancher 中国技术社区的维护和运营。拥有 9 年的云计算领域经验&#xff0c;经历了 OpenStack 到 Kubernetes 的技术变革&#xff0c;无论底层操作系统 Lin…