百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

Vue3+TSX手撸Element Tree升级版

myzbx 2025-03-06 17:42 19 浏览

Vue3开源的Tree组件有很多,大家常用的是以Element Tree为首的UI组件。就我个人体验来说,有些地方做的并不好,尤其是树节点的增删改操作、勾选功能以及高级的拖拽实现。这些功能不能很好的整合在一起,与后台交互的可扩展性也比较差。翻开element plus tree的源码,你会发现有很多的设计思路比较受限,实现的很繁琐。毕竟vue3给我们提供非常便利的Composition API,组件各部分功能的开发可以更好的进行模块化、数据响应式编程以及功能整合。 个人在尝试手撸Tree组件时,有深刻的体会,利用vue3提供的特性加上一些突破性的设计,在很好仿element tree实现各项功能的同时,代码量可以缩减到1/3。因此,个人觉得很有必要把自己的学习心得跟大家分享下。 Tree组件还在迭代开发中,本地保留了渐进式开发的练习代码:

添加图片注释,不超过 140 字(可选)

这种练习方式便于我回头整理和总结是如何从0实现一个较为完整的Tree组件的。如果大家关注和反馈比较热烈的话,打算出一套视频教程手把手演示如何一步步实现的。 软件

  • Node 18.18.2
  • NPM 9.8.1
  • VSCode 适合专业的前端
  • IntelliJ Idea 更适合以Java为后端的全栈开发人员,考虑到后续要开发后台做UI组件的交互,这里选该工具

技术栈

  • Vite 5.2.0
  • Vue 3.4.21
  • Typescript 5.4.5
  • Eslint 8.57.0
  • Prettier 3.2.5
  • TailWindcss 3.4.3
  • Sass 1.75.0
  • ...

这套基本的技术栈个人觉得最适合Vue3组件库的研发,同时组件的编写形式也将由传统的.vue单文件结构,切换到tsx的模板与脚本混合的自由模式。后续还会引入VitePress来实现组件示例的文档可视化。 项目结构

添加图片注释,不超过 140 字(可选)

迭代复盘

工程整合阶段

快速搭建Vite脚手架

安装全局工具:npm i -g vite。快速初始化一个整合好tsvue3工程,使用命令npm init vite,后续用交互式命令执行选项来创建。运行一个小而美的应用:

添加图片注释,不超过 140 字(可选)

回归最简配置

忘掉一切招式,一切从头开始,进行最简化配置,在这个基础上一点点叠加。编写一个最简单的.vue单文件的HelloWorld组件并应用一下:

添加图片注释,不超过 140 字(可选)

集成jsx vitejsx的集成非常简单,只要装一个插件并在vite.config.js中配置下即可。然后把组件的.vue文件改造成.jsx来实现,jsx的模板写法有点像早年Java后端jsp中混杂java脚本,模板渲染的写法更自由。练习:将前面的组件改写成jsx的实现方式,要求功能保持不变。 集成ts 在前一节基础上,完成vitets的整合。

  1. ts依赖以及和vue整合的tsc编译器依赖
  2. tsconfig相关的配置文件
  3. 改写jsjsx文件
  4. vitedev启动服务中增加tsc的编译命令 注意以下问题的修复:

添加图片注释,不超过 140 字(可选)

练习:试着将HelloWorld组件中字符串的msg改为一个包含info字符串的IMsg接口类型,并改造前面的示例

集成eslint和prettier

涉及的整合步骤列了一个大纲,可以照着去做

添加图片注释,不超过 140 字(可选)

踩坑:vite-plugin-eslint插件配置的ts编译问题

集成tailwindcss

方便组件样式的应用,大部分情况不用自己手写样式,复用tailwindcss的样式,提高开发和工程构建效率:

添加图片注释,不超过 140 字(可选)

练一练:试着为HelloWorld组件中的msg标题应用下tailwindcss样式

添加图片注释,不超过 140 字(可选)

Tree组件基础开发

扁平结构的处理和树渲染

