键盘控制ElementPlus树形控件展开收起选中功能

2023-11-05

需求:

1、当树形控件获取焦点后,可通过键盘上下键来选中节点

2、当存在子节点时,键盘左键展开树,键盘右键收起树。

注意:

通过上下键来选中数据节点时,只有canFocus为true的节点才能被选中

    /**
     * 移动键盘上下键,切换树节点选中项(不执行树的点击事件)
     * @param event 原生时间
     * @param treeRef 树组件的ref
     */
    function treeKeyVerticalDef(event: any, treeRef: any) {
      let dataKey = event.target.getAttribute('data-key');
      if (dataKey && dataKey !== '') {
        treeRef.value!.setCurrentKey(dataKey, true);
      }
    }
    /**
     * 键盘左方向键展开节点
     * @param event 原生事件
     * @param treeRef 树组件的ref
     */
    function treeKeyOpen(event: any, treeRef: any){
      let dataKey = event.target.getAttribute('data-key');
      if (dataKey && dataKey !== '') {
        let curNode: any = treeRef.value!.getNode(dataKey);
        let curNodeData = treeRef.value!.getCurrentNode();
        curNode!.expanded = true;
        if (curNodeData && curNodeData.children.length > 0) {
          setTreeNodeFocus(curNodeData.children, treeRef);
        }
      }
    }
    /**
     * 将展开节点所有子节点的canFocus置为true
     * 将展开状态的子节点的canFocus置为true,未展开的为false
     * @param treeData
     * @param treeRef
     */
    function setTreeNodeFocus(treeData: any[], treeRef: any) {
      if (treeData && treeData.length > 0) {
        treeData.forEach((treeNode: any) => {
          let node: any = treeRef.value!.getNode(treeNode.nodeId); // 获取Node
          node!.canFocus = true;
          if (node && node.data && node.data.children && node.data.children.length > 0) {
            let nodeData: any = node.data; // 获取数据
            if (nodeData && nodeData.children && nodeData.children.length > 0 && node.expanded) {
              setTreeNodeFocus(nodeData.children, treeRef);
            }
          }
        })
      }
    }
    /**
     * 键盘左方向键折叠节点
     * @param event 原生事件
     * @param treeRef 树组件的ref
     */
    function treeKeyClose(event: any, treeRef: any){
      let dataKey = event.target.getAttribute('data-key');
      if (dataKey && dataKey !== '') {
        let curNode: any = treeRef.value!.getNode(dataKey);
        curNode!.expanded = false;
        let curNodeData = treeRef.value!.getCurrentNode();
        if (curNodeData && curNodeData.children.length > 0) {
          setTreeNodeNotFocus(curNodeData.children, treeRef);
        }
      }
    }
    /**
     * 将收起节点所有子节点的canFocus置为false
     * @param treeData 子节点数组
     * @param treeRef 树组件的ref
     */
    function setTreeNodeNotFocus(treeData: any[], treeRef: any) {
      if (treeData && treeData.length > 0) {
        treeData.forEach((treeNode: any) => {
          let node: any = treeRef.value!.getNode(treeNode.nodeId); // 获取Node
          node!.canFocus = false;
          if (node && node.data && node.data.children && node.data.children.length > 0) {
            let nodeData: any = node.data; // 获取数据
            if (nodeData && nodeData.children && nodeData.children.length > 0) {
              setTreeNodeNotFocus(nodeData.children, treeRef);
            }
          }
        })
      }
    }
<el-tree
  ref="treeRef"
  node-key="nodeId"
  :data="treeData"
  @node-click="handleNodeClick"
  :expand-on-click-node="false"
  highlight-current
  @keyup.up="treeKeyVertical"
  @keyup.down="treeKeyVertical"
  @keyup.left="treeKeyOpen"
  @keyup.right="treeKeyClose"
>
  <template #default="{ node }">
    <span :title="node.label" class="tree-label">{{ node.label }}</span>
  </template>
