巧用Vue3 composition api的计算属性实现扁平化tree连线

本示例节选自vue3最新开源组件实战教程大纲(持续更新中)的tree组件开发部分。将进一步把基于Vue3 composition api的computed计算属性特性应用到组件开发实战中,继续以最佳实践的方式呈现给大家。

下面我们要实现的是扁平化的dom结构所呈现的树形组件增加参照线的功能。

这种结构不同于传统嵌套dom实现的树作参照线那么简单,需要动态计算线的长度,正好我们可以充分应用vue3给我们提供的composition api的计算属性computed。一切都变得非常简单,Life is so easy!

节点属性

新增节点属性

ts 复制代码
export interface ITreeNode {
  ...
  visibleLength?: ComputedRef<number> // 展开可见的节点长度
  lineLength?: ComputedRef<number> // 节点参照线的长度
}

计算属性

核心的初始化方法

ts 复制代码
function initParentNode(node: ITreeNode, optionProps: OptionProps) {
  const nodeRef = ref<ITreeNode>(node)
  const childrenName = optionProps.childrenName as 'children'
  // 可见节点长度计算属性
  node.visibleLength = computed(() => {
    // 如果不是展开的返回0
    if (!nodeRef.value.expanded) return 0
    // 遍历原始树结构的子节点列表,判断如果是父节点,则继续递归调用其visibleLength计算属性
    // 通过reduce实现累加
    return nodeRef.value[childrenName]!.reduce((count, cur) => count + (cur[childrenName] ? (cur.expanded ? 1 + cur.visibleLength! : 1) : 1), 0)
  })
  // 计算父节点的参照线长度
  node.lineLength = computed(() => {
    // 如果是折叠的直接返回0
    if (!nodeRef.value.expanded) return 0
    // 否则用可见长度 - 子一代最后一个节点的可见长度
    const children = nodeRef.value[childrenName]
    const lastChild = children![children!.length - 1]
    return nodeRef.value.visibleLength! - (lastChild.visibleLength || 0)
  })
}

在拍平函数中调用父节点初始化函数:

组件完善

模板完善

试着打印父节点的参照线长度

看下效果:

展开、折叠,参照线并不会动态变化。修复下:

再看效果,删除节点测试还有问题:

修复下:

完美!

相关推荐
会功夫的李白17 小时前
uniapp自动构建pages.json的vite插件
前端·uni-app·vite
零凌林2 天前
使用exceljs将excel文件转化为html预览最佳实践(完整源码)
前端·html·excel·vue3·最佳实践·文件预览·exceljs
岁岁岁平安3 天前
Vue3学习(组合式API——reactive()和ref()函数详解)
前端·javascript·vue.js·学习·vue3·reactive·ref
三天不学习3 天前
Vue3 本地环境 Vite 与生产环境 Nginx 反向代理配置方法汇总【反向代理篇】
运维·nginx·vue3·vite·反向代理
岁岁岁平安4 天前
Vue3学习(组合式API——计算属性computed详解)
前端·javascript·vue.js·学习·computed·计算属性
小张快跑。6 天前
【Vue3】使用vite创建Vue3工程、Vue3基本语法讲解
前端·前端框架·vue3·vite
halo141610 天前
vue中scss使用js的变量
javascript·vue3·scss
緑水長流*z10 天前
(14)Element Plus项目综合案例
vue.js·elementui·vue3·element plus·elementplus项目·完整项目案例·项目学习笔记
A-刘晨阳10 天前
Algolia - Docsearch的申请配置安装【以踩坑解决版】
vue3·ts·vuepress·algolia·docsearch
我是哈哈hh11 天前
【Vue】全局事件总线 & TodoList 事件总线
前端·javascript·vue.js·vue3·vue2