本节目标:实现一个扁平结构的列表数据下Tree的页面渲染:

添加图片注释,不超过 140 字(可选)

难点:如何将原始嵌套结构的数据拍平为扁平化的数据

收益:

  1. 数组reduce方法在递归处理中的应用。
  2. tsxv-for的写法,注意key的绑定

树节点的展开与折叠交互

实现效果:

添加图片注释,不超过 140 字(可选)

开发要点:

  1. 节点类型的定义与扩展
  2. 扁平化函数改造:原始节点类型转扁平化节点类型
  3. 扁平化数据列表的动态渲染
  4. 使用refcomputed实现可见列表的响应式渲染
  5. 通过onClick交互事件改变节点的expanded属性来触发视图的更新,注意是局部更新

难点:

  1. 可见列表过滤的思路
  2. 如何确定一个扁平化节点下有多少个后代子元素,有没有更好的办法

计算属性在树结构中的妙用 该部分是本套教程的重点章节之一,也是后续Tree组件高级功能实现的基础。不使用计算属性,程序功能实现会变得越来越困难,且执行性能越来越低。 计算节点索引和后代节点长度 Tree很多功能实现需要定位当前索引的位置以及子节点,如果每次都手动遍历整个扁平数据列表,不但low而且性能不高。本节教你怎么在ts中实现响应式的数据计算属性。用了计算属性,它会缓存计算结果,当关注的数据发生变化才会重新计算,执行效率也提高了。 实现效果:

添加图片注释,不超过 140 字(可选)

这里显示了扁平化数据列表每个节点的索引,当节点个数发生改变,位置受影响的节点会重新计算(后续新增删除节点时会演示)。同时在控制台看到,子节点长度计算属性第一次触发后会缓存结果,数据没变化时不会重新计算。 思路和实现:略 实现参照线 在上一节基础上,继续扩展结构化节点计算属性,实现参照线长度计算属性,以便随着节点的展开折叠动态生成参照线的高度,看效果:

添加图片注释,不超过 140 字(可选)

绿色数字动态展示了父节点参照线的长度。 节点和参照线过渡动画 本节会对之前实现的生硬的折叠和展开效果增加动画修饰,会综合运用Vue对于节点渲染所支持的动画特性,包括:

  1. 过渡动画标签的使用
  2. 编写scss文件实现过渡动画样式控制
  3. 应用onBeforeEnteronEnter以及onLeave的动画钩子加dom样式操作,更精准的控制vue内层元素渲染的动画效果

实现难度在于,线的高度是动态计算出来的,且线的元素位于循环渲染的节点元素的内部,需要手动处理vue过渡动画失效的情况。 实现效果,过渡动画时间调大,方便看效果:

添加图片注释,不超过 140 字(可选)

svg图标组件的封装与使用

算是复习下.vue单文件组件的开发,整合iconfont的免费素材库js文件,通过自定义组件标签的形式来使用各个svg小图标。

我们用svg小图标替换掉原先

相关推荐

任天堂Switch OLED:一块沉浸屏,点燃全家欢乐的游戏时光

在一个寻常的周末午后,客厅里弥漫着轻松惬意的氛围。电视屏幕暂时休眠,全家人的目光却聚焦在那台轻巧的掌上设备——任天堂SwitchOLED。父母与孩子挤在沙发上,指尖在Joy-Con手柄上跃动,时而因...

Switch是什么地区的版本?怎么分辨Switch普通版和续航版、OLED版

Switch有国行、港版、日版、美版、欧版、韩版,版本之间又有普通版和续航版的OLED区别。只要看掌机的序列号第二三位,第二位代表的机型,A是普通版,K是续航版,T是OLED版。第三位代表的是区域,比...

这款Switch手柄真别致!开箱体验八位堂Lite蓝牙手柄

【引言】Hi大家好,我是歌布林,今天给大家带来一款八位堂Lite蓝牙手柄的开箱报告!相信已经有不少Switch玩家已经入手了这款产品,讲真,这款手柄的颜值真的吸引到我了~双十一旗舰各大快递公...