</el-tree>

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

键盘控制ElementPlus树形控件展开收起选中功能 的相关文章

  • JQuery mouseover 函数多次触发

    我很长时间以来一直使用这种方法来为整个类 按钮等 设置事件 div bigButton mouseover function this style backgroundColor dfdfdf 然而 在进行一些测试时 我刚刚注意到 当将鼠标
  • javascript 中的工厂模式与构造函数模式[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我看到了关于 javascript 设计模式的教程 虽然教程很好 但它给我留下了很少的问题 正如我所见 工厂和构造函数产生相同的结果
  • 过滤数据表中的行

    我目前的 JQuery 插件 DataTables 工作正常 并且我在页面顶部插入了一个按钮来进一步过滤列表 我还使用了 DataTables 内置的搜索栏 我希望按钮向下过滤表格 并只显示包含特定值的行 下面是我一直在做的事情 但似乎没有
  • 在 JavaScript/CoffeeScript 中确定一个数组是否包含另一个数组的内容

    在 JavaScript 中 如何测试一个数组是否包含另一个数组的元素 arr1 1 2 3 4 5 8 1 10 2 3 4 5 9 function name arr1 gt true 没有 set 函数可以执行此操作 但您可以简单地执
  • execCommand 的替代品

    我希望创建一个所见即所得编辑器 使用 jQuery 作为框架 我可以使用不同的方法来简化生产 我现在确实有一个正在工作的编辑 而且运作良好 我使用 iFrame 并将其设计模式设置为打开并从那里开始 然而 有一些事情困扰着我 以更改所选文本
  • 多个引导模式的滚动问题

    我有一个带有大量信息的模态页面 因此您需要滚动 该模式包含指向第二个模式的链接 When I 打开模态 1 单击链接打开模式 2 模式 1 保持在后台 然后关闭模式 2 以便我回到模式 1 modal 1 失去滚动 仍然有一个滚动条 但它不
  • 如何从索引文件迭代多个导入的模块

    我有一个名为Polygons我在那里创建了一个index jsfile 以导出目录中的所有文件 它看起来像这样 export default as europe from europe export default as northAmer
  • 如何使用 jQuery 解析 JavaScript 对象

    jQuery JavaScript 中用于解析 JSON 对象并返回键 值对的 foreach 等效项是什么 JSON 对象 是什么意思 JSON 是一种用于序列化对象的文本格式 如果要循环访问通过反序列化 JSON 字符串获得的对象中的属
  • 如何在网页上显示进度条直到网页完全加载?

    我想在网页中显示进度条 加载弹出窗口 直到页面完全加载 我的网页很重 因为它包含一个 HTML 编辑器 这是一个基于 jQuery 的 HTML 编辑器 需要很多时间才能完全加载 在加载时 我希望在页面上显示一个进度条 该进度条将在整个页面
  • Android:Html 锚链接仅在 Web 视图中有效一次

    在使用锚链接加载 html 内容时 我在 webview 中遇到一些奇怪的问题 以下代码非常适合锚标记 但是只有一次 第二次当我按下锚标签时不工作 protected void onCreate Bundle savedInstanceSt
  • html2canvas z-index 不起作用

    我正在使用 html2canvas 库将 div 转换为 png 我有一个关于z index 正如你在图片上看到的 我有盒子 在一个盒子里我有一个用于背景着色的 div z index 0 它随着高度值和数字的 div z index 1
  • 我可以跳过 HTML5 中“style”标签中的属性“type”吗? [复制]

    这个问题在这里已经有答案了 根据W3学校 http www w3schools com tags tag script asp 我可以跳过属性type对于标签script在 HTML5 中 Evidence HTML 4 01 和 HTML
  • Typescript:如何在构造函数之外初始化类属性

    我有一个场景 我需要在构造函数之外初始化类属性 考虑以下示例 class A public prop MyPropType public id string public constructor id string this id id p
  • 如何获取当前页面样式表作为字符串?

    假设我当前的页面如下所示 我想
  • $window.location.href 在 AngularJS 中不起作用

    我正在构建一个基本的AngularJS登录页面和 window location href没有将页面重定向到我的系统中由 WAMP 托管的新 html 我什至尝试将其重定向到谷歌 什么都没发生 我在这里尝试了所有可用的解决方案 但似乎没有任
  • 两个同时发生的事件

    我在这个页面上使用了一段JS代码http 200tr ru app admin http 200tr ru app admin 当我按下十字符号时 会发生 2 个事件 模糊和单击 但仅运行模糊代码 我需要反点击交叉代码 我怎样才能做到这一点
  • JS:event.touches 属性如何工作?

    我不明白如何使用 event touches 属性 例如 要获取 iPad iPhone 上的手指数量 您应该使用 event touches length 那么为什么这个示例代码不起作用呢 image bind touchstart fu
  • VueJS $watch $refs

    是否有可能 watch Vue refs 我想针对嵌套在当前 Vue 实例内但在ready打回来 refs childcomponent最初是undefined当它被处理时 inside ready this watch refs func
  • React Material UI 1.0 在更改时选择多个参数

    我正在使用 React Material Ui 1 0 0 beta 34 并且 Select 组件有问题 我正在尝试设置附加参数onChange事件处理程序 但看起来只允许传递事件参数 这就是我的自定义选择组件的样子 import Rea
  • 在javascript中使用正则表达式从字符串中提取子字符串

    我是 javascript 新手 如何提取与 javascript 字符串中的正则表达式匹配的子字符串 例如在Python中 version regex re compile r d d d line 2021 05 29 Version

随机推荐

  • 5.1 数组

    C 为基本的数据类型 整数 浮点数 字符型和布尔型 提供了内置的支持 就像在上一章我们为复数类定义了重载的运算符那样 内置的支持也称为协助函数 helper function 支持这些数据类型完成各种允许的运算 也就是说基本数据类型也可以说
  • 【华为OD机试真题2023B卷 JAVA&JS】计算最接近的数

    华为OD2023 B卷 机试题库全覆盖 刷题指南点这里 计算最接近的数 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 给定一个数组X和正整数K 请找出使表达式X i X i 1 X i K 1 结果最接近于数组中位数的下标
  • Modbus协议详解2:通信方式、地址规则、主从机通信状态

    首先我们要清楚 Modbus是一种串行链路上的主从协议 在通信线路上只能有一个主机存在 不会有多主机存在的情况 虽然主机只有一个 但是从机是可以有多个的 Modbus的通信过程都是由主机发起的 从机在接收到主机的请求后再进行响应 从机不会主
  • 30个 BeageBone 嵌入式项目

    特点 展示了如何使用 BeagleBone Black 编程和构建有趣且引人入胜的项目 学习如何将 BeagleBone Black 连接到您的计算机并对其进行编程 快速掌握 BoneScript 和其他编程工具 30 个 BeagleBo
  • 2023网站seo过时了吗?

    不完全是 虽然SEO过去的一些策略可能已经不再有效 但SEO本身并没有过时 实际上 随着搜索引擎算法的不断发展和用户对搜索结果质量的不断提高 合法 道德以及有效的SEO策略依然能够帮助网站获得搜索引擎排名并吸引大量有针对性的流量 尽管SEO
  • 接收I/O请求完成通知

    那片土在蓝天上 燃烧的翅膀 Windows via C C 学习笔记 设备I O之 接收I O请求完成通知 上一篇 讨论了如何发送I O请求 在异步的设备I O请求方式下 要考虑的问题就是当I O请求完成之后 驱动程序如何通知你的应用程序
  • Docker入门——简单记录

    Docker Docker是一个虚拟环境 某种意义上说它就是一个带有终端命令行的虚拟机 狭义上解释 Docker是一个容器 在这个容器里 Docker中的镜像不再是静态不可操作的 可以对安装的系统镜像进行软件下载 比如gcc g 之类 只不
  • 【自然语言处理

    Transformer由论文 Attention is All You Need 提出 论文地址为 https arxiv org pdf 1706 03762 pdf 文章目录 一 Transformer 整体结构 二 Transform
  • win32原生API实现OpenGL例子(无glew,glut等第三方依赖库)

    正文 话不多说 直接上代码 include
  • 【java面试常见4】

    文章目录 1 面向对象的特征有哪些方面 2 作用域public private protected 以及不写时的区别 3 String 是最基本的数据类型吗 4 float 型float f 3 4是否正确 5 short s1 1 s1
  • Git操作与仓库创建

    Git简介 首先了解一个概念 版本控制 简单来说就是如果你做文案工作 每次提交之后 你的领导会让你修改 一篇稿子可能修改十几次 但是最后定稿的很可能不是最新修改的那一稿 所以就需要有个版本控制的方法 可以回溯到你所修改的任何一版 并且可以拿
  • ServerletContext

    ServerletContext ServerletContext是一种各serverlet项目间互相传输数据的存储器 外链图片转存失败 源站可能有防盗链机制 建议将图片保存下来直接上传 img s29palnw 1613542859309
  • c++基础 STL 第三篇:(deque容器和stack容器)

    文章目录 一 deque 的基本概念 二 deque 的构造函数 三 deque 的赋值操作 四 deque 的大小操作 五 deque 的插入和删除 六 deque 的数据获取 七 stack 的基本概念 八 stack 的常用接口 一
  • 配置文件及日志文件脱敏

    配置文件脱敏 使用原因 在项目中 经常需要在配置文件里配置一些敏感信息 比如数据库用户名和密码 redis mq的连接信息等 如果直接写明文 很容易造成密码泄露等安全问题 jasypt简介 Jasypt是一个Java库 它允许开发者以最小的
  • 文档在线预览(四)使用js前端实现word、excel、pdf、ppt 在线预览

    文章目录 实现方案 一 docx文件实现前端预览 1 docx preview 2 Mammoth 二 PDF文件实现前端预览 1 pdf js 2 pdfobject js 3 vue pdf 4 iframe object embed
  • 【高等数学重点题型篇】——一元函数微分学的应用

    本文仅用于个人学习记录 使用的教材为汤家凤老师的 高等数学辅导讲义 本文无任何盈利或者赚取个人声望的目的 如有侵权 请联系删除 文章目录 一 证明f n
  • [当人工智能遇上安全] 7.基于机器学习的安全数据集总结

    您或许知道 作者后续分享网络安全的文章会越来越少 但如果您想学习人工智能和安全结合的应用 您就有福利了 作者将重新打造一个 当人工智能遇上安全 系列博客 详细介绍人工智能与安全相关的论文 实践 并分享各种案例 涉及恶意代码检测 恶意请求识别
  • unity3d小小白之改变地面的颜色质感

    如果不知道怎么建地面 可以看上一个随笔噢 这样看起来很冰山诶 换颜色呢 要先把unity3d自带的基础素材导入噢 如果你有自己的素材也是可以导入的 只不过要放在assets文件中 最好建个专门的文件夹存放图片 pigPhoto catPho
  • 深入 Spring 系列之静态资源处理

    1 背景 前一段时间 WebIDE 开源的过程中 无意间接触到 webjars 觉得比较有趣 于是研究并整理了一下 webjars 是将前端的库 比如 jQuery 打包成 Jar 文件 然后使用基于 JVM 的包管理器 比如 Maven
  • 键盘控制ElementPlus树形控件展开收起选中功能

    需求 1 当树形控件获取焦点后 可通过键盘上下键来选中节点 2 当存在子节点时 键盘左键展开树 键盘右键收起树 注意 通过上下键来选中数据节点时 只有canFocus为true的节点才能被选中 移动键盘上下键 切换树节点选中项 不执行树的点