Vue3可媲美Element Plus Tree组件研发之重命名节点

news2024/9/17 7:00:47

在上一节《移除节点》基础上继续迭代JuanTree的功能,我们将实现节点重命名的功能。

在这里插入图片描述

实现效果:

可以对现有节点进行编辑,点回车或失去焦点完成编辑,如果输入为空,会恢复为原来的值。同时支持对新增的节点自动启用编辑功能,以方便用户操作。

关于节点名称重复检查

注意,这里对于节点编辑只做了非空限制,节点名称重复前端不处理哦,对于节点的变更在提交后台时可以再进行统一的校验或者交给后台校验,目前的实现是这样的。因为考虑到在懒加载的情况下启用节点的编辑功能,检查标签名是否重复需要调用远程接口判断,因此我们干脆取消这一独立的检查功能,简化开发的难度,后续可以再完善噢~

在这里插入图片描述

用法示例

只需要调用插槽返回对象的startEdit()方法即可。

在这里插入图片描述

具体实现

属性和方法

新增一个表示节点编辑中的属性:

// 扩展的扁平化节点
export interface IFlatTreeNode extends ITreeNode {
  ...
  editing?: boolean // 节点处于编辑中
}

新增触发节点编辑的用户API操作方法:

// 用户可进行节点操作的接口,该接口是提供给用户的。
export interface ITreeNodeOperation {
  ...
  startEdit: () => void // 触发节点编辑的方法
}

tsx组件完善

渲染树节点名称的地方调整下:

{/* 非编辑状态下渲染标签名 */}
{!node.editing ? (
node[labelName as 'label']
) : (
/* 编辑状态下渲染一个输入框 */
<input
  class='box-border h-[21px] border border-solid'
  type='text'
  v-model={editLabel.value}
  ref={input}
  onBlur={() => {
    inputBlur(node as never)
  }}
  onKeydown={($event) => {
    inputKeydown($event, node as never)
  }}
/>
)}

这里会对输入框绑定一个响应式的变量:

const editLabel = ref('') // 输入框中编辑的节点标签名

相关的事件处理:

// 结束节点标签名编辑的函数
const finishEdit = (node: IFlatTreeNode) => {
  // 如果输入不为空,则绑定节点的名称
  // 同时更新关联的原始节点的name,
  if (editLabel.value !== '') {
    const name = labelName as 'label'
    node[name] = node.originalNode[name] = editLabel.value
  }
  // 结束编辑
  node.editing = false
}
// 当输入框失去焦点时触发结束编辑
const inputBlur = (node: IFlatTreeNode) => {
  finishEdit(node)
}
// 当在编辑输入框时按下回车键也结束编辑
const inputKeydown = (evt: KeyboardEvent, node: IFlatTreeNode) => {
  if (evt.key === 'Enter') finishEdit(node)
}

提供给用户的API实现:

// 编辑节点名称的输入框元素的引用
const input = ref<HTMLInputElement>()
// 返回节点操作方法的函数
const nodeOperation = (node: IFlatTreeNode): ITreeNodeOperation => {
  // 注意,这里不应该直接给用户提供node,而是要包成对外公开的ITreeNodeOperation,遵循迪米特法则!!
  return {
    // 给用户操作的启用节点编辑方法
    startEdit() {
      // 绑定节点的name值到输入框
      editLabel.value = node[labelName as 'label']
      // 启用编辑
      node.editing = true
      // 在input完成渲染后自动获得焦点
      nextTick(() => {
        input.value!.focus()
      })
    },
    ...
  }
}

支持新增时启用编辑

将原先的启用编辑的逻辑提取为一个内部的函数:

const _startEdit = (node: IFlatTreeNode) => {
  // 绑定节点的name值到输入框
  editLabel.value = node[labelName as 'label']
  // 启用编辑
  node.editing = true
  // 在input完成渲染后自动获得焦点
  nextTick(() => {
    input.value!.focus()
  })
}

在以下地方进行调用:

// 返回节点操作方法的函数
const nodeOperation = (node: IFlatTreeNode): ITreeNodeOperation => {
  return {
    // 给用户操作的启用节点编辑方法
    startEdit() {
      _startEdit(node)
    },
    append(newNode: ILeafNode) {
      // 返回新的扁平化节点
      const newFlatNode = node.append(newNode, originalFlatData)
      _startEdit(newFlatNode)
    },
    ...
  }
}
const exposeProps: ExposeProps = {
  appendTop(newNode: ILeafNode) {
    // 内部方法调用
    const newFlatNode = appendTop(newNode, originalFlatData, data, optionProps)
    _startEdit(newFlatNode)
  }
}

这里调整下appendappendTop方法的返回值,原来是void,现在改为IFlatTreeNode

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

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

相关文章

花几千上万学习Java,真没必要!(三十四)

1、泛型类&#xff1a; 测试代码&#xff1a; 创建一个Box类; package settest.com; public class Box<T> { // T stands for "Type" - T是一个占位符&#xff0c;用于表示具体的类型 // 类的内部可以使用T作为类型声明变量 private T t; // 构造方法&am…

ROS中使用rqt_plot快速实现数据可视化

对数据进行可视化有很多好处&#xff0c;比如可以帮助我们快速判断机器人运动轨迹是否平滑。 一般来说&#xff0c;我们会将数据保存为文件&#xff0c;然后进行绘图&#xff0c;但是在ROS中&#xff0c;有一个很好用的工具&#xff0c;叫rqt_plot&#xff0c;用它可以快速实现…

力扣高频SQL 50题(基础版)第二十四题

