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

Vue3+TSX手撸Element Tree升级版

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

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小图标替换掉原先

相关推荐

炫酷的计时器效果Canvas绘图与动画

-----------------------------------------华丽的分割线-----------------------------------------------------...

康托尔集合的绘制及其Python绘制(康托尔集合论的概括原则是什么)

康托尔三分集(Cantorternaryset)是数学中一个著名的分形例子,由德国数学家格奥尔格·康托尔在1883年引入。它通过不断去掉线段的中间三分之一部分,重复这个过程得到的一个分形集合。康托...

一文带你搞懂JS实现压缩图片(js 压缩图片)

作者:wuwhs转发链接:https://segmentfault.com/a/1190000023486410前言公司的移动端业务需要在用户上传图片是由前端压缩图片大小,再上传到服务器,这样可以减...

数据可视化—Echarts图表应用(数据可视化图表类型)

ECharts是一款由百度前端技术部开发的,基于Javascript的数据可视化图表库,提供直观,生动,可交互,可个性化定制的数据可视化图表。使用JavaScript实现开源的可视化库,可以流畅的...

ThreeJS中三维世界坐标转换成二维屏幕坐标

Threejs全称是“Javascript3Dlibrary”。WebGL则是openGL在浏览器上的一个实现。Threejs对WebGL进行了封装,让前端开发人员在不需要掌握很多数学知识和绘图知...

鸿蒙开源第三方件组件——加载动画库

前言基于安卓平台的加载动画库AVLoadingIndicatorView(https://github.com/81813780/AVLoadingIndicatorView),实现了鸿蒙化迁移和重构...

canvas实现下雪背景图(canvas绘制背景图)

canvas下雪背景html+css+js实现:1.定义标签:<h1>北极光之夜。</h1><divclass="bg"></...

用canvas画简单的“我的世界”人物头像

前言:花了4天半终于看完了《HeadFirstHTML5》,这本书的学习给我最大的感受就是,自己知识的浅薄,还有非常多非常棒的技术在等着我呢。[熊本表情]扶朕起来,朕还能学!H5新增标签里面最喜欢...

Manim-基础图形之点(什么叫图形基点)

制作数学演示视频时需要用到各类的集合图形,manim中内置了一些列的图形,本篇就从最简单的点讲起。点作为manim中最简单图形,也是其他所有图形的基,所有图形的绘制都是靠点来定位。manim中的点主...

一起学 WebGL:坐标系(坐标系格式)

大家好,我是前端西瓜哥,今天我们来学习WebGL。WebGL的世界坐标系是三维的。默认使用笛卡尔坐标系的右手坐标系,满足右手定则,即x轴向右,y轴向上,z轴向着观察者,原点位于画布中心。然...

漫画 欣赏 - 聖鬥士星矢 THE.LOST.CANVAS 冥王神話 24

《圣斗士星矢THELOSTCANVAS冥王神话》改编自车田正美原作的漫画《圣斗士星矢》,由车田正美原作、手代木史织作画。其外传《圣斗士星矢THELOSTCANVAS冥王神话外传》则在《...

漫画 欣赏 - 聖鬥士星矢 THE.LOST.CANVAS 冥王神話 25 - 完结篇

《圣斗士星矢THELOSTCANVAS冥王神话》改编自车田正美原作的漫画《圣斗士星矢》,由车田正美原作、手代木史织作画。其外传《圣斗士星矢THELOSTCANVAS冥王神话外传》则在《...

Eric Fischl 名画录(eric tucker画家)

艾瑞克费舍尔(EricFischl,1948——),是美国新表现主义画家,当代国际画坛一位十分活跃的人物,在国际上享有很高的知名度。作为20世纪美国第6次经济衰退时期本土第一个伟大画家艾瑞克·费舍尔...

canvas绘画板的实现(canvas画布)

新项目有一个需求:客户需要在订单确认的时候签名。第一反应就是用html的canvas实现,同事一起商量了下,canvas有三个制约:canvas必须要用鼠标,签名会很难看;手机端webapp怎么实现...

Python程序开发之简单小程序实例(9)利用Canvas绘制图形和文字

Python程序开发之简单小程序实例(9)利用Canvas绘制图形和文字一、项目功能利用Tkinter组件中的Canvas绘制图形和文字。二、项目分析要在窗体中绘制图形和文字,需先导入Tkinter组...