switch 的性能提升了 3 倍,我只用了这一招

上一篇《if快还是switch快?解密switch背后的秘密》我们测试了if和switch的性能,得出了要尽量使用switch的结论,因为他的效率比if高很多,具体原因点击上文查看。既...

在对《Nintendo Switch 运动》充满期待的同时,我也有些许不安

任天堂「运动」系列的最新作《NintendoSwitch运动》即将于4月29日正式发售。在等待本作发售的日子里,笔者每一天都在掰着指头计算发售日还有几天才到来。在《NintendoSwi...

switch上最值得玩的五款JRPG(switch最值得玩的大作)

不知道为什么即使现在节奏变得这么快,人也变得浮躁,我依旧喜欢玩JPRG,喜欢沉浸入游戏的角色之中体验一场独特的冒险。JRPG的灵魂是什么?那绝对不是回合制战斗或者古旧的系统,而是令人深刻的剧情及在这漫...

那个 Vue 的路由,路由是干什么用的?

在Vue里,路由就像“页面导航的指挥官”,专门负责管理页面(组件)的切换和显示逻辑。简单来说,它能让单页应用(SPA)像多页应用一样实现“不同URL对应不同页面”的效果,但整个过程不会刷新网页。一、路...

S235JRH材50x50x3-5mm欧标方管疲劳强度分析

在工程与建筑领域,方管作为一种重要的结构材料,广泛应用于各种框架和支撑结构中。S235JRH材质的50x50x3-5mm欧标方管在疲劳强度方面的表现尤其受到关注。本文将以“解答常见误区”的形式,分析该...

纤维丛上的联络与曲率关系之二:七个联络

参阅一文看懂纤维丛(看图说话)纤维丛上的联络与曲率关系之一1.仿射联络(AffineConnection)定义:在光滑流形M的切丛TM上,一个仿射联络是一个双线性映射:仿射联络定义了向量...

安全完整性等级(SIL)分析报告编制与认证实践方法

以下是一篇关于安全完整性等级(SIL)分析报告的文章,涵盖SIL定级方法、验证流程、计算模型及工程实践。安全完整性等级(SIL)是量化安全仪表系统(SIS)性能的核心指标,由IEC61508/615...

欧标方管75x75x3mm8mm S355J0H力学性能测试

欧标方管75x75x3mmS355J0H是一种常见的钢管材料,广泛应用于建筑、机械制造和结构工程等领域。下面将对其力学性能进行详细测试和分析。1.材料概述S355J0H是欧洲标准EN10210中规定的...

p光与s光在SHG中的相位匹配中有哪些不同?

【第六期】p光与s光在SHG中的相位匹配中有哪些不同?在二次谐波生成(SHG)中,p偏振光和s偏振光的相位匹配条件存在显著差异。这些差异主要源于它们与纳米结构相互作用的方式以及它们在激发表面等离子体共...

S355JRH欧标方管机械性能及工程应用解析

S355JRH欧标方管是一种高强度钢管,以其优良的机械性能和良好的加工性在工程领域得到广泛应用。本文将从机械性能、场景应用等方面对S355JRH欧标方管进行解析,以帮助读者更好地理解其特性及应用。1....

《三国志·战棋版》PK7黄天蔽汉,四队共存作业来啦!

哈喽大家好啊,今天要给大家分享的是三棋PK7黄天蔽汉平时四队共存队,这只是其中一种选择供大家参考,后面可能还会分享其他的四队共存方案。队伍共存绝不唯一,大家有什么好的共存方案或者想看哪些队伍的共存也欢...

迈阿密三大巨星首秀被0-0逼平,豪阵为何难赢开罗国民

谁能想到,汇聚梅西、苏亚雷斯、布斯克茨这“银河战舰”级别三巨头,迈阿密国际世俱杯首秀居然0-0被埃及劲旅开罗国民逼平?全场90分钟,球迷的心情从“期待冠军”一路跌到“差点开门黑”。补时第96分钟,梅西...