文章目录 力扣高频SQL 50题&#xff08;基础版&#xff09;第二十四题1729.求关注者的数量题目说明实现过程准备数据实现方式结果截图 力扣高频SQL 50题&#xff08;基础版&#xff09;第二十四题 1729.求关注者的数量 题目说明 表&#xff1a; Followers ----------------…

Maven已经导入Junit包,但是还是无法使用注解

Maven已经导入Junit包&#xff0c;但是还是无法使用注解 背景&#xff1a; 导入了Junit的依赖 <dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></d…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第三篇 嵌入式Linux驱动开发篇-第六十五章 Linux I2C驱动实验

i.MX8MM处理器采用了先进的14LPCFinFET工艺&#xff0c;提供更快的速度和更高的电源效率;四核Cortex-A53&#xff0c;单核Cortex-M4&#xff0c;多达五个内核 &#xff0c;主频高达1.8GHz&#xff0c;2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

Qt编写自定义控件:跑马灯文本控件

#ifndef RUNNINGTEXTWIDGET_H #define RUNNINGTEXTWIDGET_H#include <QWidget>enum Direction {North 0, //上South, //下West, //左East //右 };class RunningTextWidget : public QWidget {Q_OBJECT public:explicit RunningTextWidget(QWidget *parent nullptr);…

第二期:集成电路(IC)——智能世界的微观建筑大师

嘿&#xff0c;小伙伴们&#xff01;&#x1f44b; 我是你们的老朋友小竹笋&#xff0c;一名热爱创作和技术的工程师。上一期我们聊了聊AI芯片&#xff0c;这次我们要深入到更微观的层面&#xff0c;来探究集成电路&#xff08;IC&#xff09;的世界。准备好一起探索了吗&#…

50+受高度近视屈光参差与白内障阻碍,巫雷院长一场手术“均衡”双眼

周女士双眼近视度数一直差异很大&#xff0c;这么多年从未看清。“这次”是因为发现视力逐渐下降检查得知并发性白内障&#xff0c;以屈光性白内障手术得以一次性治疗多个问题。 周女士小时候就近视了&#xff0c;那时家里不重视&#xff0c;且自己觉得戴眼镜“不好”&#xf…

强制重新启动 iPhone

官网&#xff1a;https://support.apple.com/zh-cn/guide/iphone/iph8903c3ee6/ios 按住调高音量按钮&#xff0c;然后快速松开。按住调低音量按钮&#xff0c;然后快速松开。按住侧边按钮。当 Apple 标志出现时&#xff0c;松开侧边按钮。

【初阶数据结构题目】1.返回倒数第k个节点

文章目录 题目描述代码 题目描述 返回倒数第k个节点 代码 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/typedef struct ListNode ListNode; int kthToLast(struct ListNode* head, int k){ListNode* t hea…

保姆级教程!!教你通过【Pycharm远程】连接服务器运行项目代码

小罗碎碎念 这篇文章主要解决一个问题——我有服务器&#xff0c;但是不知道怎么拿来写代码&#xff0c;跑深度学习项目。确实&#xff0c;玩深度学习的成本比较高&#xff0c;无论是前期的学习成本&#xff0c;还是你需要具备的硬件成本&#xff0c;都是拦路虎。小罗没有办法…

「12月·长沙」人工智能与网络安全国际学术会议(ISAICS 2024)

人工智能与网络安全国际学术会议(ISAICS 2024)将于2024年12月20日-2024年12月22日在湖南长沙召开。会议中发表的文章将会被收录,并于见刊后提交EI核心索引。会议旨在在为国内与国际学者搭建交流平台,推进不同学科领域的融合发展&#xff0c;就当今人工智能与网络安全范畴内各学…

史上最全的Seata教学并且连接springcloudAlibaba进行使用

来都来了点个赞收藏一下在走呗~~&#x1f339;&#x1f339;玫瑰 一、Seata是什么 Seata&#xff08;Simple Extensible Autonomous Transaction Architecture&#xff0c;简单可扩展自治事务框架&#xff09;是一种分布式事务解决方案&#xff0c;旨在解决分布式系统中的事务…

【iOS】通知的底层原理(实现)

通知 一. 通知的基本使用 1. 基本概念 NSNotification 是iOS中一个调度消息通知的类,采用单例模式设计,在程序中实现传值、回调等地方应用很广。在iOS中&#xff0c;NSNotification & NSNotificationCenter是使用观察者模式来实现的用于跨层传递消息。 概要&#xff1a…

C++ 关键字与库函数 学习总结

sizeof与strlen 含义 sizeof&#xff1a;是一个操作符&#xff0c;用于计算数据类型或变量的大小&#xff08;以字节为单位&#xff09;。在编译时求值strlen&#xff1a; 是一个函数&#xff0c;用于计算字符串的长度&#xff08;不包括终止符 \0&#xff09;。在运行时求值不…

QT基础教程(QEvent事件和事件过滤器)

文章目录 前言一、具体介绍二、具体案例1.鼠标事件2.键盘事件3.窗口事件 三、事件过滤器事件过滤器的工作原理 总结 前言 本篇文章将带大家来学习QT中的QEvent事件&#xff0c;QEvent 是 Qt 框架中的一个核心类&#xff0c;用于处理各种事件。在 Qt 的事件处理系统中&#xff…

framebuffer(帧缓冲)

framebuffer 在Linux系统中&#xff0c;Framebuffer通常是指Framebuffer设备&#xff0c;它是一种特殊的字符设备&#xff0c;在Linux系统中&#xff0c;Framebuffer设备使得程序员可以通过其设定的函数接口直接访问硬件&#xff0c;而不需要通过CPU。 framebuffer的一般操作流…

江协科技51单片机学习- p29 DS18B20温度传感器

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…